【问题标题】:How to write Webpack plugin which adds modules to the bundle on the fly based on other modules?如何编写基于其他模块动态添加模块到包中的 Webpack 插件?
【发布时间】:2017-06-11 16:34:08
【问题描述】:

我在为翻译服务编写 Webpack 插件时遇到问题。

目标是:

  1. 在编译期间获取所有必需模块的名称(和源代码)。我需要能够扫描包含的源代码以了解特殊的 t() 函数用法,但我只想扫描那些将包含在包中的模块(根据构建配置,这些模块可以是所有项目模块的子集) .
  2. 基于收集的模块,我想动态创建其他模块(带有翻译)并将它们添加到包中。这些模块需要能够导入自己的依赖项。

另一个要求是 Webpack 的代码拆分功能应该与动态创建的模块一起使用(我想将它们提取到单独的文件中——例如 bundle.[lang].js)。另外,这可能超出了这个问题的范围,我必须将这些带有翻译的块设为可选(因此您不必加载所有语言,而只需加载一种语言)。

更多详情请见https://github.com/ckeditor/ckeditor5/issues/387

我一直在尝试多种解决方案,但 Webpack 2 的文档并不是很有帮助。我可以通过监听模块解析挂钩 (before-resolve) 来获取所有模块,但我不知道所有依赖项何时解决,我不知道之后是否可以添加更多模块(以及如何做到这一点– addEntry 可以吗?什么时候可以使用?)。

我也在考虑连接 Webpack 插件和 Webpack 加载器(因为我需要的功能与 Webpack's style-loader 非常相似),但是从插件级别我只能添加加载器的路径,而不是加载器本身,所以我不能将配置对象作为参数传递——我错了吗?

附言。我使用的是 Webpack 2。如果您觉得这些要求很奇怪,请参阅 https://github.com/ckeditor/ckeditor5/issues/387 :)。

【问题讨论】:

  • 如果您说“取决于构建配置”,您的意思是在您的 webpack.config 文件之一中设置了什么?还是仅仅基于它提供的代码?此外,您可以构建您的语言。动态地打包“require”,我认为使用npmjs.com/package/string-replace-loader
  • 不幸的是,输出文件应该基于代码创建,所以依赖webpack.config.js文件的所有方法都不能让我满意。字符串替换也不是一种选择,因为我想一次为每种语言创建翻译文件。
  • 这么多的问题赞成,但没有答案!!!!

标签: webpack webpack-2 webpack-plugin


【解决方案1】:

这是一个非常复杂的问题,但我可以展示如何将其他依赖项添加到特定模块,就好像该模块需要这些依赖项一样。这可确保您添加的模块位于正确的块中,并且如果从包中删除父模块,也会将其删除。

const CommonJsRequireDependency = require("webpack/lib/dependencies/CommonJsRequireDependency")

class MyPlugin {
  apply(compiler) {
    compiler.plugin("compilation", compilation => {
      compilation.plugin("succeed-module", module => {
        // this will be called for every successfully built module, but before it's parsed and
        // its dependencies are built. The built source is available as module._source.source()
        // and you can add additional dependencies like so:
        module.dependencies.push(new CommonJsRequireDependency("my-dependency", null))
      }
    }
  }
}

这只是其中的一部分。您可能还需要编写自己的加载器来实际生成翻译(您可以将上面的 my-dependency 替换为 my-loader!path/to/module 以立即调用它)并在创建块之后的某个步骤可能将它们提取到新资产中并加载它们,因为它们实际上并不是任何地方的required。

【讨论】:

  • 我尝试添加这种依赖。似乎所有模块都已创建。但我错过了和谐导入部分,如下所示。这将在执行整个捆绑包时导致依赖性问题。因为某些子依赖项可能还没有为父模块准备好。 /* 和谐导入 / var xxx_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/!./xxx.js */ "./src/xxx.js");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2021-09-02
  • 2021-10-22
  • 2018-06-05
相关资源
最近更新 更多