webpack 判断资产入口

Webpack determine asset entry

正在开发一个插件以获取特定的资产类型并将它们合并到一个文件中。 我希望能够根据将资产引入的条目将资产合并到文件中。

entry.one.js
 - asset a
 - asset b

entry.two.js
 - asset c
 - asset d

期望的结果是一个文件有 a/b 个资产,另一个文件有 c/d 个资产。

有没有办法确定资产来自哪个条目?

看来 Webpack 的 compilation.processAssetscompliation.getAsset() 并没有真正为您提供太多关于什么条目带来了什么资产的上下文。

  compilation.hooks.processAssets.tap(
    {
      name: 'BobRoss',
      stage: compilation.PROCESS_ASSETS_STAGE_ANALYSE,
      additionalAssets: true
    },
    (assets) => {
      for (let i in assets) {
        console.log(assets[i]);
        console.log(compilation.getAsset(i));
      }
    }
  )

我是否需要从另一个挂钩位置查看资产?也许从块或模块来确定这一点? 任何方向都会有所帮助。

谢谢!

找到了。 compilation.chunkAsset.tap() 是有问题的挂钩,您可以在其中收集块的资产,还可以确定该块是来自一个条目还是另一个条目:

const entries = compiler.options.entry;

// Hook into compilation
compiler.hooks.compilation.tap({ name: 'BobRoss' }, (compilation) => {

  // Hook into chunkAsset
  compilation.hooks.chunkAsset.tap('BobRoss', (chunk, filename) => {

    // Only process chunks that are entry files
    if (entries[path.basename(filename)]) {  

      // get chunk's asset paths.
      const paths = [...chunk.auxiliaryFiles]; 

      // resolve paths into asset objects using compilation.getAsset()
      entries[path.basename(filename)].assets = Object.keys(paths).map((n) => compilation.getAsset(assets[n]));

    }
  });

});

将导致 entries 对象现在看起来像:

[{
  entry.one: {
    import: ['path/to/entry/file/entry.one.js'],
    assets: [asset, asset]
  }
},{
  entry.two: {
    import: ['path/to/entry/file/entry.one.js'],
    assets: [asset, asset]
  }
}]

从这里开始,在 compilation.processAssets Webpack 挂钩下,将它们合并并添加到构建中作为两​​个新资产的过程是微不足道的。