如何在构建时从Gatsby项目中移除指定插件?
解决Gatsby多站点构建时移除特定插件的方案
直接修改gatsby-config.js的插件导出逻辑是最靠谱的方式,比修改store或者用预构建脚本更优雅,具体可以这么做:
方法一:动态生成插件列表(推荐)
Gatsby允许gatsby-config.js导出一个函数,你可以根据当前构建的站点标识(比如环境变量)来动态过滤插件:
场景1:插件是字符串形式
// gatsby-config.js module.exports = () => { // 定义所有通用插件 const corePlugins = [ 'gatsby-plugin-react-helmet', 'gatsby-plugin-to-customize', 'plugin-I-do-not-want' // 需要按需移除的插件 ]; // 根据环境变量判断当前站点,比如构建特定站点时移除目标插件 const targetSite = process.env.BUILD_SITE; let plugins = corePlugins; if (targetSite === 'my-special-site') { plugins = corePlugins.filter(plugin => plugin !== 'plugin-I-do-not-want'); } return { plugins }; };
场景2:插件是带配置的对象形式
如果你的插件是用resolve和options定义的,只需要过滤resolve字段即可:
// gatsby-config.js module.exports = () => { const corePlugins = [ { resolve: 'gatsby-plugin-react-helmet', options: { /* 配置项 */ } }, { resolve: 'plugin-I-do-not-want', options: { /* 配置项 */ } } ]; const targetSite = process.env.BUILD_SITE; let plugins = corePlugins; if (targetSite === 'my-special-site') { plugins = corePlugins.filter(plugin => plugin.resolve !== 'plugin-I-do-not-want'); } return { plugins }; };
构建时只需要指定环境变量即可,比如:
BUILD_SITE=my-special-site gatsby build
为什么之前修改state.flattenedPlugins没用?
Gatsby的插件加载流程是在onPreInit钩子之前完成的,当你在onPreInit里修改store的flattenedPlugins时,插件已经被初始化并注册了,所以这个修改不会生效。
内容的提问来源于stack exchange,提问作者Félix Paradis
相关产品推荐
相关产品推荐

