在10分钟内搭建【Next.js/Hasura】GraphQL环境
首先
最近GraphQL在中国变得非常受欢迎。
之前在实习时有机会使用Hasura,以极快的速度建立了GraphQL环境。
虽然最后项目采用了Nest.js而没有使用Hasura,但总的来说,对于个人开发来说,很少有比这更方便的选择了。
环境建立
获取 Hasura
立即从Hasura官方网站下载docker-compose.yml文件。下面的命令是使用wget示例,也支持curl。
wget https://raw.githubusercontent.com/hasura/graphql-engine/stable/install-manifests/docker-compose/docker-compose.yaml
从下载的文件中取消注释HASURA_GRAPHQL_ADMIN_SECRET,并将其替换为任意值。此值将成为前端与后端进行通信时的SecretToken。
- ## HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
+ HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
创建Next.js应用
将下面的服务添加到先前下载的文件中,以供next.js使用。将以下服务添加到services项目中。将node版本和端口更改为任意值。在示例中,node版本为18,端口为3000。
web:
image: node:18
restart: always
volumes:
- .:/opt/web
working_dir: /opt/web
ports:
- "3000:3000"
tty: true
当您能够添加服务时,请使用以下命令启动容器集合。
docker-compose up
# docker-compose up -d //バックグラウンドでの実行
一旦容器启动,进入web容器并创建next.js应用程序。默认设置在创建应用程序时没有问题。建议根据所使用的服务进行适时更改。
docker-compose exec web bash
npx create-next-app@latest
当您完成了Next.js应用的创建后,可以在容器中移动项目文件。这样做是为了将docker-compose.yml文件所在的目录与项目目录置于同一级别。如果不迁移项目目录,则需要修改docker-compose.yml文件中web服务的volumes。
mv $app_name .
rm -r $app_name
由于当前创建的文件都是以root权限创建的,所以需要更改项目目录及其以下文件的权限。前往项目目录所在的层级,并使用下面的命令进行权限更改。如果不更改权限,在每次文件更改时都会被要求输入密码,十分麻烦。
sudo chmod 755 -R app_name
sudo chown $USER:$USER -R app_name
最后,我们将在docker-compose.yml文件中设置命令,以便在启动容器时运行next.js服务器,并进行相应的修改。我们将修改之前添加的web服务的某些部分。
- tty: true
+ command: npm run start
使用Next.js与Hasura进行连接。
使用Appolo Client在Next.js中连接到Hasura。在web容器中使用以下命令安装graphql和apollo client。
npm i @apollo/client graphql
安装完成后,将与Hasura连接所需的信息整理到.env文件中。将NEXT_PUBLIC_HASURA_ADMIN_SECRET的值填入docker-compose.yml文件中指定的值。
NEXT_PUBLIC_GRAPHQL_ENDPOINT = http://localhost:8080/v1/graphql
NEXT_PUBLIC_HASURA_ADMIN_SECRET = myadminsecretkey
为了连接到Hasura,需要在Apollo Client的provider中进行设置。在headers中设置x-hasura-admin-secret。
import "@/styles/globals.css";
import {
ApolloClient,
ApolloProvider,
InMemoryCache,
createHttpLink,
} from "@apollo/client";
import { setContext } from "@apollo/client/link/context";
import type { AppProps } from "next/app";
const httpLink = createHttpLink({
uri: process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT,
});
const authLink = setContext((_, { headers }) => {
return {
headers: {
...headers,
"x-hasura-admin-secret": process.env.NEXT_PUBLIC_HASURA_ADMIN_SECRET,
},
};
});
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache(),
});
export default function App({ Component, pageProps }: AppProps) {
return (
<ApolloProvider client={client}>
<Component {...pageProps} />
</ApolloProvider>
);
}
小礼物
ChakraUI的配置设置
在 web 容器中安装 ChakraUI。
npm i @chakra-ui/react @chakra-ui/next-js @emotion/react @emotion/styled framer-motion
为了使用ChakraUI,需要在_app.tsx文件中进行Provider的配置。
+ import { ChakraProvider } from "@chakra-ui/react";
export default function App({ Component, pageProps }: AppProps) {
return (
+ <ChakraProvider>
<ApolloProvider client={client}>
<Component {...pageProps} />
</ApolloProvider>
+ </ChakraProvider>
);
}
最后
在上述步骤中,GraphQL环境已经建立完成。实际上,当访问http://localhost:3000时,可以访问到next.js;当访问http://localhost:8080时,可以访问到Hasura。
祝您有一个美好的工程师生活。