禁用Introspection时,如何在生产环境用code-gen生成类型?
针对你的场景,有几个实用的方案可以实现Docker构建时生成类型,无需提交code-gen输出到仓库:
方案一:开发阶段导出Schema文件,Docker构建时本地生成(推荐)
核心思路是在开发环境利用自省导出完整的GraphQL Schema文件,将这个源文件提交到仓库,Docker构建时基于本地Schema生成类型,完全不依赖生产环境的自省接口。
步骤:
开发环境导出Schema
执行命令导出开发环境API的Schema到本地文件(比如schema.graphql):npx graphql-codegen introspect-schema http://your-dev-api/graphql --output schema.graphql将生成的
schema.graphql加入Git版本控制。修改code-gen配置
调整codegen.ts,将Schema来源从远程API地址改为本地文件:import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { schema: './schema.graphql', // 指向本地Schema文件 documents: ['./src/**/*.graphql', './src/**/*.{ts,tsx}'], // 扫描你的GraphQL查询/突变文件 generates: { './src/generated/graphql.ts': { plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'], }, }, }; export default config;Dockerfile中添加生成步骤
在构建镜像时,先安装依赖,再运行code-gen生成类型,最后构建Next.js应用:FROM node:20-alpine WORKDIR /app # 复制依赖配置文件,利用Docker缓存 COPY package*.json ./ RUN npm ci # 复制项目代码(包括schema.graphql和code-gen配置) COPY . . # 运行code-gen生成类型文件 RUN npm run codegen # 构建Next.js生产包 RUN npm run build CMD ["npm", "start"]
方案二:给生产API的自省接口加IP白名单
如果生产API是你们团队维护的,可以给自省接口添加IP权限控制,仅允许Docker构建服务器的IP访问,这样构建时就能直接从生产API获取Schema生成类型。
步骤:
配置API的自省权限
在GraphQL API的服务端(比如Apollo Server)中,添加IP白名单逻辑,只有Docker构建环境的IP能触发自省查询。通过环境变量切换Schema来源
修改codegen.ts支持环境变量指定Schema地址:import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { schema: process.env.GRAPHQL_API_URL || './schema.graphql', documents: ['./src/**/*.graphql', './src/**/*.{ts,tsx}'], generates: { './src/generated/graphql.ts': { plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'], }, }, }; export default config;Docker构建时传入生产API地址
在Dockerfile中设置环境变量,运行code-gen:FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . # 设置生产API地址,确保构建服务器IP在白名单内 ENV GRAPHQL_API_URL=https://your-production-api/graphql RUN npm run codegen RUN npm run build CMD ["npm", "start"]
方案三:共享API的Schema源码(适用于API和前端同团队)
如果GraphQL API也是你们开发的,可以直接将API的Schema源码(比如.graphql文件或定义Schema的TypeScript文件)共享给前端项目:
- 将API的Schema作为私有npm包发布,前端项目安装该包
- 或者直接将Schema文件复制到前端项目目录
- 然后修改code-gen配置指向这个共享的Schema文件,后续构建流程和方案一一致
内容的提问来源于stack exchange,提问作者kakakakakakakk

