Gatsby v4依赖包中静态GraphQL查询未被替换问题问询
问题原因
你遇到的报错本质是Gatsby的babel编译流程没有处理你依赖包中的代码,导致graphql标签调用没有在编译期被替换为静态查询结果,运行时执行graphql函数就触发了报错,哪怕查询已经被提取成功也无法生效。
解决方案
方案1:标记依赖为Gatsby兼容包
如果你是依赖包的维护者,直接在依赖包的package.json中添加"gatsby": {}字段即可,Gatsby会自动识别这类包,将其纳入编译和查询处理流程,无需额外站点侧配置。修改依赖包配置重新发布后,在站点中更新依赖版本,执行gatsby clean清除缓存后重启服务即可生效。
方案2:站点侧配置编译指定依赖
如果没有修改依赖包的权限,可以在站点中添加配置让Gatsby编译该依赖:
- 安装编译插件:
npm install gatsby-plugin-compile-es6-packages --save - 在
gatsby-config.js中添加插件配置,将your-package-name替换为实际的依赖包名:
module.exports = { plugins: [ { resolve: `gatsby-plugin-compile-es6-packages`, options: { modules: [`your-package-name`] } } ] }
- 执行
gatsby clean && gatsby develop重启服务验证。
方案3:自定义babel全局配置
在站点根目录创建babel.config.js(不要用.babelrc,后者默认仅处理项目src目录代码),添加如下配置:
const path = require('path') module.exports = { presets: ["babel-preset-gatsby"], include: [ // 替换为你的依赖包路径 path.resolve(__dirname, "node_modules/your-package-name") ] }
配置完成后同样清除缓存重启服务即可。
注意事项
如果你是依赖包的维护者,发布依赖时不要提前转译gatsby相关的语法,要保留graphql模板字符串和useStaticQuery调用的原始形态,交由安装依赖的站点侧Gatsby流程处理。
内容的提问来源于stack exchange,提问作者raddevon
相关产品推荐
相关产品推荐

