如何打破webpack挂钩中的循环

时间:2019-06-18 23:13:27

标签: javascript node.js vue.js webpack nuxt.js

我正在使用nuxt.js项目,我需要在每个更改的文件(即每个Webpack构建)上运行Shell脚本。

所以我正在使用Webpack Hooks

我创建了Webpack Plugin

/plugins/NamedExports.js

const pluginName = 'NamedExports'
const { exec } = require('child_process')

class NamedExports {
  apply(compiler) {
    compiler.hooks.beforeCompile.tap(pluginName, (params, callback) => {
      exec('sh plugins/shell.sh', (err, stdout, stderr) => {
        console.log(stdout)
        console.log(stderr)
      })
    })
  }
}

export default NamedExports

plugins/shell.js

parameters=$(ls components)
for item in ${parameters[*]}
do
    ls components/$item/ | grep -v index.js | sed 's#^\([^.]*\).*$#export { default as \1 } from "./&"#' > components/$item/index.js
done

echo "worked"

此脚本用于在组件目录的每个文件夹中进行命名导出,例如

components/atoms/ButtonStyled.vue components/atoms/BoxStyled.vue

然后生成components/atoms/index.js

export { default as ButtonStyled } from "./ButtonStyled.vue"
export { default as BoxStyled } from "./BoxStyled.vue"

我在nuxt.config.nuxtwebpack.config.js中注册了插件

import NamedExports from './plugins/NamedExports.js'

export default {
  // ... other config here ...
  build: {
    plugins: [
      // ... other plugins here ...
      new NamedExports()
    ],
  }
}

但是当我运行我的应用程序并更改任何文件时,服务器会说对components/atoms/index.js进行了更改,然后完成了新的构建,因此它得到了无限的构建。

有人可以帮我打破这个循环吗?

何时更改文件,只需生成新的index.js而不生成无限的构建

预先感谢

2 个答案:

答案 0 :(得分:1)

我创建了一个图书馆并解决了我的问题,下面是链接,也许可以帮助其他人。

Weback Plugin - named-exports

答案 1 :(得分:0)

问题显然是新文件重新触发了构建。从概念上讲,有几种解决方法。

1)如果文件已更新,请不要输出新文件。您需要为此比较时间戳。可能会很混乱。

2)编写一个加载程序。匹配components/**/index.js,为其输出正确的JavaScript。确保无状态。即不要输出另一个文件,只是一个字符串。

然后将虚拟文件放在每个目录中,并带有注释,该注释由webpack插件自动生成。

如果您的虚拟文件告诉webpack如何生成它,甚至更好。

https://webpack.js.org/contribute/writing-a-loader/