在Next.js 9中,用3分钟从头搭建一个TypeScript的React服务器和GraphQL服务器

简而言之

Next.js 9のAPI RouteにGraphQLのエンドポイントを生やします
Next.jsもGraphQLもTypescriptで書けます

做法

1. 安装所需的软件包

yarn add apollo-server-micro graphql micro next@latest react@latest react-dom@latest
yarn add -D typescript @types/react

2. 随意地制作主页。

创建pages/index.tsx并随意地设置主页。将文件扩展名设为tsx,这样Next.js 9会自动为我们准备好Typescript的tsconfig.json配置文件。

如果你想要寻求速度⚡️,在编写tsconfig.json之前,请启动服务器

一个例子是随便的主页。

export default ()=>(
    <p>ほげ</p>
)

只需将React组件导出为`export default`,它就会被发布。而像图片等文件,只需简单地放置在`/static`目录下即可发布。

开启服务器
yarn next
第一次终端日志的示例。
~/W/next9 graphql ❯❯❯ yarn next
yarn run v1.15.2
warning package.json: No license field
$ '/███████████/██████████/next9 graphql/node_modules/.bin/next'
[ wait ]  starting the development server ...
[ info ]  waiting on http://localhost:3000 ...
We detected TypeScript in your project and created a tsconfig.json file for you.

Your tsconfig.json has been populated with default values.

[ info ]  bundled successfully, waiting for typecheck results ...
[ ready ] compiled successfully (ready on http://localhost:3000)
スクリーンショット 2019-07-09 13.55.19.png

从 Next.js 9 开始,当服务器上进行预渲染时,页面右下角会显示⚡️标志。

3. 随便搭建一个GraphQL服务器

/pages/api下面可以创建API的端点。建立一个GraphQL的模拟服务器。

import { ApolloServer, gql } from 'apollo-server-micro';

// ここからGraphQLのモックの定義
const typeDefs = gql`
    type Query {
        hello: String
    }
`;

const resolvers = {
    Query: {
        hello: () => 'world',
    },
};

const apolloServer = new ApolloServer({ typeDefs, resolvers });

// ここから先はNext.jsが読みに行く領域
export default apolloServer.createHandler({path:"/api"});
export const config = {
    api: {
        bodyParser: false,
    },
};

在服务器重启之前,API已经启动了。

スクリーンショット 2019-07-09 13.59.28.png

??開心??

从这里开始,你可以选择安装ApolloClient或者搭建一个非模拟的GraphQL服务器来实现。

请参考:Apollo Client + React 基础教程。

结束


点数

在编写tsconfig之前,先启动服务器吧。

从Next.js 9开始,如果在Next.js可见的地方放置了tsx文件,它会自动创建以下tsconfig.json文件。如果想尽快启动项目,建议先进行tsc –init,然后再安装next。

简单来说,只需编写pages/index.tsx。

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve"
  },
  "exclude": [
    "node_modules"
  ],
  "include": [
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx"
  ]
}

我們在apollo-server中使用了適用於微服務的版本。

只需将接收(req, res)参数的函数默认导出到pages/api下面,就可以建立一个API服务器。

export default (req, res) => {
  res.setHeader('Content-Type', 'application/json')
  res.statusCode = 200
  res.end(JSON.stringify({ name: 'Nextjs' }))
}

如果您在/pages/api中使用Zeit的micro来创建微服务,相比于修改默认的res,req(并且中间件已经加载了一些),我认为会更加繁忙。这是一个令人愉快的选择。

参考:next.js/examples/api-routes-micro/

就这样,我可以从API路由的外观中看出,apollo-server-Nanchala很可能使用了apollo-server-micro。然而,在启动GraphQL服务器时,有两个令人困惑的地方。

1. 确保正确地指定了GraphQL服务器的路径。

apollo-server默认尝试在本地localhost:3000/graphql上启动服务器。

Next.js 9对于API的设置只能在本地主机的localhost:3000/api下进行,因此我们需要在apollo-server-micro的createHandler中添加选项来完成这个功能。

const apolloServer = new ApolloServer({ typeDefs, resolvers });

const handler = apolloServer.createHandler({path:"/api"});

如果将该处理程序设为默认导出,认为GraphQL服务器会运行起来,但事实并非如此。

陷入困境。输出常量配置={选项}必须要做好。
export default handler;

尽管GraphQL Playground正在运行,看起来API似乎正常工作,但无法下载模式并且无法发送查询,功能并不正常。

根据我的理解,似乎是由于Next.js 9自动设置的bodyParser引起了这个问题。我浪费了好几个小时来解决它。

Next.js 9的API路由内置了一些中间件(例如cookie、query和body等),其中,bodyParser默认为启用状态,并解析req。

然而,在API下,有一种方法可以将设置传递给Next.js 9,这样就可以发送查询并下载模式。以下的config是预先确定的。

export default apolloServer.createHandler({path:"/api"});

export const config = {
    api: {
        bodyParser: false,
    },
};

参考 next.js/examples/api-routes-graphql/。

总结

    恐ろしく楽チンにNextのサーバーとGraphQLのサーバを立てられるようになった。
广告
将在 10 秒后关闭
bannerAds