webpack打包apollo-server-lambda出现Expected [object] to be a GraphQL schema错误
问题排查解决步骤
- 优先开启
webpack-node-externals排除node_modules依赖:你当前配置中注释了externals: [nodeExternals()]配置项,开启后webpack打包时不会将node_modules内的依赖打包到最终产物中,直接保留require语句在运行时加载,从根源避免打包过程中产生多份graphql代码副本、类实例上下文隔离导致的instanceof校验失败问题。开启后部署Lambda时需要将项目根目录的node_modules文件夹和打包产出的.dist目录一同上传。 - 修正graphql别名配置:你当前使用的精确匹配规则
graphql$只会匹配直接import 'graphql'的语句,无法匹配import 'graphql/type'这类子路径导入,修改resolve.alias配置为:
alias: { graphql: path.resolve(__dirname, './node_modules/graphql'), }
移除精确匹配符$,确保所有graphql相关导入都指向同一份本地安装的依赖。
- 校验Schema工具依赖版本:确认你使用的Schema生成、合并工具(比如
@graphql-tools/merge、apollo-server-core等)的嵌套graphql依赖版本和项目根目录安装的graphql@15.5.1一致,执行对应包的npm ls <包名>命令即可查看嵌套依赖版本,若存在版本差异可以用package.json的resolutions字段强制统一graphql版本。 - 排除压缩混淆干扰:将webpack的
mode临时改为development关闭压缩混淆,打包后本地模拟Lambda运行验证是否报错,如果dev模式下运行正常,说明production模式的压缩逻辑破坏了GraphQL Schema的内部标识属性,可以添加压缩排除规则,不对graphql相关模块执行混淆压缩。 - 补充强制路径重定向配置:如果你的部署场景要求必须打包为单文件、不能携带node_modules,可以在webpack配置中添加插件强制所有graphql导入指向同一份文件:
const webpack = require('webpack') // 在config对象中添加plugins配置 plugins: [ new webpack.NormalModuleReplacementPlugin(/^graphql$/, path.resolve(__dirname, './node_modules/graphql/index.js')), new webpack.NormalModuleReplacementPlugin(/^graphql\/.+/, path.resolve(__dirname, './node_modules/graphql/')), ]
内容的提问来源于stack exchange,提问作者user1148920
相关产品推荐
相关产品推荐

