{"id":47749,"date":"2023-06-16T23:24:08","date_gmt":"2023-01-12T04:12:21","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/"},"modified":"2024-04-30T09:14:17","modified_gmt":"2024-04-30T01:14:17","slug":"%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/","title":{"rendered":"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7"},"content":{"rendered":"<h1>\u7b80\u8981\u6982\u8ff0<\/h1>\n<p>\u4f60\u8981\u505a\u4ec0\u4e48<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5efa\u7acb\u4e00\u4e2a\u7c7b\u4f3c\u4e8eYarn Workspace\u7684Monorepo\u9879\u76ee\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>\u4f7f\u7528oao\uff0c\u4f7f\u5f97\u53ef\u4ee5\u540c\u65f6\u8fd0\u884cfrontend\u548cbackend\u9879\u76ee\u7684dev\u811a\u672c\u3002<\/p>\n<p>\u4f7f\u7528graphql-codegen\u81ea\u52a8\u5c06\u7c7b\u578b\u5b9a\u4e49\u6587\u4ef6\u751f\u6210\u5230frontend\u9879\u76ee\u4e2d\u3002<\/p>\n<p>\u540e\u7aef\u7f16\u8f91\uff1a<\/p>\n<p>\u4f7f\u7528graphql-yoga\u642d\u5efaGraphQL\u670d\u52a1\u5668\u3002<\/p>\n<p>\u4f7f\u7528type-graphql\u7f16\u5199GraphQL\u89e3\u6790\u5668\u3002<\/p>\n<p>\u901a\u8fc7\u4ee3\u7801\u4f18\u5316\uff0c\u5728\u670d\u52a1\u5668\u542f\u52a8\u65f6\u81ea\u52a8\u751f\u6210schema.graphql\u6587\u4ef6\u3002<\/p>\n<p>\u4f7f\u7528ts-node-dev\uff0c\u5728\u4ee3\u7801\u66f4\u65b0\u65f6\u91cd\u65b0\u542f\u52a8\u540e\u7aef\u670d\u52a1\u5668\u3002<\/p>\n<p>\u524d\u7aef\u7f16\u8f91\uff1a<\/p>\n<p>\u4f7f\u7528Next.js\u548cmobx\u8fdb\u884c\u8212\u9002\u7684\u7f16\u7801\u3002<\/p>\n<p>\u7f16\u5199\u67e5\u8be2\uff0c\u5e76\u81ea\u52a8\u7531graphql-codegen\u751f\u6210\u8fd4\u56de\u7c7b\u578b\u3002<\/p>\n<h3>\u4eca\u5929\u8981\u505a\u7684\u4e1c\u897f<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d80ab913a08637a6aad31\/4-0.gif\" alt=\"\u753b\u9762\u53ce\u9332 2019-07-07 1.48.08-2.gif\" \/><\/div>\n<h3>\u53ef\u4ee5\u7684\u90a3\u4e2a<\/h3>\n<h3>\u6587\u4ef6\u7ed3\u6784<\/h3>\n<pre class=\"post-pre\"><code>.\r\n\u251c\u2500\u2500 backend\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 package.json\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 index.ts\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 resolvers\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 AisatsuResolver.ts\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 CrabResolver.ts\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 tsconfig.json\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 types\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 Crab.ts\r\n\u251c\u2500\u2500 frontend\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 package.json\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 lib\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 client.ts\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 pages\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.tsx\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 queries\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 hello.ts\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 kani.ts\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 types.ts\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 store\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pageController.ts\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 .babelrc\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 tsconfig.json\r\n\u251c\u2500\u2500 package.json\r\n\u251c\u2500\u2500 codegen.yml\r\n\u251c\u2500\u2500 schema.graphql\r\n\u251c\u2500\u2500 tsconfig.json\r\n\u2514\u2500\u2500 yarn.lock\r\n\r\n<\/code><\/pre>\n<h1>\u521b\u5efa\u6839\u9879\u76ee<\/h1>\n<h2>\u8bbe\u7f6eyarn\u5de5\u4f5c\u533a<\/h2>\n<p>\u4f7f\u7528 `yarn init` \u547d\u4ee4\uff0c\u5e76\u5728 `package.json` \u6587\u4ef6\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff0c\u5373\u53ef\u521b\u5efa\u4e00\u4e2a\u5de5\u4f5c\u533a\uff08workspace\uff09\u3002\u5728\u8be5\u5de5\u4f5c\u533a\u4e0b\u521b\u5efa\u7684 npm \u9879\u76ee\u4e2d\u8fd0\u884c `yarn install` \u547d\u4ee4\uff0c\u4fbf\u53ef\u5c06\u4f9d\u8d56\u7684\u6a21\u5757\u5b89\u88c5\u5230\u6839\u9879\u76ee\u7684 `node_modules` \u76ee\u5f55\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"private\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"workspaces\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s2\">\"frontend\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s2\">\"backend\"<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u5b89\u88c5oao\u5230\u6839\u76ee\u5f55<\/h2>\n<p>\u5728\u5de5\u4f5c\u7a7a\u95f4\u4e0a\u6267\u884cyarn add\uff0c\u9700\u8981\u4f7f\u7528-W\u9009\u9879\u3002\u4e0b\u9762\u662f\u5b89\u88c5oao\u7684\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn add -D oao -W\r\n<\/span><\/code><\/pre>\n<p>\u4f7f\u7528oao\u53ef\u4ee5\u4e00\u6b21\u8fd0\u884c\u4e0b\u5c5e\u9879\u76ee\u7684\u811a\u672c\u3002\u53e6\u5916\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u52a0\u4e0a&#8211;parallel\u53ef\u4ee5\u5e76\u884c\u5730\u4e00\u8d77\u8fd0\u884c\u3002\u4e0d\u4ec5\u9650\u4e8e\u540c\u65f6\u8fd0\u884c\u4e0d\u8fd4\u56deexit\u7684\u50cf\u670d\u52a1\u5668\u4e00\u6837\u7684\u7a0b\u5e8f\u65f6\u66f4\u52a0\u5feb\u901f\u3002\u5982\u679c\u4e0d\u9700\u8981\u4e32\u884c\uff0c\u52a0\u4e0a&#8211;parallel\u5c31\u53ef\u4ee5\u4e86\u5427\u3002\u6211\u4e0d\u786e\u5b9a\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\">\"oao run-script dev --parallel\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5220\u9664\u4e0b\u5c5e\u9879\u76ee\u7684node_module\u6587\u4ef6\u5939\u3002<\/h3>\n<p>\u4ee5\u4e0b\u547d\u4ee4\u53ef\u4e00\u6b21\u6027\u6e05\u9664\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn oao clean\r\n<\/span><\/code><\/pre>\n<h3>\u67e5\u770b\u4e0b\u65b9\u9879\u76ee\u7684package.json\u6587\u4ef6\u5e76\u5b89\u88c5node_module\u3002<\/h3>\n<p>\u5982\u679c\u4f60\u8bbe\u5b9a\u4e86yarn\u7684\u5de5\u4f5c\u7a7a\u95f4\uff0c\u53ea\u9700\u8981\u5728\u6839\u76ee\u5f55\u4e0b\u8fd0\u884cyarn\u5373\u53ef\u8fdb\u5165\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn\r\n<\/span><\/code><\/pre>\n<h2>\u5728\u6839\u76ee\u5f55\u4e0b\u7f16\u5199tsconfig.json\u7684\u6a21\u677f<\/h2>\n<p>\u4ece Next.js \u7684 GitHub \u4e0a\u62c9\u53d6\u4e86 tsconfig.json \u6587\u4ef6\u3002\u53ef\u4ee5\u5728\u9879\u76ee\u7684\u5b50\u76ee\u5f55\u4e2d\u4f7f\u7528 extends \u6765\u914d\u7f6e target \u7b49\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">compilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">allowJs<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* Allow JavaScript files to be type checked. *\/<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">alwaysStrict<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* Parse in strict mode. *\/<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">esModuleInterop<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* matches compilation setting *\/<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">isolatedModules<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* to match webpack loader *\/<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">noEmit<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* Do not emit outputs. Makes sure tsc only does type checking. *\/<\/span><span class=\"p\">,<\/span>\r\n\r\n    <span class=\"cm\">\/* Strict Type-Checking Options, optional, but recommended. *\/<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">noFallthroughCasesInSwitch<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* Report errors for fallthrough cases in switch statement. *\/<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">noUnusedLocals<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* Report errors on unused locals. *\/<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">noUnusedParameters<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* Report errors on unused parameters. *\/<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">strict<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"cm\">\/* Enable all strict type-checking options. *\/<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u540e\u7aef\u7f16\u7a0b<\/h1>\n<p>\u521b\u5efa\u540e\u7aef\u9879\u76ee\u3002\u6839\u636e oao \u7c7b\u4f3c\u4e8e lerna \u7684\u7279\u70b9\uff0c\u5728\u521b\u5efa\u5b50\u9879\u76ee\u65f6\u770b\u8d77\u6765\u6ca1\u6709\u7279\u522b\u9700\u8981\u6ce8\u610f\u7684\u5730\u65b9\uff0c\u6240\u4ee5\u53ef\u4ee5\u6b63\u5e38\u4f7f\u7528 mkdir \u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u76ee\u5f55\uff0c\u7136\u540e\u8fd0\u884c yarn \u5373\u53ef\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">mkdir backend\r\ncd backend\r\n<\/span><\/code><\/pre>\n<h2>\u5b89\u88c5\u6240\u9700\u7684\u8f6f\u4ef6\u5305\u3002<\/h2>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn add graphql graphql-yoga type-graphql @types\/graphql reflect-metadata uuid\r\nyarn add -D @types\/uuid ts-node-dev typescript\r\n<\/span><\/code><\/pre>\n<p>\u5c3d\u7ba1\u6709\u4e00\u4e2a\u4e0d\u662f\u5f00\u53d1\u73af\u5883\u7684\u4f9d\u8d56@types\/graphql\u611f\u89c9\u5f88\u5947\u602a\uff0c\u4f46\u8fd9\u6837\u4e5f\u53ef\u4ee5\u3002<\/p>\n<p>\u5f53\u65f6\u7f16\u5199\u7684backend\/package.json\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">dependencies<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">@types\/graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^14.2.2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^14.4.2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">graphql-yoga<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^1.18.0<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">reflect-metadata<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^0.1.13<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">type-graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^0.17.4<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">uuid<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^3.3.2<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">devDependencies<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">@types\/uuid<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^3.4.5<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">ts-node-dev<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^1.0.0-pre.40<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">typescript<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^3.5.2<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u5728\u8fd9\u91cc\u8bbe\u7f6edev\u811a\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"dl\">\"<\/span><span class=\"s2\">scripts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">dev<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">ts-node-dev index.ts <\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528\u7ee7\u627f\u6765\u7f16\u5199tsconfig.json\u6587\u4ef6\u3002<\/h3>\n<p>\u5728\u6839\u76ee\u5f55\u4e0b\u7684tsconfig.json\u4e2d\u8865\u5145\u7f3a\u5c11\u6216\u9700\u8981\u66f4\u6539\u7684\u9009\u9879\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">extends<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/tsconfig<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">compilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">target<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">es2016<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">module<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">commonjs<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">lib<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">es2016<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">esnext.asynciterable<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">experimentalDecorators<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">emitDecoratorMetadata<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u4f60\u597d\u4e16\u754c\uff0c\u6211\u8981\u5efa\u7acbGraphQL\u3002<\/h2>\n<p>\u8bf7\u5199\u4e0b\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u7684HelloWorld\u7d22\u5f15\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">reflect-metadata<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GraphQLServer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">graphql-yoga<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">buildSchema<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Query<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Resolver<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">type-graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"p\">@<\/span><span class=\"nd\">Resolver<\/span><span class=\"p\">()<\/span>\r\n<span class=\"kd\">class<\/span> <span class=\"nx\">HelloResolver<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Query<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u65b0\u3057\u3044\u8a00\u8a9e\u3092\u5b66\u3076\u5f53\u305f\u3063\u3066\u3001Hello World\u3092\u3057\u306a\u3044\u3068\u546a\u308f\u308c\u308b\u3002<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">})<\/span>\r\n  <span class=\"nx\">sayHello<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Hello World!<\/span><span class=\"dl\">\"<\/span><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\">main<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">schema<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">buildSchema<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">resolvers<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">HelloResolver<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">server<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">GraphQLServer<\/span><span class=\"p\">({<\/span> <span class=\"nx\">schema<\/span> <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"nx\">server<\/span><span class=\"p\">.<\/span><span class=\"nx\">start<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Server is running on localhost:4000<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"p\">);<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"nx\">main<\/span><span class=\"p\">();<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u8fd0\u884cyarn dev\u540e\uff0cGraphQL\u670d\u52a1\u5668\u5c06\u57284000\u7aef\u53e3\u4e0a\u542f\u52a8\u3002\u53e6\u5916\uff0cts-node-dev\u4f1a\u5728\u6e90\u4ee3\u7801\u66f4\u6539\u65f6\u81ea\u52a8\u91cd\u65b0\u542f\u52a8\u670d\u52a1\u5668\u3002\u975e\u5e38\u65b9\u4fbf\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn dev\r\n\r\n<\/span><\/code><\/pre>\n<p>\u9ed8\u8ba4\u8bbe\u7f6e\u4e0b\uff0cgraphql-playground\u5df2\u7ecf\u542f\u52a8\u4e86\uff0c\u6240\u4ee5\u4f60\u53ef\u4ee5\u968f\u5fc3\u6240\u6b32\u5730\u73a9\u800d\u3002\u4f46\u662f\u73b0\u5728\u53ea\u6709sayHello\u5728\u8fd0\u884c\uff0c\u6240\u4ee5\u6ca1\u6709\u8da3\u5473\u3002<br \/>\nhttp:\/\/localhost:4000<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d80ab913a08637a6aad31\/46-1.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-07-07 2.36.41.png\" \/><\/div>\n<h2>\u4f7f\u7528type-graphql\u548cgraphql-yoga\u5efa\u7acb\u65f6\u7684\u8981\u70b9<\/h2>\n<p>type-graphql\u3067\u5b9a\u7fa9\u3092\u66f8\u304f\u3068\u304d\u306fimport &#8220;reflect-metadata&#8221;;\u3092\u3064\u3051\u308b<br \/>\nIDE\u306e\u88dc\u5b8c\u3092\u52b9\u304b\u305b\u308b\u306e\u306b\u4fbf\u5229\u306a\u30b9\u30ad\u30fc\u30de\u306fbuildSchema\u306bemitSchemaFile: path.resolve(__dirname, &#8220;..\/schema.graphql&#8221;)\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u52a0\u3048\u3066\u30eb\u30fc\u30c8\u306b\u5410\u304b\u305b\u308b\u3002<br \/>\n\u3042\u3068\u3042\u30683000\u756a\u30dd\u30fc\u30c8\u3067next.js\u30b5\u30fc\u30d0\u30fc\u3092\u7acb\u3066\u308b\u306e\u3067\u3001cors\u30aa\u30d7\u30b7\u30e7\u30f3\u3092server.start\u306b\u98df\u308f\u305b\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">reflect-metadata<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GraphQLServer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">graphql-yoga<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">buildSchema<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">type-graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">CrabResolver<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/resolvers\/CrabResolver<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">AisatsuResolver<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/resolvers\/AisatsuResolver<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">path<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">path<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span><span class=\"c1\">\/\/\u8ffd\u52a0<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">main<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">schema<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">buildSchema<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">resolvers<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">AisatsuResolver<\/span><span class=\"p\">,<\/span> <span class=\"nx\">CrabResolver<\/span><span class=\"p\">],<\/span>\r\n    <span class=\"na\">emitSchemaFile<\/span><span class=\"p\">:<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/schema.graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span><span class=\"c1\">\/\/\u8ffd\u52a0<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">server<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">GraphQLServer<\/span><span class=\"p\">({<\/span> <span class=\"nx\">schema<\/span> <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"nx\">server<\/span><span class=\"p\">.<\/span><span class=\"nx\">start<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"p\">{<\/span>\r\n      <span class=\"na\">cors<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span><span class=\"c1\">\/\/\u8ffd\u52a0<\/span>\r\n        <span class=\"na\">credentials<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">origin<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">http:\/\/localhost:3000<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Server is running on localhost:4000<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"p\">);<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"nx\">main<\/span><span class=\"p\">();<\/span>\r\n\r\n<\/code><\/pre>\n<h3>\u6211\u5269\u4e0b\u7684GraphQL\u670d\u52a1\u5668\u4ee3\u7801<\/h3>\n<p>\u5982\u679c\u6709\u673a\u4f1a\u7684\u8bdd\uff0c\u6211\u60f3\u5c1d\u8bd5\u4e00\u4e0bType-GraphQL\u7684\u8bf4\u660e\u3002\u5b83\u662f\u4e00\u79cd\u4ece\u5e26\u6709\u5927\u91cf\u4fee\u9970\u5668\u7684\u4ee3\u7801\u751f\u6210\u6a21\u5f0f\u4e2d\u8f93\u51fa\u6a21\u5f0f\u548ctypescript\u7c7b\u578b\u7684\u5f62\u5f0f\uff0c\u6240\u4ee5\u4e0d\u518d\u9700\u8981\u6a21\u5f0f\u548ctypescript\u7c7b\u578b\u7684\u91cd\u590d\u5b9a\u4e49\uff0c\u8fd9\u592a\u597d\u4e86\u3002\u7136\u800c\uff0c\u4ece\u5ba2\u6237\u7aef\u4f7f\u7528\u8fd9\u4e9b\u7c7b\u6765\u53d1\u51faapollo-client\u7684\u67e5\u8be2\u6216\u83b7\u53d6\u8fd4\u56de\u503c\u7c7b\u578b\u7684\u611f\u89c9\u5e76\u4e0d\u662f\u90a3\u4e48\u7b80\u5355\u3002<\/p>\n<p>\u7136\u800c\uff0c\u4f7f\u7528\u8fd9\u4e2a\u7b14\u7684\u611f\u89c9\u5f88\u597d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">reflect-metadata<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Field<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ID<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Int<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ObjectType<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">type-graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"p\">@<\/span><span class=\"nd\">ObjectType<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304b\u306b<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nx\">Crab<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Field<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">ID<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Field<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304b\u306b\u306e\u540d\u524d<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\r\n  <span class=\"nx\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Field<\/span><span class=\"p\">({<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304b\u306b\u306e\u8aac\u660e<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"na\">nullable<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/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\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Field<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">Int<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304b\u306b\u306e\u5024\u6bb5<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\r\n  <span class=\"nx\">price<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">;<\/span>\r\n\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Field<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span><span class=\"nb\">String<\/span><span class=\"p\">],<\/span> <span class=\"p\">{<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304b\u306b\u306e\u5931\u3063\u305f\u811a<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"na\">nullable<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"p\">})<\/span>\r\n  <span class=\"nx\">lostLegs<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">[];<\/span>\r\n\r\n  <span class=\"kd\">constructor<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"nl\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"nl\">description<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"nl\">price<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"nl\">lostLegs<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">[];<\/span>\r\n  <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">price<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">price<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">lostLegs<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">lostLegs<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Query<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Resolver<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">type-graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Crab<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/types\/Crab<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">uuid<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">uuid<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"p\">@<\/span><span class=\"nd\">Resolver<\/span><span class=\"p\">(<\/span><span class=\"nx\">Crab<\/span><span class=\"p\">)<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nx\">CrabResolver<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"nx\">kani<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Crab<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"k\">new<\/span> <span class=\"nx\">Crab<\/span><span class=\"p\">({<\/span>\r\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">uuid<\/span><span class=\"p\">.<\/span><span class=\"nx\">v4<\/span><span class=\"p\">(),<\/span>\r\n      <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u30ab\u30cb\u592a\u90ce<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">price<\/span><span class=\"p\">:<\/span> <span class=\"mi\">50000<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u3064\u3088\u3044\u30ab\u30cb<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">lostLegs<\/span><span class=\"p\">:<\/span> <span class=\"p\">[]<\/span>\r\n    <span class=\"p\">}),<\/span>\r\n    <span class=\"k\">new<\/span> <span class=\"nx\">Crab<\/span><span class=\"p\">({<\/span>\r\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">uuid<\/span><span class=\"p\">.<\/span><span class=\"nx\">v4<\/span><span class=\"p\">(),<\/span>\r\n      <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u30ab\u30cb\u6b21\u90ce<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">price<\/span><span class=\"p\">:<\/span> <span class=\"mi\">55000<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u3088\u308a\u3064\u3088\u3044\u30ab\u30cb<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">lostLegs<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\u5de6\u5f8c\u308d\u811a<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"p\">})<\/span>\r\n  <span class=\"p\">];<\/span>\r\n\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Query<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">Crab<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304b\u306b\u306e\u9577\u7537\u3092\u547c\u3076<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">getKani<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">kani<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">];<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"p\">@<\/span><span class=\"nd\">Query<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span><span class=\"nx\">Crab<\/span><span class=\"p\">],<\/span> <span class=\"p\">{<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\u304b\u306b\u306e\u4e00\u65cf\u3092\u547c\u3076<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">getKanis<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">kani<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u524d\u7aef\u5f00\u53d1<\/h1>\n<p>\u521b\u5efa\u524d\u7aef\u9879\u76ee\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">cd..\r\nmkdir frontend\r\ncd frontend\r\n<\/span><\/code><\/pre>\n<h2>\u5b89\u88c5\u6240\u9700\u7684\u8f6f\u4ef6\u5305\u3002<\/h2>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn add apollo-boost graphql isomorphic-fetch mobx mobx-react-lite next react react-dom\r\n\r\nyarn add -D @babel\/core @types\/graphql @types\/node @types\/react @types\/react-dom babel-preset-mobx graphql-tag typescript\r\n<\/span><\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">dependencies<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">apollo-boost<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^0.4.3<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^14.4.2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">isomorphic-fetch<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^2.2.1<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">mobx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^5.11.0<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">mobx-react-lite<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^1.4.1<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">next<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^8.1.1-canary.69<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^16.8.6<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">react-dom<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^16.8.6<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">devDependencies<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">@babel\/core<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^7.5.0<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">@types\/graphql<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^14.2.2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">@types\/node<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^12.0.12<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">@types\/react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^16.8.23<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">@types\/react-dom<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^16.8.4<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">babel-preset-mobx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^2.0.0<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">graphql-tag<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^2.10.1<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">typescript<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^3.5.2<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u56e0\u4e3a\u6211\u5f88\u5f00\u5fc3oao\u4e00\u4e0b\u5b50\u5c31\u53d1\u5c55\u8d77\u6765\u4e86\uff0c\u6240\u4ee5\u63d0\u524d\u51c6\u5907\u597d\u4e86dev\u811a\u672c\uff0c\u867d\u7136\u4e0d\u7528\u5199\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"dl\">\"<\/span><span class=\"s2\">scripts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">dev<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">yarn next<\/span><span class=\"dl\">\"<\/span>\r\n<span class=\"p\">},<\/span>\r\n<\/code><\/pre>\n<h4>\u4f7f\u7528extends\u8bed\u53e5\u7f16\u5199tsconfig.json\u6587\u4ef6\u3002<\/h4>\n<p>\u53ea\u8981\u4f7f\u7528\u4e86Next.js\uff0c\u5e76\u4e14\u52a0\u4e0a\u4e86&#8221;extends&#8221;: &#8220;..\/tsconfig&#8221;\u548c&#8221;experimentalDecorators&#8221;: true\u7684\u914d\u7f6e\uff0c\u8fd0\u884cyarn next\u547d\u4ee4\u540e\uff0ctsconfig.json\u4f1a\u81ea\u52a8\u5b8c\u6210\u3002\u8f93\u51fa\u7ed3\u679c\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">extends<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/tsconfig<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">compilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">experimentalDecorators<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">target<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">es5<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">lib<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">dom<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">dom.iterable<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">esnext<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">skipLibCheck<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">forceConsistentCasingInFileNames<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">module<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">esnext<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">moduleResolution<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">node<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">resolveJsonModule<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">jsx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">preserve<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">exclude<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">node_modules<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">include<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">next-env.d.ts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">**\/*.ts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">**\/*.tsx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u56e0\u4e3a\u60f3\u8981\u4f7f\u7528MobX\uff0c\u6240\u4ee5\u8981\u5728.babelrc\u4e2d\u7a0d\u5fae\u8fdb\u884c\u4e00\u70b9\u7f16\u5199\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">presets<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">next\/babel<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">mobx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u81ea\u52a8\u751f\u6210\u7684\u7c7b\u578b<\/h2>\n<h4>\u5199\u4e00\u4e2a\u53ef\u80fd\u4f1a\u4f7f\u7528\u5230\u7684GraphQL\u67e5\u8be2\u3002<\/h4>\n<p>\u4e8b\u5148\u7f16\u5199\u5e76\u5bfc\u51fa\u9002\u5408\u4f7f\u7528\u7684\u67e5\u8be2\u5230queries\u6587\u4ef6\u5939\u4e0b\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cquery hogehoge\u90e8\u5206\u53ef\u4ee5\u7701\u7565\uff0c\u4f46\u5b83\u5c06\u6210\u4e3a\u751f\u6210\u4e0b\u4e00\u4e2a\u7c7b\u578b\u7684\u540d\u79f0\uff0c\u56e0\u6b64\u6700\u597d\u6dfb\u52a0\u4e0a\u3002\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\u7684\u5199\u6cd5\uff0c\u521b\u5efa\u4e00\u4e2aIDE\u7684\u4ee3\u7801\u6a21\u677f\u4f1a\u4f7f\u5f97\u5de5\u4f5c\u66f4\u52a0\u987a\u5229\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">gql<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">graphql-tag<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">getHello<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">gql<\/span><span class=\"s2\">`\r\n  query getHello {\r\n    sayHello\r\n  }\r\n`<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">getHelloKani<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">gql<\/span><span class=\"s2\">`\r\n    query getHelloKani  {\r\n        sayHello\r\n        sayKani\r\n    }\r\n`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">gql<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">graphql-tag<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">getKaniSay<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">gql<\/span><span class=\"s2\">`\r\n  query getKaniSay {\r\n    sayKani\r\n  }\r\n`<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">getKani<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">gql<\/span><span class=\"s2\">`\r\n  query getKani {\r\n    getKani {\r\n      name\r\n    }\r\n  }\r\n`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<h3>\u5c06graphql-codegen\u5b89\u88c5\u5230\u6839\u76ee\u5f55\u4e0b\u3002<\/h3>\n<p>\u5728\u6839\u76ee\u5f55\u4e0b\uff0c\u5b89\u88c5graphql-codegen\u53ca\u5176\u76f8\u5173\u4f9d\u8d56\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn add -D @graphql-codegen\/cli @graphql-codegen\/typescript @graphql-codegen\/typescript-operations graphql -W\r\n<\/span><\/code><\/pre>\n<h4>\u7f16\u5199graphql-codegen\u7684\u914d\u7f6e<\/h4>\n<p>\u5199\u8bbe\u7f6e\u6587\u4ef6\u662f\u4e00\u9879\u5f88\u68d8\u624b\u7684\u4efb\u52a1\u3002\u6ca1\u6709\u6bd4\u7f16\u5199\u8bbe\u7f6e\u6587\u4ef6\u66f4\u8ba9\u4eba\u72af\u61d2\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">overwrite<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n<span class=\"na\">schema<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">http:\/\/localhost:4000\"<\/span> <span class=\"c1\"># \u30b5\u30fc\u30d0\u306e\u30a2\u30c9\u30ec\u30b9\u3002\u30b5\u30fc\u30d0\u304c\u7acb\u3063\u3066\u3055\u3048\u5165\u308c\u3070\u52dd\u624b\u306b\u30b9\u30ad\u30fc\u30de\u3092\u8aad\u307f\u8fbc\u3093\u3067\u304f\u308c\u308b<\/span>\r\n<span class=\"na\">documents<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">.\/frontend\/queries\/*.ts\"<\/span> <span class=\"c1\"># \u76e3\u8996\u5bfe\u8c61\u3000\u3053\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u66f4\u65b0\u304c\u3042\u308c\u3070\u81ea\u52d5\u7684\u306b\u578b\u3092\u4f5c\u6210<\/span>\r\n<span class=\"na\">generates<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"s\">.\/frontend\/queries\/types.ts<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># \u51fa\u529b\u5148<\/span>\r\n    <span class=\"na\">plugins<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">typescript<\/span> <span class=\"c1\"># \u57fa\u672c\u578b\u3068type\u306e\u578b\u3092\u5410\u304f<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">typescript-operations<\/span> <span class=\"c1\"># \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u305d\u306e\u30af\u30a8\u30ea\u3092\u6295\u3052\u305f\u6642\u306e\u623b\u308a\u5024\u578b\u3092\u4f5c\u6210\u3057\u3066\u304f\u308c\u308b<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4f60\u60f3\u8fdb\u884c\u6df1\u5165\u601d\u8003\uff0c\u90a3\u4e48\u5c31\u8bfb\u8bfb\u6587\u4ef6\u5427\u3002<\/p>\n<h4>\u8fd0\u884cgraphql-codegen\u7684\u89c2\u5bdf\u5668<\/h4>\n<p>\u5b9a\u4e49\u4e00\u4e2a\u540d\u4e3a codegen \u7684\u811a\u672c\u5e76\u8fd0\u884c\u5b83\u3002\u5982\u679c\u6dfb\u52a0 &#8211;watch \u9009\u9879\uff0c\u5b83\u5c06\u81ea\u52a8\u6839\u636e\u66f4\u65b0\u9010\u6e10\u5c06\u7c7b\u578b\u8f93\u51fa\u5230 \/frontend\/queries\/types.ts\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\">\"oao run-script dev --parallel\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"codegen\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"graphql-codegen --config codegen.yml --watch\"<\/span>\r\n  <span class=\"p\">}<\/span><span class=\"err\">,<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn codegen\r\n<\/span><\/code><\/pre>\n<h5>\u6240\u4ea7\u751f\u7684\u7c7b\u578b<\/h5>\n<p>\u5728\u4f7f\u7528\u4e0a\uff0c\u5b83\u662f\u6307\u8fd4\u56de\u503c\u7684\u7c7b\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">Maybe<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">T<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">T<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n<span class=\"cm\">\/** All built-in and custom scalars, mapped to their actual values *\/<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">Scalars<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">ID<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">String<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">Boolean<\/span><span class=\"p\">:<\/span> <span class=\"nx\">boolean<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">Int<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">Float<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"cm\">\/** \u304b\u306b *\/<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">Crab<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">__typename<\/span><span class=\"p\">?:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Crab<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Scalars<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">ID<\/span><span class=\"dl\">\"<\/span><span class=\"p\">];<\/span>\r\n  <span class=\"cm\">\/** \u304b\u306b\u306e\u540d\u524d *\/<\/span>\r\n  <span class=\"nl\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Scalars<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">String<\/span><span class=\"dl\">\"<\/span><span class=\"p\">];<\/span>\r\n  <span class=\"cm\">\/** \u304b\u306b\u306e\u8aac\u660e *\/<\/span>\r\n  <span class=\"nl\">description<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">Maybe<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Scalars<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">String<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"cm\">\/** \u304b\u306b\u306e\u8aac\u660e *\/<\/span>\r\n  <span class=\"nl\">price<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Scalars<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Int<\/span><span class=\"dl\">\"<\/span><span class=\"p\">];<\/span>\r\n  <span class=\"cm\">\/** \u304b\u306b\u306e\u5931\u3063\u305f\u811a *\/<\/span>\r\n  <span class=\"nl\">lostLegs<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">Maybe<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Scalars<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">String<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">Query<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">__typename<\/span><span class=\"p\">?:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Query<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"cm\">\/** \u304b\u306b\u306e\u9577\u7537\u3092\u547c\u3076 *\/<\/span>\r\n  <span class=\"nl\">getKani<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Crab<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"cm\">\/** \u304b\u306b\u306e\u4e00\u65cf\u3092\u547c\u3076 *\/<\/span>\r\n  <span class=\"nl\">getKanis<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Crab<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"cm\">\/** \u3042\u3044\u3055\u3064\u306f\u5927\u4e8b *\/<\/span>\r\n  <span class=\"nl\">sayHello<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Scalars<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">String<\/span><span class=\"dl\">\"<\/span><span class=\"p\">];<\/span>\r\n  <span class=\"cm\">\/** \u304b\u306b\u3082\u3042\u3044\u3055\u3064\u3059\u308b *\/<\/span>\r\n  <span class=\"nl\">sayKani<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Scalars<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">String<\/span><span class=\"dl\">\"<\/span><span class=\"p\">];<\/span>\r\n<span class=\"p\">};<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetHelloQueryVariables<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetHelloQuery<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">__typename<\/span><span class=\"p\">?:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Query<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}<\/span> <span class=\"o\">&amp;<\/span> <span class=\"nb\">Pick<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Query<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sayHello<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetHelloKaniQueryVariables<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetHelloKaniQuery<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">__typename<\/span><span class=\"p\">?:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Query<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}<\/span> <span class=\"o\">&amp;<\/span> <span class=\"nb\">Pick<\/span><span class=\"o\">&lt;<\/span>\r\n  <span class=\"nx\">Query<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">sayHello<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">|<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sayKani<\/span><span class=\"dl\">\"<\/span>\r\n<span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetKaniSayQueryVariables<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetKaniSayQuery<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">__typename<\/span><span class=\"p\">?:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Query<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}<\/span> <span class=\"o\">&amp;<\/span> <span class=\"nb\">Pick<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Query<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sayKani<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetKaniQueryVariables<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">GetKaniQuery<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">__typename<\/span><span class=\"p\">?:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Query<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}<\/span> <span class=\"o\">&amp;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">getKani<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">__typename<\/span><span class=\"p\">?:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Crab<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}<\/span> <span class=\"o\">&amp;<\/span> <span class=\"nb\">Pick<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Crab<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">name<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<h3>\u5199\u5ba2\u6237<\/h3>\n<p>&#8220;apollo-boost&#8221;\u7684ApolloClient\u5728\u670d\u52a1\u5668\u7aef\u548c\u5ba2\u6237\u7aef\u4f7f\u7528\u4e0d\u540c\u7684\u7f13\u5b58\u548c\u6d4f\u89c8\u5668\u7684fetch\u548cNode\u7684fetch\u4e4b\u7c7b\u7684\u4e1c\u897f\uff0c\u6240\u4ee5\u5f88\u5bb9\u6613\u5f15\u53d1\u4e0d\u660e\u6240\u4ee5\u7684\u9519\u8bef\u3002\u7279\u522b\u662f\u5faa\u73af\u5f15\u7528\u4e4b\u7c7b\u7684\u6211\u4e5f\u4e0d\u592a\u61c2\uff0c\u6240\u4ee5\u6211\u5199\u4e86\u4e00\u79cd\u6211\u89c9\u5f97\u53ef\u80fd\u884c\u5f97\u901a\u7684\u65b9\u6cd5\u3002\u76f8\u6bd4\u4e8e\u4f7f\u7528apollo-boost\u4e2d\u7684ApolloClient\uff0c\u4f7f\u7528\u4e0d\u662fapollo-boost\u7684apollo-client\u7684ApolloClient\u53ef\u80fd\u5199\u8d77\u6765\u4e0d\u90a3\u4e48\u65b9\u4fbf\uff0c\u4f46\u53ef\u4ee5\u66f4\u6e05\u695a\u5730\u7406\u89e3\u5176\u4e2d\u7684\u7ec6\u8282\u3002\u867d\u7136\u6211\u4e0d\u592a\u786e\u5b9a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">ApolloClient<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">apollo-boost<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">isomorphic-fetch<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nx\">Client<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">static<\/span> <span class=\"k\">readonly<\/span> <span class=\"nx\">uri<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">http:\/\/localhost:4000<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n  <span class=\"c1\">\/\/\u30b5\u30fc\u30d0\u30fc\u306a\u3089\u547c\u3093\u3067\u3082\u554f\u984c\u306a\u3044\u30af\u30e9\u30a4\u30a2\u30f3\u30c8<\/span>\r\n  <span class=\"k\">private<\/span> <span class=\"k\">static<\/span> <span class=\"nx\">serverCLient<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">ApolloClient<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">uri<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Client<\/span><span class=\"p\">.<\/span><span class=\"nx\">uri<\/span>\r\n  <span class=\"p\">});<\/span>\r\n\r\n  <span class=\"c1\">\/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3067\u547c\u3070\u308c\u308b\u65e5\u306b\u306f\u5b89\u5fc3\u306a\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\uff1f<\/span>\r\n  <span class=\"k\">private<\/span> <span class=\"k\">static<\/span> <span class=\"nx\">clientClient<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ApolloClient<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">any<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n\r\n  <span class=\"k\">public<\/span> <span class=\"k\">static<\/span> <span class=\"kd\">get<\/span> <span class=\"nx\">client<\/span><span class=\"p\">():<\/span> <span class=\"nx\">ApolloClient<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">any<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">browser<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">serverCLient<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">clientClient<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">clientClient<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">ApolloClient<\/span><span class=\"p\">({<\/span> <span class=\"na\">uri<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Client<\/span><span class=\"p\">.<\/span><span class=\"nx\">uri<\/span> <span class=\"p\">});<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">clientClient<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5199\u5546\u5e97 (xi\u011b<\/h3>\n<p>import * as QueryType from &#8220;..\/queries\/types&#8221; \u662f\u4e00\u4e2a\u81ea\u52a8\u751f\u6210\u7684\u8fd4\u56de\u503c\u7c7b\u578b\u3002\u591a\u4e8f\u5b83\uff0cIDE\u7684\u81ea\u52a8\u8865\u5168\u529f\u80fd\u66f4\u52a0\u987a\u7545\u65b9\u4fbf\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">observable<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">mobx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Client<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/lib\/client<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getHello<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/queries\/hello<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">kaniQuery<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/queries\/kani<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">QueryType<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/queries\/types<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kr\">interface<\/span> <span class=\"nx\">PageModel<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">text<\/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=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nx\">PageController<\/span> <span class=\"k\">implements<\/span> <span class=\"nx\">PageModel<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"p\">@<\/span><span class=\"nd\">observable<\/span> <span class=\"nx\">text<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">;<\/span>\r\n\r\n  <span class=\"kd\">constructor<\/span><span class=\"p\">(<\/span><span class=\"nx\">model<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PageModel<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">text<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">initialize<\/span><span class=\"p\">(<\/span><span class=\"nx\">model<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">initialize<\/span><span class=\"p\">(<\/span><span class=\"nx\">model<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PageModel<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">model<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">fetchKani<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">res<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">Client<\/span><span class=\"p\">.<\/span><span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nx\">query<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">QueryType<\/span><span class=\"p\">.<\/span><span class=\"nx\">GetKaniQuery<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">({<\/span>\r\n      <span class=\"na\">query<\/span><span class=\"p\">:<\/span> <span class=\"nx\">kaniQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">getKani<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">getKani<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">fetchKaniSay<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">res<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">Client<\/span><span class=\"p\">.<\/span><span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nx\">query<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">QueryType<\/span><span class=\"p\">.<\/span><span class=\"nx\">GetKaniSayQuery<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">({<\/span>\r\n      <span class=\"na\">query<\/span><span class=\"p\">:<\/span> <span class=\"nx\">kaniQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">getKaniSay<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">sayKani<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">fetchHello<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">res<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">Client<\/span><span class=\"p\">.<\/span><span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nx\">query<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">QueryType<\/span><span class=\"p\">.<\/span><span class=\"nx\">GetHelloQuery<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">({<\/span>\r\n      <span class=\"na\">query<\/span><span class=\"p\">:<\/span> <span class=\"nx\">getHello<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">sayHello<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u5199\u9875\u9762<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">NextPage<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Observer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">mobx-react-lite\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PageController<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PageModel<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/store\/pageController<\/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=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Index<\/span><span class=\"p\">:<\/span> <span class=\"nx\">NextPage<\/span><span class=\"o\">&lt;<\/span><span class=\"p\">{<\/span> <span class=\"na\">model<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PageModel<\/span> <span class=\"p\">}<\/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=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">controller<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nx\">PageController<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">model<\/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=\"nt\">button<\/span>\r\n        <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">fetchHello<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\r\n      <span class=\"p\">&gt;<\/span>\r\n        \u3078\u308d\u30fc\r\n      <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\">button<\/span>\r\n        <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">fetchKani<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\r\n      <span class=\"p\">&gt;<\/span>\r\n        \u30ab\u30cb\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Observer<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">text<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nc\">Observer<\/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\">Index<\/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=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">controller<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">PageController<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"k\">await<\/span> <span class=\"nx\">controller<\/span><span class=\"p\">.<\/span><span class=\"nx\">fetchKaniSay<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">model<\/span><span class=\"p\">:<\/span> <span class=\"nx\">controller<\/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\">Index<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u56e0\u4e3aNext\u7684getInitialProps\u53ea\u80fd\u4f20\u9012\u7b80\u5355\u7684\u5bf9\u8c61\uff0c\u6240\u4ee5\u9700\u8981\u5728\u8fd9\u91cc\u505a\u4e00\u4e9b\u9002\u5e94\u7684\u5904\u7406\u3002<\/p>\n<h2>\u542f\u52a8\u524d\u7aef\u670d\u52a1\u5668<\/h2>\n<p>\u5982\u679c\u4e4b\u524d\u7684GraphQL\u670d\u52a1\u5668\u5df2\u7ecf\u542f\u52a8\u4e86\uff0c\u53ea\u8981\u5728\u524d\u7aef\u8fd0\u884c `yarn dev`\uff0cNext\u5c31\u4f1a\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">yarn dev\r\n<\/span><\/code><\/pre>\n<p>\u5982\u679c\u4f60\u521a\u624d\u5173\u95ed\u4e86GraphQL\u670d\u52a1\u5668\uff0c\u5219\u53ef\u4ee5\u5728\u6839\u76ee\u5f55\u4e0b\u8fd0\u884cyarn dev\u6765\u542f\u52a8\uff0c\u5c31\u50cf\u5f00\u5934\u4e00\u6837\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u8981\u6982\u8ff0 \u4f60\u8981\u505a\u4ec0\u4e48 \u5efa\u7acb\u4e00\u4e2a\u7c7b\u4f3c\u4e8eYarn Workspace\u7684Monorepo\u9879\u76ee\u3002 \u4f7f\u7528oao\uff0c\u4f7f\u5f97\u53ef\u4ee5 [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47749","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>\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7 - 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\/\u642d\u5efa\u597dnext-js\u670d\u52a1\u5668\u548cgraphql\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528typescript\u7ec3\u4e60graphql\u5f00\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7\" \/>\n<meta property=\"og:description\" content=\"\u7b80\u8981\u6982\u8ff0 \u4f60\u8981\u505a\u4ec0\u4e48 \u5efa\u7acb\u4e00\u4e2a\u7c7b\u4f3c\u4e8eYarn Workspace\u7684Monorepo\u9879\u76ee\u3002 \u4f7f\u7528oao\uff0c\u4f7f\u5f97\u53ef\u4ee5 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u642d\u5efa\u597dnext-js\u670d\u52a1\u5668\u548cgraphql\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528typescript\u7ec3\u4e60graphql\u5f00\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-12T04:12:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T01:14:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d80ab913a08637a6aad31\/4-0.gif\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\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\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/\",\"name\":\"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-01-12T04:12:21+00:00\",\"dateModified\":\"2024-04-30T01:14:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7\"}]},{\"@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\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7 - 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\/\u642d\u5efa\u597dnext-js\u670d\u52a1\u5668\u548cgraphql\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528typescript\u7ec3\u4e60graphql\u5f00\/","og_locale":"zh_CN","og_type":"article","og_title":"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7","og_description":"\u7b80\u8981\u6982\u8ff0 \u4f60\u8981\u505a\u4ec0\u4e48 \u5efa\u7acb\u4e00\u4e2a\u7c7b\u4f3c\u4e8eYarn Workspace\u7684Monorepo\u9879\u76ee\u3002 \u4f7f\u7528oao\uff0c\u4f7f\u5f97\u53ef\u4ee5 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u642d\u5efa\u597dnext-js\u670d\u52a1\u5668\u548cgraphql\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528typescript\u7ec3\u4e60graphql\u5f00\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-01-12T04:12:21+00:00","article_modified_time":"2024-04-30T01:14:17+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d80ab913a08637a6aad31\/4-0.gif"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/","name":"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-01-12T04:12:21+00:00","dateModified":"2024-04-30T01:14:17+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u642d\u5efa\u597dNext.js\u670d\u52a1\u5668\u548cGraphQL\u670d\u52a1\u5668\uff0c\u6109\u5feb\u5730\u7528TypeScript\u7ec3\u4e60GraphQL\u5f00\u53d1\u6280\u5de7"}]},{"@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\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%90%ad%e5%bb%ba%e5%a5%bdnext-js%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8cgraphql%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e6%84%89%e5%bf%ab%e5%9c%b0%e7%94%a8typescript%e7%bb%83%e4%b9%a0graphql%e5%bc%80\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47749","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\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47749"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47749\/revisions"}],"predecessor-version":[{"id":91021,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47749\/revisions\/91021"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}