通常,对于静态需求或导入(CommonJS/ES导入),webpack可以要求/ node_modules /中的任何模块,例如:
var vendorModule = require('vendor-module');
Run Code Online (Sandbox Code Playgroud)
但我想从/ node_modules/like动态加载模块:
var vendorModuleId = 'vendor-module';
...
var vendorModule = require(vendorModuleId);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为webpack无法在编译时确定依赖关系,并且在我们可能想要动态加载某些供应商模块的情况下,在bundle中包含所有/ node_modules /显然是疯了.
我正在寻找一种方法来欺骗webpack 动态解析这些模块.最好通过webpack配置文件告诉webpack/node_modules /中的哪些模块应该包含在bundle中.
有人说ContextReplacementPlugin对这些情况很有用,但我无法理解.
任何人都知道如何做到这一点?提前致谢!
您可以创建一个文件,通过加载器导入和导出所需的模块。
npm install exports-loader imports-loader --save-dev在webpack.config.js:
// config needed vendor modules
var vendorModules = [
'one', 'two', 'three', 'vendor-module'
];
...
module.exports = {
...
loaders: [{ // Add loader
include: require.resolve('./vendors.js'),
loader: 'imports-loader?' + vendorsModules.map(function(module, index) {
return 'dep' + index + '=' + module;
}).join(',') + '!exports-loader?' + vendorsModules.map(function(module, index) {
return module + '=dep' + index;
}).join(',')
},...]
...
}
Run Code Online (Sandbox Code Playgroud)在需要供应商的模块中:
// import * as vendorsModules from './vendors';
var vendorsModules = require('./vendors');
var vendorModuleId = 'vendor-module';
...
var vendorModule = vendorsModules[vendorModuleId];
console.log('module', vendorModule);
Run Code Online (Sandbox Code Playgroud)它将把已配置的供应商添加到您的捆绑包中。如果您需要延迟加载这些模块,则需要使用更复杂的模块工厂require.resolve和类似承诺的接口来获取所需的模块。
| 归档时间: |
|
| 查看次数: |
2013 次 |
| 最近记录: |