{"id":48198,"date":"2023-05-04T12:45:04","date_gmt":"2022-11-23T07:09:53","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/"},"modified":"2024-04-30T02:35:09","modified_gmt":"2024-04-29T18:35:09","slug":"%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883"},"content":{"rendered":"<h2>\u6982\u8ff0<\/h2>\n<p>\u4f60\u597d\uff0c\u6211\u662f\u67ef\u9ea6\uff0c\u6700\u8fd1\u5728\u4e1c\u4eac\u62c5\u4efb\u524d\u7aef\u5de5\u7a0b\u5e08\u3002\u6211\u5bf9\u5728AWS\u7684re:Invent\u4e0a\u53d1\u5e03\u7684AWS Amplify DataStore\u611f\u5230\u975e\u5e38\u9707\u60ca\u548c\u65b9\u4fbf\uff0c\u4ee5\u524d\u4e3b\u8981\u5728Vue\u548cNuxt\u4e0a\u5f00\u53d1\uff0c\u5bf9React\u548cNext\u7684\u5f00\u53d1\u7ecf\u9a8c\u8f83\u5c11\uff0c\u4e5f\u5728\u5bfb\u627e\u4e00\u4e9b\u53ef\u4ee5\u7528Typescript\u5b8c\u6210\u7684\u4e1c\u897f\u3002<\/p>\n<p>\u6700\u8fd1\uff0cAWS\u63a8\u51fa\u4e86\u4e00\u9879\u540d\u4e3aAmplify\u7684\u670d\u52a1\uff0c\u7c7b\u4f3c\u4e8eAWS\u7248\u7684Firebase\uff0c\u5b83\u96c6\u6210\u4e86\u7528\u4e8e\u79fb\u52a8\u5f00\u53d1\u7684AWS\u670d\u52a1\u3002\u770b\u4e86\u4e00\u4e0b\u5185\u5bb9\uff0c\u611f\u89c9\u53ef\u4ee5\u7528\u5b83\u6765\u5feb\u901f\u5f00\u53d1\u65e0\u670d\u52a1\u5668\u5e94\u7528\u3002\u4e8e\u662f\u6211\u8bd5\u7740\u7528Next.js + Amplify\u6765\u5236\u4f5c\u4e86\u4e00\u4e2aTodo\u5e94\u7528\u7a0b\u5e8f\u3002\u867d\u7136\u5e02\u9762\u4e0a\u6709\u5f88\u591a\u5173\u4e8eNuxt.js + Firebase\u7ec4\u5408\u7684\u6587\u7ae0\uff0c\u4f46\u6211\u4e5f\u6210\u529f\u5730\u7528\u8fd9\u79cd\u67b6\u6784\u5b9e\u73b0\u4e86\uff0c\u5e76\u4e14\u628a\u65b9\u6cd5\u6574\u7406\u6210\u4e86\u4f53\u7cfb\u5316\u7684\u63cf\u8ff0\u3002<\/p>\n<p>\u5e0c\u671b\u80fd\u5e2e\u52a9\u4f60\u66f4\u597d\u5730\u7406\u89e3Next + Amplify\u7684\u5f00\u53d1\uff0c\u5e0c\u671b\u4f60\u80fd\u8bfb\u5230\u6700\u540e\uff0c\u8c22\u8c22\uff01<\/p>\n<h3>Next.js\u662f\u4ec0\u4e48\uff1f<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/3-0.png\" alt=\"top_next.png\" \/><\/div>\n<p>\u8fd9\u4e2a\u53ef\u80fd\u4e0d\u9700\u8981\u89e3\u91ca\uff0cZEIT\u516c\u53f8\u5f00\u53d1\u7684React\u6846\u67b6\u53ef\u4ee5\u6784\u5efa\u652f\u6301\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u7684web\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>pages\u76ee\u5f55\u4e0b\u7684\u81ea\u52a8\u8def\u7531\u3001\u52a8\u6001\u8def\u7531\uff0c\u4ee5\u53ca\u4eceSPA\/SSR\u5f00\u59cb\u7684\u9759\u6001\u7f51\u7ad9\u751f\u6210\u5e94\u7528\uff0c\u5f53\u7136\u8fd8\u5305\u62ec\u6700\u8fd1\u7684\u96f6\u914d\u7f6eTypeScript\u652f\u6301\u3001AMP\u9002\u914d\u3001\u901a\u8fc7api\u76ee\u5f55\u5b9e\u73b0api\u7b49\u529f\u80fd\uff0c\u5927\u5927\u63d0\u5347\u4e86\u5f00\u53d1\u4f53\u9a8c\u3002\u5f53\u7136\uff0c\u7531\u4e8e\u5176\u7b80\u5355\u6613\u7528\u7684\u7279\u70b9\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u8f7b\u677e\u5f15\u5165\u5e76\u663e\u8457\u63d0\u9ad8\u5f00\u53d1\u901f\u5ea6\u3002<\/p>\n<h3>AWS Amplify\u662f\u4ec0\u4e48\uff1f<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/7-0.png\" alt=\"top_amplify.png\" \/><\/div>\n<p>AWS Amplify\u662f\u4e00\u79cd\u57fa\u4e8eAWS\u670d\u52a1\u7684mBaas\uff0c\u5b83\u53ef\u4ee5\u6781\u5927\u5730\u7b80\u5316Web\u5e94\u7528\u7a0b\u5e8f\u7684\u521b\u5efa\u3001\u914d\u7f6e\u548c\u5f00\u53d1\uff0c\u5e76\u4e14\u7531\u4e8e\u53ef\u6269\u5c55\u6027\u5f3a\uff0c\u53ef\u4ee5\u6839\u636e\u670d\u52a1\u89c4\u6a21\u81ea\u52a8\u6269\u5c55\u3002\u7c7b\u4f3c\u7684\u670d\u52a1\u8fd8\u6709\u8c37\u6b4c\u7684Firebase\u3002\u5373\u4f7f\u4e0d\u9700\u8981\u81ea\u5df1\u51c6\u5907\u540e\u7aef\u8d44\u6e90\uff0cAmplify\u547d\u4ee4\u4e5f\u53ef\u4ee5\u4e3a\u60a8\u51c6\u5907\u6240\u9700\u7684\u6e90\u4ee3\u7801\u548c\u6a21\u578b\u7b49\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u60a8\u9700\u8981\u81ea\u884c\u5904\u7406\u914d\u7f6e\u3001\u4f9b\u5e94\u548c\u5206\u6790\u7b49\u3002\u4f46\u9009\u62e9\u4e86Amplify\u540e\uff0c\u5b83\u5c06\u4e3a\u60a8\u7ba1\u7406\u8fd9\u4e9b\u4e8b\u9879\u3002\u6839\u636e\u9700\u6c42\uff0cAmplify\u53ef\u4ee5\u5c06\u8eab\u4efd\u9a8c\u8bc1\u3001\u79bb\u7ebf\u6570\u636e\u3001\u5206\u6790\u3001\u63a8\u9001\u901a\u77e5\u3001AR\/VR\u3001\u673a\u5668\u4eba\u7b49\u96c6\u6210\u5230\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684AWS\u670d\u52a1\u4e2d\u3002<\/p>\n<h3>Next.js + Amplify\u6709\u4ec0\u4e48\u4ee4\u4eba\u9ad8\u5174\u7684\u5730\u65b9\uff1f<\/h3>\n<h4>\u521d\u671f\u5f00\u53d1\u901f\u5ea6\u7684\u7206\u70b8\u6027\u52a0\u5feb<\/h4>\n<p>\u8fd1\u6765\uff0c\u5e02\u573a\u53d8\u5316\u975e\u5e38\u5feb\uff0c\u7528\u6237\u9700\u6c42\u4e5f\u5728\u5feb\u901f\u53d8\u5316\u3002\u4e0e\u6b64\u540c\u65f6\uff0c\u5728\u670d\u52a1\u548c\u4ea7\u54c1\u7684\u7528\u6237\u4f53\u9a8c\u65b9\u9762\uff0c\u6211\u4eec\u5f88\u96be\u786e\u5b9a\u4ec0\u4e48\u662f\u9002\u5f53\u7684\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u4e1a\u52a1\u65b9\u548c\u5f00\u53d1\u65b9\u5fc5\u987b\u5171\u540c\u8ba4\u8bc6\u5230\u7684\u4e00\u70b9\u662f\uff0c\u9700\u8981\u5feb\u901f\u8fdb\u884c\u5047\u8bbe\u9a8c\u8bc1\uff0c\u5e76\u5c06\u53cd\u9988\u8f6c\u5316\u4e3a\u7528\u6237\u4f53\u9a8c\u3002\u6211\u5199\u4e86\u4e00\u7bc7\u5173\u4e8e\u5728DX\u65f6\u4ee3\u53ca\u5176\u672a\u6765\u638c\u63e1\u201c\u7528\u6237\u4f53\u9a8c\u201d\u57fa\u7840\u7684\u6587\u7ae0\uff0c\u6307\u51fa\u4e0d\u4ec5\u5728\u670d\u52a1\u4e0a\u7ebf\u65f6\u9700\u8981\u6ce8\u610f\uff0c\u9a8c\u8bc1\u8be5\u8fc7\u7a0b\u4e5f\u9700\u8981\u4fdd\u6301\u5feb\u901f\u3002\u56e0\u6b64\uff0c\u5728\u6280\u672f\u9009\u62e9\u548c\u67b6\u6784\u65b9\u9762\u53ef\u80fd\u4f1a\u6709\u56f0\u60d1\uff0c\u4f46\u4ece\u5982\u4f55\u5feb\u901f\u5b9e\u73b0\u793e\u4f1a\u5b9e\u65bd\u7684\u89c2\u70b9\u6765\u770b\uff0c\u8fd9\u672c\u8eab\u5c31\u662f\u4e00\u4e2a\u5e94\u8be5\u5c3d\u5feb\u89e3\u51b3\u7684\u95ee\u9898\u3002\u5f53\u7136\uff0c\u8fd9\u5e76\u4e0d\u662f\u5e94\u8be5\u8f7b\u89c6\u7684\u95ee\u9898\u3002<\/p>\n<p>\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u8ba4\u4e3aNext.js + Amplify\u7684\u7ec4\u5408\u53ef\u4ee5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u4e0e\u81ea\u884c\u8bbe\u8ba1\u5e76\u9009\u62e9AWS\u670d\u52a1\u8fdb\u884c\u6784\u5efa\u76f8\u6bd4\uff0c\u8fd9\u4e24\u8005\u7684\u73af\u5883\u8bbe\u7f6e\u6240\u9700\u7684\u65f6\u95f4\u66f4\u77ed\uff0c\u53ef\u4ee5\u7acb\u5373\u5728\u672c\u5730\u4e3b\u673a\u4e0a\u8fdb\u884c\u786e\u8ba4\uff0c\u5e76\u5728\u9700\u8981\u65f6\u63d0\u4f9b\u540e\u7aef\u670d\u52a1\u3002<\/p>\n<h4>\u5b9a\u7fa9\u4e86\u5408\u9002\u7684\u7c7b\u578b\u548c\u6a21\u578b\u4e4b\u540e\uff0c\u81ea\u52a8\u7f29\u653e\u3002<\/h4>\n<p>\u5728Next.js\u4e2d\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u96f6\u914d\u7f6e\u6765\u8fd0\u884cTypescript\uff0c\u5e76\u4e14\u5728Amplify\u4e2d\u5305\u542b\u4e86\u540d\u4e3aAppSync\u7684\u670d\u52a1\uff0c\u7528\u4e8e\u5728Graphql\u4e2d\u8fdb\u884c\u6570\u636e\u4ea4\u6362\u3002\u56e0\u6b64\uff0c\u5b83\u4f1a\u4e3a\u60a8\u5b9a\u4e49\u6240\u9700\u6570\u636e\u7684\u7c7b\u578b\uff0c\u4f7f\u5f97\u5728\u524d\u7aef\u548c\u540e\u7aef\u4e4b\u95f4\u5171\u4eab\u7c7b\u578b\u53d8\u5f97\u66f4\u52a0\u5bb9\u6613\u3002<\/p>\n<p>\u4e0e\u6846\u67b6\u76f8\u6bd4\uff0c\u628a\u63e1\u6700\u91cd\u8981\u7684\u4e1a\u52a1\u89c4\u5219\u6bd4\u4ec0\u4e48\u6846\u67b6\u66f4\u91cd\u8981\uff0c\u4e00\u65e6\u5b9a\u4e49\u4e86\u8fd9\u4e9b\u89c4\u5219\uff0c\u5c31\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u8fdb\u884c\u81ea\u52a8\u7f29\u653e\uff0c\u4ece\u800c\u786e\u4fdd\u6570\u636e\u7684\u5b8c\u6574\u6027\u5e76\u6839\u636e\u9700\u8981\u8fdb\u884c\u8c03\u6574\u3002<\/p>\n<h2>Next.js\u7684\u914d\u7f6e<\/h2>\n<p>\u6211\u5011\u99ac\u4e0a\u958b\u59cb\u9032\u884cNext.js\u7684\u8a2d\u7f6e\u3002<\/p>\n<h3>\u76ee\u5f55\u7ed3\u6784<\/h3>\n<p>\u6700\u7ec8\u7684\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\u6240\u793a\u3002\u5b9e\u9645\u7684\u76ee\u5f55\u4e2d\u53ea\u5217\u51fa\u4e86\u5fc5\u8981\u7684\u90e8\u5206\uff0c\u5982\u679c\u60a8\u60f3\u67e5\u770b\u6240\u6709\u6587\u4ef6\uff0c\u8bf7\u5728GitHub\u4e0a\u51c6\u5907\u597d\u4ee3\u7801\u5e76\u53c2\u8003\u3002\u6709\u5173amplify\u548cgraphql\u76ee\u5f55\uff0c\u5c06\u5728\u540e\u7eed\u7684AWS Amplify\u8bbe\u7f6e\u4e2d\u81ea\u52a8\u751f\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code>\u251c\u2500 amplify\r\n\u2502\u00a0 \u251c\u2500 #current-cloud-backend\r\n\u2502\u00a0 \u2502\u00a0 \u251c\u2500 amplify-meta.json\r\n\u2502\u00a0 \u2502\u00a0 \u251c\u2500 api\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0\u00a0\u2514 todo\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 build\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 parameters.json\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 resolvers\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 schema.graphql\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 stacks\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0\u00a0 \u2514\u2500 transform.conf.json\r\n\u2502\u00a0 \u2502\u00a0\u00a0\u2514\u2500 backend-config.json\r\n\u2502\u00a0 \u251c\u2500 backend\r\n\u2502\u00a0 \u2502\u00a0 \u251c\u2500 amplify-meta.json\r\n\u2502\u00a0 \u2502\u00a0 \u251c\u2500 api\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0\u00a0\u2514 todo\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 build\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 parameters.json\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 resolvers\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 schema.graphql\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0  \u251c\u2500 stacks\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0\u00a0 \u2514\u2500 transform.conf.json\r\n\u2502\u00a0 \u2502\u00a0 \u251c\u2500 awscloudformation\r\n\u2502\u00a0 \u2502\u00a0 \u2502\u00a0\u00a0\u2514 nested-cloudformation-stack.yml\r\n\u2502\u00a0 \u2502\u00a0 \u2514\u2500 backend-config.json\r\n\u2502\u00a0 \u2514\u2500 team-provider-info.json\r\n\u251c\u2500graphql\/\r\n\u2502 \u251c\u2500queries.ts\r\n\u2502 \u251c\u2500mutations.ts\r\n\u2502 \u251c\u2500subscriptions.ts\r\n\u2502 \u2514\u2500schema.json\r\n\u251c\u2500pages\/\r\n\u2502 \u251c\u2500index.tsx\r\n\u2502 \u2514\u2500todo.tsx\r\n\u251c\u2500components\/\r\n\u2502 \u2514\u2500templates\/\r\n\u2502   \u251c\u2500head.tsx\r\n\u2502   \u2514\u2500navigation.tsx\r\n\u251c\u2500store\/\r\n\u251c\u2500aws-exports.js\r\n\u251c\u2500package.json\r\n\u251c\u2500.gitignore\r\n\u251c\u2500next.config.js\r\n\u251c\u2500next-env.d.ts\r\n\u2514\u2500tsconfig.json\r\n<\/code><\/pre>\n<h3>\u5b89\u88c5\u5fc5\u8981\u7684\u6a21\u5757\u5e76\u7f16\u8f91package.json<\/h3>\n<p>\u5f53\u5de5\u4f5c\u76ee\u5f55\u5efa\u7acb\u597d\u540e\uff0c\u6211\u4eec\u7528\u4ee5\u4e0b\u547d\u4ee4\u6765\u51c6\u5907\u6240\u9700\u7684\u6a21\u5757\u3002<\/p>\n<pre class=\"post-pre\"><code>npm install --save react react-dom next\r\nnpm install --save-dev @types\/node @types\/react\r\n<\/code><\/pre>\n<p>\u5728\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u9700\u8981\u5c06package.json\u4e2d\u7684scripts\u7f16\u8f91\u4e3a\u4ee5\u4e0b\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nl\">\"scripts\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"dev\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"next\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"build\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"next build\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"start\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"next start\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u51c6\u5907\u5404\u79cd\u7ec4\u4ef6<\/h3>\n<p>\u5728\u8fd9\u91cc\u6211\u4eec\u5c06\u5b9a\u4e49\u5171\u540c\u4f7f\u7528\u7684\u7ec4\u4ef6\u3002\u6211\u4eec\u5c06\u51c6\u5907\u5bfc\u822a\u548c\u5934\u90e8\u7ec4\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Link<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">next\/link<\/span><span class=\"dl\">'<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Navigation<\/span><span class=\"p\">:<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">FC<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Link<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/\"<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>Index<span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Link<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Link<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/about\"<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>About<span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Link<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Link<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/todo\"<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>Todo<span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Link<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">Navigation<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u8bf7\u6839\u636e\u60a8\u7684\u559c\u597d\u8bbe\u7f6e\u5934\u90e8\u7528\u7684\u7ec4\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Head<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">next\/head<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">info<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/..\/package.json<\/span><span class=\"dl\">'<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">defaultOGURL<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">''<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">defaultOGImage<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">''<\/span>\r\n\r\n<span class=\"kr\">interface<\/span> <span class=\"nx\">Props<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">description<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">url<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">ogImage<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">head<\/span><span class=\"p\">:<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">FC<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Props<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">props<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nc\">Head<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">charSet<\/span><span class=\"p\">=<\/span><span class=\"s\">\"UTF-8\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">title<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span> <span class=\"o\">||<\/span> <span class=\"dl\">''<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">title<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"description\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">info<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"viewport\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"s\">\"width=device-width, initial-scale=1\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">property<\/span><span class=\"p\">=<\/span><span class=\"s\">\"og:url\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">url<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">defaultOGURL<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">property<\/span><span class=\"p\">=<\/span><span class=\"s\">\"og:title\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span> <span class=\"o\">||<\/span> <span class=\"dl\">''<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span>\r\n        <span class=\"na\">property<\/span><span class=\"p\">=<\/span><span class=\"s\">\"og:description\"<\/span>\r\n        <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">info<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"si\">}<\/span>\r\n      <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"twitter:site\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">url<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">defaultOGURL<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"twitter:card\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"s\">\"summary_large_image\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"twitter:image\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">ogImage<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">defaultOGImage<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">property<\/span><span class=\"p\">=<\/span><span class=\"s\">\"og:image\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">ogImage<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">defaultOGImage<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">property<\/span><span class=\"p\">=<\/span><span class=\"s\">\"og:image:width\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"s\">\"1200\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">meta<\/span> <span class=\"na\">property<\/span><span class=\"p\">=<\/span><span class=\"s\">\"og:image:height\"<\/span> <span class=\"na\">content<\/span><span class=\"p\">=<\/span><span class=\"s\">\"630\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">link<\/span> <span class=\"na\">rel<\/span><span class=\"p\">=<\/span><span class=\"s\">\"icon\"<\/span> <span class=\"na\">sizes<\/span><span class=\"p\">=<\/span><span class=\"s\">\"192x192\"<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/static\/touch-icon.png\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">link<\/span> <span class=\"na\">rel<\/span><span class=\"p\">=<\/span><span class=\"s\">\"apple-touch-icon\"<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/static\/touch-icon.png\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">link<\/span> <span class=\"na\">rel<\/span><span class=\"p\">=<\/span><span class=\"s\">\"mask-icon\"<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/static\/favicon-mask.svg\"<\/span> <span class=\"na\">color<\/span><span class=\"p\">=<\/span><span class=\"s\">\"#49B882\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">link<\/span> <span class=\"na\">rel<\/span><span class=\"p\">=<\/span><span class=\"s\">\"icon\"<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/static\/favicon.ico\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n  <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Head<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">)<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">head<\/span>\r\n<\/code><\/pre>\n<h3>\u51c6\u5907Pages<\/h3>\n<p>\u63a5\u4e0b\u6765\u662f\u5bf9 pages \u7ec4\u4ef6\u8fdb\u884c\u51c6\u5907\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Head<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/components\/templates\/head<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Navigation<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/components\/templates\/navigation<\/span><span class=\"dl\">'<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Index<\/span><span class=\"p\">:<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">FC<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Head<\/span> <span class=\"na\">title<\/span><span class=\"p\">=<\/span><span class=\"s\">\"Index page\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Navigation<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>Hello world<span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>Index<span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">Index<\/span>\r\n\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>\r\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Head<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/components\/templates\/head<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Navigation<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/components\/templates\/navigation<\/span><span class=\"dl\">'<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Todo<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Head<\/span> <span class=\"na\">title<\/span><span class=\"p\">=<\/span><span class=\"s\">\"todo\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Navigation<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">h2<\/span><span class=\"p\">&gt;<\/span>Todo with amplify<span class=\"p\">&lt;\/<\/span><span class=\"nt\">h2<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">)<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">Todo<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u73b0\u5728\u8fd0\u884c npm run dev \u547d\u4ee4\uff0c\u5e76\u5c1d\u8bd5\u8bbf\u95ee http:\/\/localhost:3000\/\u3002\u5982\u679c\u663e\u793a\u4ee5\u4e0b\u7c7b\u4f3c\u7684\u9875\u9762\uff0c\u5219\u8868\u793a\u6210\u529f\u3002\u540c\u65f6\uff0c\u8bd5\u8bd5\u8bbf\u95ee \/todo\uff0c\u770b\u770b\u662f\u5426\u663e\u793a\u4e86 todo \u9875\u9762\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/35-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-15 18.17.02.png\" \/><\/div>\n<p>Next.js\u7684\u51c6\u5907\u5de5\u4f5c\u5df2\u7ecf\u8d85\u8fc7\u4e86\u4e00\u6b21\u3002<\/p>\n<h2>\u5728\u4e2d\u56fd\uff0c\u53ea\u9700\u8981\u4e00\u4e2a\u9009\u9879\uff0c\u5c06\u4ee5\u4e0b\u5185\u5bb9\u7ffb\u8bd1\u6210\u4e2d\u6587\u5373\u53ef\uff1a<\/h2>\n<p>\u8bbe\u7f6e AWS Amplify\u3002<\/p>\n<h3>Amplify\u7684\u5b89\u88c5\u548c\u521d\u59cb\u8bbe\u7f6e<\/h3>\n<p>\u65e0\u8bba\u5982\u4f55\uff0c\u6211\u4eec\u8981\u8fdb\u884camplify\/cli\u7684\u5168\u5c40\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> @aws-amplify\/cli\r\n<\/code><\/pre>\n<p>\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u8bf7\u4f7f\u7528amplify -v\u547d\u4ee4\u9a8c\u8bc1\u7248\u672c\u3002\u5982\u679c\u663e\u793a\u5982\u4e0b\u5185\u5bb9\uff0c\u5219\u8868\u793a\u5b89\u88c5\u5df2\u5b8c\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code>Scanning for plugins...\r\nPlugin scan successful\r\n3.17.0\r\n<\/code><\/pre>\n<p>\u4e0b\u4e00\u6b65\uff0c\u5c06\u8fdb\u884cAWS\u8d26\u6237\u7684\u5173\u8054\u3002\u8bf7\u5728\u63a7\u5236\u53f0\u4e0a\u8fdb\u884c\u64cd\u4f5c\u3002<\/p>\n<pre class=\"post-pre\"><code>amplify configure\r\n<\/code><\/pre>\n<p>\u6253\u5f00\u7ec8\u7aef\u5e76\u8fd0\u884c\u201cyarn start\u201d\u547d\u4ee4\uff0c\u5c06\u4f1a\u542f\u52a8\u6d4f\u89c8\u5668\u4ee5\u521b\u5efaIAM\u7528\u6237\u3002\u5982\u679c\u5df2\u6709\u8d26\u6237\uff0c\u8bf7\u767b\u5f55\uff1b\u5982\u679c\u6ca1\u6709\uff0c\u5219\u521b\u5efa\u4e00\u4e2a\u65b0\u8d26\u6237\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/46-0.png\" alt=\"aws_account.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/47-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-11-09 3.09.57.png\" \/><\/div>\n<p>\u5c06accessKeyId\u548csecretAccessKeyId\u6309\u987a\u5e8f\u7c98\u8d34\u5230IAM\u7528\u6237\u521b\u5efa\u9875\u9762\u4e0a\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/49-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-15 18.37.54.png\" \/><\/div>\n<p>\u5f53\u4f60\u8fdb\u5165IAM\u7528\u6237\u521b\u5efa\u9875\u9762\u5e76\u8fdb\u884c\u64cd\u4f5c\u65f6\uff0c\u4f1a\u663e\u793a\u8bbf\u95ee\u5bc6\u94a5ID\u3002\u5c06\u5176\u590d\u5236\u5230\u63a7\u5236\u53f0\u4e2d\uff0c\u5e76\u6309\u4e0bEnter\u952e\u3002\u7136\u540e\u786e\u5b9a\u914d\u7f6e\u6587\u4ef6\u540d\u79f0\uff0c\u6309\u4e0bEnter\u952e\u540e\uff0c\u5c06\u4f1a\u51fa\u73b0&#8221;\u6210\u529f\u8bbe\u7f6e\u65b0\u7528\u6237&#8221;\u7684\u6d88\u606f\uff0c\u8868\u793a\u5b8c\u6210\u3002<\/p>\n<h3>\u4f7f\u9879\u76ee\u53ef\u4ee5\u5904\u7406Amplify\u3002<\/h3>\n<p>\u6211\u5c06\u9010\u6b65\u89e3\u91ca\u5982\u4f55\u5728\u5b9e\u9645\u4e2d\u4f7f\u7528Next.js\u548camplify\u3002\u4e3a\u4e86\u80fd\u591f\u5904\u7406amplify\u540e\u7aef\u7684\u5404\u79cd\u670d\u52a1\uff0c\u6211\u4eec\u5c06\u5728\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u521b\u5efa\u5404\u79cd\u8d44\u6e90\u3002\u8bf7\u5c1d\u8bd5\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code>amplify init\r\n<\/code><\/pre>\n<p>\u6211\u4eec\u5c06\u4ee5\u4e92\u52a8\u5f62\u5f0f\u8fdb\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a\u9009\u62e9\u8bed\u8a00\u3001\u6846\u67b6\u548c\u76ee\u5f55\u4fe1\u606f\u7b49\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/55-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-11-09 3.47.46.png\" \/><\/div>\n<p>\u5728\u4e91\u7aef\u521d\u59cb\u5316\u9879\u76ee&#8230;\u5f53\u51fa\u73b0&#8221;\u521d\u59cb\u5316\u4e91\u7aef\u9879\u76ee&#8221;\u6d88\u606f\u65f6\uff0c\u5f00\u59cb\u521d\u59cb\u5316\u5e76\u51c6\u5907\u540e\u7aef\u8d44\u6e90\uff0c\u8bf7\u7b49\u5f85\u3002<br \/>\n\u5f53\u51fa\u73b0&#8221;\u60a8\u7684\u9879\u76ee\u5df2\u6210\u529f\u521d\u59cb\u5316\u5e76\u4e0e\u4e91\u7aef\u8fde\u63a5\uff01&#8221;\u6d88\u606f\u65f6\uff0c\u8868\u660e\u51c6\u5907\u5de5\u4f5c\u5df2\u5b8c\u6210\u3002<\/p>\n<h3>\u51c6\u5907\u540e\u7aefAPI\uff08Graphql\uff09<\/h3>\n<p>\u4e3a\u4e86\u51c6\u5907API\uff0c\u63a5\u4e0b\u6765\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code>amplify add api\r\n<\/code><\/pre>\n<p>\u90a3\u4e48\uff0c\u6211\u4eec\u5c06\u4ee5\u4e92\u52a8\u7684\u65b9\u5f0f\u786e\u5b9a\u5728\u9879\u76ee\u4e2d\u4f7f\u7528\u7684API\u79cd\u7c7b\u3001\u540d\u79f0\u548c\u6a21\u5f0f\u914d\u7f6e\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u4f7f\u7528GraphQL\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u793a\u4f8b\u95ee\u9898\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/61-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-15 18.49.16.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/62-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-15 18.52.35.png\" \/><\/div>\n<p>\u5982\u679c\u6210\u529f\u7f16\u8bd1GraphQL\u6a21\u5f0f\uff0c\u5219\u4f1a\u751f\u6210\u7528\u4e8e\u6267\u884cGraphql\u7684api\u6240\u9700\u7684\u6587\u4ef6\u7b49\u3002\u4e4b\u540e\uff0c\u5982\u679c\u60a8\u60f3\u5bf9\u6a21\u5f0f\u6587\u4ef6\u8fdb\u884c\u66f4\u6539\uff0c\u60a8\u53ef\u4ee5\u81ea\u884c\u8fdb\u884c\u7f16\u8f91\u3002\u672c\u6b21\u5c06\u91c7\u7528\u4ee5\u4e0b\u683c\u5f0f\u7684\u6a21\u5f0f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">type<\/span> <span class=\"n\">Todo<\/span> <span class=\"err\">@<\/span><span class=\"n\">model<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">ID<\/span><span class=\"p\">!<\/span>\r\n  <span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span>\r\n  <span class=\"n\">isDone<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Boolean<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u8fdb\u884c\u90e8\u7f72\u3002<\/p>\n<pre class=\"post-pre\"><code>amplify push\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u4f1a\u4ee5\u4e92\u52a8\u7684\u65b9\u5f0f\u7ee7\u7eed\u63d0\u51fa\u95ee\u9898\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/68-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-15 15.40.57.png\" \/><\/div>\n<p>\u5f53\u90e8\u7f72\u5b8c\u6210\u540e\uff0c\u540e\u7aef\u8d44\u6e90\u4f1a\u81ea\u52a8\u751f\u6210\u3002<\/p>\n<h3>Next.js\u548cAmplify\u7684\u6574\u5408<\/h3>\n<p>\u5f53\u6ee1\u8db3\u4e86\u5fc5\u9700\u7684\u540e\u7aef\u8d44\u6e90\uff0c\u6211\u4eec\u5c06\u5f00\u59cb\u8fdb\u884cNext.js\u7684\u5b9e\u73b0\u3002<br \/>\n\u9996\u5148\uff0c\u6211\u4eec\u8981\u5b89\u88c5\u6240\u9700\u7684npm\u6a21\u5757\u3002<\/p>\n<pre class=\"post-pre\"><code>npm install --save @aws-amplify\/api @aws-amplify\/core @aws-amplify\/pubsub\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u7f16\u8f91\u5728\u8bbe\u7f6eNext.js\u65f6\u521b\u5efa\u7684pages\/todo.tsx\u6587\u4ef6\u3002<\/p>\n<p>\u57fa\u672c\u4e0a\uff0c\u60a8\u9700\u8981\u5728\u4ee3\u7801\u4e2d\u5bfc\u5165amplify\u6a21\u5757\u5e76\u8fdb\u884c\u914d\u7f6e\u5904\u7406\u3002\u5f53\u60a8\u60f3\u8981\u7f16\u5199amplify\u7684\u5904\u7406\u65f6\uff0c\u901a\u5e38\u4f1a\u5728\u9875\u9762\u4e2d\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/core<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">PubSub<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/pubsub<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">API<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">graphqlOperation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/api<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsmobile<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/aws-exports<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsmobile<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsmobile<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">PubSub<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsmobile<\/span><span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u786e\u4fdd\u53ef\u4ee5\u4f7f\u7528\u6211\u4eec\u4f7f\u7528\u7684\u540e\u7aefAPI\u3002\u7531\u4e8e\u6211\u4eec\u6b63\u5728\u4f7f\u7528GraphQL\u8fdb\u884c\u5f00\u53d1\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u4ece\u4e2d\u5bfc\u5165\u67e5\u8be2\u3001\u53d8\u5f02\u548c\u8ba2\u9605\u3002\u867d\u7136\u6211\u4eec\u5728\u8fd9\u91cc\u5bfc\u5165\u4e86\u6240\u6709\u5185\u5bb9\uff0c\u4f46\u5b9e\u9645\u4e0a\u53ea\u9700\u8981\u5bfc\u5165\u9700\u8981\u4f7f\u7528\u7684\u90e8\u5206\u5373\u53ef\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">deleteTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">updateTodo<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/graphql\/mutations<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">listTodos<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/graphql\/queries<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">onCreateTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">onUpdateTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">onDeleteTodo<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/graphql\/subscriptions<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u7b80\u5355\u89e3\u91ca\u4e00\u4e0b\uff0cQuery\u548cMutations\u53ef\u4ee5\u4e0e\u4f20\u7edf\u7684CRUD\u64cd\u4f5c\u76f8\u5bf9\u5e94\uff0c\u5177\u4f53\u5982\u4e0b\uff1a<\/p>\n<div>\n<div class=\"post-table\">\u6628\u65e5CRUDgraphql\u4f5c\u6210CREATEMutation\u53d6\u5f97READQuery\u66f4\u65b0UPDATEMutation\u524a\u9664DELETEMutation<\/div>\n<\/div>\n<p>\u6b64\u5916\uff0c\u5728GraphQL\u4e2d\u8fd8\u6709\u4e00\u79cd\u79f0\u4e3aSubscription\uff08\u8ba2\u9605\uff09\u7684\u529f\u80fd\u3002\u7b80\u5355\u6765\u8bf4\uff0c\u8fd9\u7c7b\u4f3c\u4e8e\u6765\u81ea\u670d\u52a1\u5668\u7aef\u7684\u63a8\u9001\u3002\u5f53\u540e\u7aef\u6570\u636e\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5b83\u53ef\u4ee5\u68c0\u6d4b\u5e76\u901a\u77e5\u6211\u4eec\u77e5\u9053\u65b0\u7684\u503c\u3002<\/p>\n<h4>\u5982\u4f55\u4f7f\u7528\u67e5\u8be2\u529f\u80fd<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">getTodo<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`query GetTodo($id: ID!) {\r\n  getTodo(id: $id) {\r\n    id\r\n    description\r\n    isDone\r\n  }\r\n}\r\n`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u4f7f\u7528API.graphql(graphqlOperation)\u8bbf\u95ee\u4ee5\u4ee5\u4e0b\u65b9\u5f0f\u5bfc\u5165\u7684listTodos\u67e5\u8be2\u3002\u5f53\u901a\u4fe1\u6210\u529f\u65f6\uff0c\u83b7\u53d6\u7684\u503c\u5c06\u5b58\u50a8\u5728data\u4e2d\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7props\u4f20\u9012\u5b83\uff0c\u6216\u8005\u5c06\u5176\u4f20\u9012\u7ed9\u7528\u4e8e\u5217\u8868\u5448\u73b0\u7684\u672c\u5730\u72b6\u6001\uff0c\u4ee5\u5728React\u4e2d\u8fdb\u884c\u5448\u73b0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">Todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">getInitialProps<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">listTodos<\/span><span class=\"p\">));<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">props<\/span><span class=\"p\">,<\/span> <span class=\"p\">...<\/span><span class=\"nx\">data<\/span><span class=\"p\">};<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<h4>Mutations\u7684\u4f7f\u7528\u65b9\u6cd5<\/h4>\n<pre class=\"post-pre\"><code>\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">createTodo<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`mutation CreateTodo($input: CreateTodoInput!) {\r\n  createTodo(input: $input) {\r\n    id\r\n    description\r\n    isDone\r\n  }\r\n}\r\n`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u662f\u7528\u4e8e\u6ce8\u518c\u7684\u529f\u80fd\u3002\u5728API.graphql\uff08graphqlOperation\uff08createTodo\uff0cinputData\uff09\uff09\u4e2d\uff0c\u5c06Mutation\u4f5c\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570\uff0c\u5c06\u8981\u6ce8\u518c\u7684\u6570\u636e\u653e\u5165\u7b2c\u4e8c\u4e2a\u53c2\u6570\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">submitTodo<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">list<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">id<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">floor<\/span><span class=\"p\">(<\/span><span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">random<\/span><span class=\"p\">()<\/span> <span class=\"o\">*<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">floor<\/span><span class=\"p\">(<\/span><span class=\"mi\">1000<\/span><span class=\"p\">))<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">inputData<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">isDone<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">createTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">inputData<\/span><span class=\"p\">));<\/span>\r\n  <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<\/code><\/pre>\n<h4>\u8ba2\u9605\u529f\u80fd\u7684\u4f7f\u7528\u65b9\u6cd5<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">onCreateTodo<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`subscription OnCreateTodo {\r\n  onCreateTodo {\r\n    id\r\n    description\r\n    isDone\r\n  }\r\n}\r\n`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">onCreateTodo<\/span><span class=\"p\">)).<\/span><span class=\"nx\">subscribe<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">next<\/span><span class=\"p\">:<\/span> <span class=\"nx\">e<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"c1\">\/\/ \u8cfc\u8aad\u3059\u308b\u5024\u306e\u53d6\u5f97<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">todo<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">onCreateTodo<\/span>\r\n\r\n        <span class=\"c1\">\/\/ \u5024\u3092\u30bb\u30c3\u30c8\u3059\u308b\u51e6\u7406\u3092\u66f8\u304f<\/span>\r\n        <span class=\"p\">...<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">})<\/span>\r\n<\/code><\/pre>\n<h2>\u5b9e\u73b0Todo\u5e94\u7528\u7a0b\u5e8f<\/h2>\n<p>\u4ee5\u4e0b\u662f\u672c\u6b21\u5b9e\u73b0\u7684\u4f8b\u5b50\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/core<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">PubSub<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/pubsub<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">API<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">graphqlOperation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/api<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsmobile<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/aws-exports<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">createTodo<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">deleteTodo<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">updateTodo<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/graphql\/mutations<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">listTodos<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/graphql\/queries<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">onCreateTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">onUpdateTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">onDeleteTodo<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/graphql\/subscriptions<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Head<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/components\/templates\/head<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Navigation<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/components\/templates\/navigation<\/span><span class=\"dl\">'<\/span>\r\n\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsmobile<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsmobile<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">PubSub<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsmobile<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kr\">interface<\/span> <span class=\"nx\">TodoType<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">description<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span>\r\n  <span class=\"nx\">isDone<\/span><span class=\"p\">:<\/span> <span class=\"nx\">boolean<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kr\">interface<\/span> <span class=\"nx\">DataProp<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">data<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">listTodos<\/span><span class=\"p\">?:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">items<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">TodoType<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Todo<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">:<\/span> <span class=\"nx\">DataProp<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"na\">items<\/span><span class=\"p\">:<\/span> <span class=\"nx\">todoItems<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">listTodos<\/span><span class=\"p\">;<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">todo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setTodo<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"dl\">''<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">list<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setList<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">([]);<\/span>\r\n\r\n  <span class=\"c1\">\/\/ \u65b0\u898f\u8ffd\u52a0\u3067Todo\u3092\u8ffd\u52a0\u3059\u308b<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">submitTodo<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"na\">list<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span> <span class=\"na\">todo<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">id<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">floor<\/span><span class=\"p\">(<\/span><span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">random<\/span><span class=\"p\">()<\/span> <span class=\"o\">*<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">floor<\/span><span class=\"p\">(<\/span><span class=\"mi\">1000<\/span><span class=\"p\">))<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">inputData<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">isDone<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">createTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">inputData<\/span><span class=\"p\">));<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"c1\">\/\/ \u65e2\u5b58\u306eTodo\u3092\u524a\u9664\u3059\u308b<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">deleteItem<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">deleteData<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">id<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">deleteTodo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">deleteData<\/span><span class=\"p\">));<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Head<\/span> <span class=\"na\">title<\/span><span class=\"p\">=<\/span><span class=\"s\">\"todo\"<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Navigation<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">h2<\/span><span class=\"p\">&gt;<\/span>Todo with amplify<span class=\"p\">&lt;\/<\/span><span class=\"nt\">h2<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">input<\/span> <span class=\"na\">style<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\r\n        <span class=\"na\">border<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">solid 1px #ddd<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">borderRadius<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">18<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">WebkitAppearance<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">none<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">color<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">#333<\/span><span class=\"dl\">'<\/span>\r\n      <span class=\"p\">}<\/span><span class=\"si\">}<\/span> <span class=\"na\">value<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">todo<\/span><span class=\"si\">}<\/span> <span class=\"na\">type<\/span><span class=\"p\">=<\/span><span class=\"s\">\"text\"<\/span> <span class=\"na\">placeholder<\/span><span class=\"p\">=<\/span><span class=\"s\">\"please write todo\"<\/span> <span class=\"na\">onChange<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">e<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">setTodo<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span> <span class=\"na\">style<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\r\n        <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">background<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">#F06292<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">color<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">#eee<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">borderRadius<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">18<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">WebkitAppearance<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">none<\/span><span class=\"dl\">'<\/span>\r\n      <span class=\"p\">}<\/span><span class=\"si\">}<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">submitTodo<\/span><span class=\"p\">(<\/span><span class=\"nx\">list<\/span><span class=\"p\">,<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>add Todo<span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">ul<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"ListContainer\"<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span>\r\n        <span class=\"nx\">todoItems<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">(<\/span> <span class=\"nx\">item<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\r\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">item<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"ListItem\"<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">span<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"title\"<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">item<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">item<\/span><span class=\"p\">.<\/span><span class=\"nx\">isDone<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">input<\/span> <span class=\"na\">type<\/span><span class=\"p\">=<\/span><span class=\"s\">\"button\"<\/span> <span class=\"na\">value<\/span><span class=\"p\">=<\/span><span class=\"s\">\"delete\"<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">deleteItem<\/span><span class=\"p\">(<\/span><span class=\"nx\">item<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n          <span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">))<\/span>\r\n      <span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">ul<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">)<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"nx\">Todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">getInitialProps<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">listTodos<\/span><span class=\"p\">));<\/span>\r\n\r\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">onCreateTodo<\/span><span class=\"p\">));<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">subscribe<\/span><span class=\"dl\">\"<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">client<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nx\">subscribe<\/span><span class=\"p\">({<\/span>\r\n        <span class=\"na\">next<\/span><span class=\"p\">:<\/span> <span class=\"nx\">e<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n      <span class=\"p\">});<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">props<\/span><span class=\"p\">,<\/span> <span class=\"p\">...<\/span><span class=\"nx\">data<\/span><span class=\"p\">};<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">Todo<\/span><span class=\"p\">;<\/span>\r\n\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/95-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-15 20.52.26.png\" \/><\/div>\n<p>\u5728\u8be5\u72b6\u6001\u4e0b\uff0c\u4f7f\u7528npm run dev\u547d\u4ee4\u542f\u52a8\u670d\u52a1\u5668\uff0c\u5e76\u5c1d\u8bd5\u8bbf\u95ee\/todo\uff0c\u5982\u679c\u663e\u793a\u51faTodo\uff0c\u5219\u8868\u793a\u6210\u529f\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/97-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-15 20.50.52.png\" \/><\/div>\n<h2>\u603b\u7ed3\u548c\u611f\u60f3<\/h2>\n<p>\u975e\u5e38\u611f\u8c22\u60a8\u4ed4\u7ec6\u9605\u8bfb\u5230\u6700\u540e\u4e00\u53e5\u8bdd\u3002<\/p>\n<p>\u5728\u5df7\u5b50\u91cc\uff0c\u65e0\u670d\u52a1\u5668\u7684Web\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u53ef\u80fd\u975e\u5e38\u6d41\u884c\uff0cNuxt.js + Firebase\u7684\u4fe1\u606f\u975e\u5e38\u4e30\u5bcc\u3002\u5b83\u975e\u5e38\u65b9\u4fbf\uff0c\u4e5f\u662f\u6211\u559c\u6b22\u7684\u4e00\u79cd\u6280\u672f\u3002\u4f46\u76f8\u53cd\uff0cNext.js\u5e76\u4e0d\u50cf\u4ee5\u524d\u90a3\u6837\u5e38\u89c1\uff0c\u4f46\u968f\u7740\u7248\u672c\u5347\u7ea7\uff0c\u5b83\u589e\u52a0\u4e86\u5f88\u591a\u6709\u5438\u5f15\u529b\u7684\u529f\u80fd\u3002\u53e6\u5916\uff0c\u7531\u4e8e\u662f\u57fa\u4e8eReact\uff0c\u4e0eVue\u76f8\u6bd4\uff0c\u6211\u89c9\u5f97\u5b83\u66f4\u5bb9\u6613\u51fa\u95ee\u9898\uff0c\u6240\u4ee5\u6211\u8ba4\u4e3aNext.js\u4e5f\u76f8\u5f53\u4e0d\u9519\u3002<br \/>\nAWS Amplify\u672c\u8eab\u4e5f\u662f\u7531\u8bb8\u591aAWS\u670d\u52a1\u7ec4\u6210\u7684\uff0c\u56e0\u6b64\u9664\u4e86\u6613\u4e8e\u4f7f\u7528\u4e4b\u5916\uff0c\u6211\u8ba4\u4e3a\u5b83\u5728\u6269\u5c55\u6027\u548cSLA\u65b9\u9762\u4e5f\u975e\u5e38\u63a8\u8350\u3002<\/p>\n<p>\u7136\u800c\uff0c\u5728\u4efb\u4f55\u6280\u672f\u9009\u62e9\u4e2d\uff0c\u6211\u8ba4\u4e3a\u5feb\u901f\u5730\u8fdb\u884c\u5047\u8bbe\u9a8c\u8bc1\u5e76\u5c06\u53cd\u9988\u56de\u9988\u7ed9\u7528\u6237\u4f53\u9a8c\u662f\u5f88\u91cd\u8981\u7684\u3002\u4f5c\u4e3a\u5176\u4e2d\u4e00\u4e2a\u975e\u5e38\u6709\u5438\u5f15\u529b\u7684\u9009\u62e9\uff0c\u6211\u5e0c\u671b\u80fd\u9010\u6e10\u5730\u5728\u5c06\u6765\u5f00\u59cb\u4f7f\u7528\u5b83\u3002<\/p>\n<h2>\u8bf7\u53c2\u8003<\/h2>\n<p>https:\/\/aws-amplify.github.io\/docs\/js\/api \u7684\u5185\u5bb9\u662f\u6709\u5173JavaScript\u7684Amplify\u5e93\u7684\u6587\u6863\u3002<\/p>\n<p>https:\/\/qiita.com\/G-awa\/items\/a5b2cc7017b1eceeb002 \u662f\u4e00\u4e2a\u5173\u4e8eG-awa\u7684Qiita\u6587\u7ae0\u7684\u94fe\u63a5\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8ff0 \u4f60\u597d\uff0c\u6211\u662f\u67ef\u9ea6\uff0c\u6700\u8fd1\u5728\u4e1c\u4eac\u62c5\u4efb\u524d\u7aef\u5de5\u7a0b\u5e08\u3002\u6211\u5bf9\u5728AWS\u7684re:Invent\u4e0a\u53d1\u5e03\u7684AWS Amplify [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48198","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528next-js-aws-amplify-graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883\" \/>\n<meta property=\"og:description\" content=\"\u6982\u8ff0 \u4f60\u597d\uff0c\u6211\u662f\u67ef\u9ea6\uff0c\u6700\u8fd1\u5728\u4e1c\u4eac\u62c5\u4efb\u524d\u7aef\u5de5\u7a0b\u5e08\u3002\u6211\u5bf9\u5728AWS\u7684re:Invent\u4e0a\u53d1\u5e03\u7684AWS Amplify [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528next-js-aws-amplify-graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-23T07:09:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T18:35:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/3-0.png\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/\",\"name\":\"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2022-11-23T07:09:53+00:00\",\"dateModified\":\"2024-04-29T18:35:09+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528next-js-aws-amplify-graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883","og_description":"\u6982\u8ff0 \u4f60\u597d\uff0c\u6211\u662f\u67ef\u9ea6\uff0c\u6700\u8fd1\u5728\u4e1c\u4eac\u62c5\u4efb\u524d\u7aef\u5de5\u7a0b\u5e08\u3002\u6211\u5bf9\u5728AWS\u7684re:Invent\u4e0a\u53d1\u5e03\u7684AWS Amplify [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528next-js-aws-amplify-graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-11-23T07:09:53+00:00","article_modified_time":"2024-04-29T18:35:09+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d83ee913a08637a6b4a19\/3-0.png"}],"author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/","name":"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2022-11-23T07:09:53+00:00","dateModified":"2024-04-29T18:35:09+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Next.js + AWS Amplify + Graphql\u642d\u5efa\u65e0\u670d\u52a1\u5668\u5e94\u7528\u7a0b\u5e8f\u73af\u5883"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8next-js-aws-amplify-graphql%e6%90%ad%e5%bb%ba%e6%97%a0%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e7%8e%af%e5%a2%83%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48198"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48198\/revisions"}],"predecessor-version":[{"id":89162,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48198\/revisions\/89162"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}