Webpack插件:如何动态地将模块添加到主Chunk?

fel*_*osh 6 javascript webpack webpack-plugin extracttextwebpackplugin

我正在开发一个Webpack插件,它基本上css在块中寻找资源,当它找到这样的资产时,在它上面应用一些postCSS返回2个输出的插件,应该继续使用它来提取Extract-Text-Plugin,其他输出应该成为一个新的模块内部,它注入到头部上运行.

我没有设法实现的唯一部分是在现有 Chunk 中创建新模块的部分.有一些指示/想法?

我设法创建了一个新的块,但没有webpack包装器,这意味着我无法支持HMR用于那块css并且懒得加载它.

class ExtractTPAStylePlugin {
  constructor(options) {
    this._options = Object.assign({
      pattern: [
        /"\w+\([^\)]+\)"/
      ]
    }, options);
  }

  extract(compilation, chunks) {
    const promises = [];

    chunks.forEach((chunk) => {
      promises.push(
        chunk.files
          .filter(fileName => fileName.endsWith('.css'))
          .map(file => postcss([extractStyles(this._options)])
            .process(compilation.assets[file].source(), {from: file, to: file})
            .then((result) => {
              compilation.assets[file] = new RawSource(result.css);

              const filename = file.replace('.css', fileSuffix);
              const newChunk = new Chunk(filename);
              newChunk.files = [filename];
              newChunk.ids = [];
              compilation.chunks.push(newChunk);
              const extractedStyles = `(${addStylesTemplate})()`
                .replace('__CSS__', JSON.stringify(result.extracted))
                .replace('__ID__', file);
              compilation.assets[filename] = new OriginalSource(extractedStyles);
            }))
      );
    });

    return Promise.all(promises);
  }

  apply(compiler) {
    compiler.plugin('compilation', (compilation) => {
      compilation.plugin('optimize-chunk-assets', (chunks, callback) => {
        this.extract(compilation, chunks)
          .then(() => callback())
          .catch(callback);
      });
    });
  }
}

module.exports = ExtractTPAStylePlugin;
Run Code Online (Sandbox Code Playgroud)

fel*_*osh 2

好的,所以我已经设法从几个插件中收集了一些代码,获胜的解决方案是将加载器注入到一些假导入文件中,在该加载器中将整个 js 代码加载到主包中,并放置一些占位符阶段的结果optimize-chunk-assets

之后,在 中optimize-chunk-assets,您可以找到相关的块,并使用ReplaceSource来查找和替换占位符。

为了获得灵感,您可以查看该插件