如何访问自定义Webpack插件中源文件中的模块?

时间:2019-02-22 01:01:28

标签: webpack webpack-4 webpack-plugin

一个非常简单的项目:

  • 条目文件为index.js
  • 一个模块foo.js
  • index.js 进口 foo.js
  • 基本的webpack.config.js
  • 一个自定义插件-HelloWorldPlugin

文件:

// ./src/foo.js
export default {
  foo: 'foo'
}

// ./src/index.js
import foo from './foo'
console.log(foo);

// webpack.config.js
const path = require('path');
var HelloWorldPlugin = require('./hello-world-plugin');

module.exports = {
  entry: './src/index.js',
  plugins: [
    new HelloWorldPlugin({ options: true })
  ]
};

// HelloWorldPlugin.js
class HelloWorldPlugin {
  apply(compiler) {
    compiler.hooks.afterEmit.tapAsync("HelloWorldPlugin", (compilation, next) => {
      console.log(arguments);
      // let foo = the module as imported from ./src/foo.js i.e. {foo: 'foo'}
      next();
    });
  }
}

module.exports = HelloWorldPlugin;

问题是:

是否可以从{foo:'foo'}内部的foo-module访问HelloWorldPlugin

1 个答案:

答案 0 :(得分:0)

如果您试图在插件中获取源代码,则可以从compilation.assets[fileName].source()获取它,并且可以这样做:

class HelloWorldPlugin {
  apply(compiler) {
    compiler.hooks.afterEmit.tapAsync("HelloWorldPlugin", (compilation, next) => {
      console.log(arguments);
      compilation.hooks.afterOptimizeAssets.tap({ name: 'name' }, (modules) => {
        for (let fileName in modules) {
          const source = compilation.assets[fileName].source();
          console.log(source); // source of files
        }
      })
      next();
    });
  }
}

通过链接到compilation hooks中的一个,您可以访问所有模块并获取文件名及其内容