通过要求的WebPack动态模块加载
OK,我已搜查高和低,但不能可靠地确定这是否是或不是可能的的WebPack。
.context似乎表明,人们可以通过一个字符串的函数,它加载模块...
但我的尝试只是不工作:webpack.config.js
'use strict';
let webpack = require('webpack'),
jsonLoader = require("json-loader"),
path = require("path"),
fs = require('fs'),
nodeModules = {};
fs.readdirSync('node_modules')
.filter(function(x) {
return ['.bin'].indexOf(x) === -1;
})
.forEach(function(mod) {
nodeModules[mod] = 'commonjs ' + mod;
});
let PATHS = {
app: __dirname + '/src'
};
module.exports = {
context: PATHS.app,
entry: {
app: PATHS.app+'/server.js'
},
target: 'node',
output: {
path: PATHS.app,
filename: '../build/server.js'
},
externals: nodeModules,
performance: {
hints: "warning"
},
plugins: [
jsonLoader
],
resolve: {
modules: [
'./node_modules',
path.resolve(__dirname),
path.resolve(__dirname + "/src"),
path.resolve('./config')
]
},
node: {
fs: "empty"
}
};
该server.js
let _ = require('lodash');
let modules = [ "modules/test" ];
require( 'modules/test' )();
_.map( modules, function( module ){
require( module );
});
在模块/命名test.js模块
module.exports = () => {
console.log('hello world');
};
但结果总是一样的... PM2日志只是打个招呼世界的静态需要,而是为了同一个模块的动态负载
错误:无法找到模块“”
所有我希望能够做的是通过的路径的阵列模块和负载然后循环...
回答如下:你不能使用一个变量作为参数传递给require
。的WebPack需要知道哪些文件在编译时捆绑。因为它没有程序流分析,就不能知道你传递给函数的。在这种情况下,它可能是显而易见的,但是这可能会去尽可能使用用户输入来决定需要哪些模块,并没有的WebPack没有办法可以大概知道哪些模块在编译时包括这样的WebPack不允许它。
您发布的例子是有点不同。你可以使用require
有一个连接字符串。例如:
require(`./src/${moduleName}/test`);
哪些模块就需要的WebPack在包中包括什么?变量moduleName
可以是任何东西,所以确切的模块在编译时不知道。相反,它包括那些可能匹配上述表达式的所有模块。假设下面的目录结构:
src
├─ one
│ └─ test.js
├─ two
│ ├─ subdir
│ │ └─ test.js
│ └─ test.js
└─ three
└─ test.js
所有这些test.js
文件将被包含在捆绑,因为moduleName
可能是one
什么样的嵌套two/subdir
。
欲了解更多详情,请参阅require with expression的官方文档中。
无法通过的阵列循环并导入所述阵列的每一个模块,通过连接字符串上述异常,但具有包括所有可能的模块和一般应避免的效果。
通过要求的WebPack动态模块加载
OK,我已搜查高和低,但不能可靠地确定这是否是或不是可能的的WebPack。
.context似乎表明,人们可以通过一个字符串的函数,它加载模块...
但我的尝试只是不工作:webpack.config.js
'use strict';
let webpack = require('webpack'),
jsonLoader = require("json-loader"),
path = require("path"),
fs = require('fs'),
nodeModules = {};
fs.readdirSync('node_modules')
.filter(function(x) {
return ['.bin'].indexOf(x) === -1;
})
.forEach(function(mod) {
nodeModules[mod] = 'commonjs ' + mod;
});
let PATHS = {
app: __dirname + '/src'
};
module.exports = {
context: PATHS.app,
entry: {
app: PATHS.app+'/server.js'
},
target: 'node',
output: {
path: PATHS.app,
filename: '../build/server.js'
},
externals: nodeModules,
performance: {
hints: "warning"
},
plugins: [
jsonLoader
],
resolve: {
modules: [
'./node_modules',
path.resolve(__dirname),
path.resolve(__dirname + "/src"),
path.resolve('./config')
]
},
node: {
fs: "empty"
}
};
该server.js
let _ = require('lodash');
let modules = [ "modules/test" ];
require( 'modules/test' )();
_.map( modules, function( module ){
require( module );
});
在模块/命名test.js模块
module.exports = () => {
console.log('hello world');
};
但结果总是一样的... PM2日志只是打个招呼世界的静态需要,而是为了同一个模块的动态负载
错误:无法找到模块“”
所有我希望能够做的是通过的路径的阵列模块和负载然后循环...
回答如下:你不能使用一个变量作为参数传递给require
。的WebPack需要知道哪些文件在编译时捆绑。因为它没有程序流分析,就不能知道你传递给函数的。在这种情况下,它可能是显而易见的,但是这可能会去尽可能使用用户输入来决定需要哪些模块,并没有的WebPack没有办法可以大概知道哪些模块在编译时包括这样的WebPack不允许它。
您发布的例子是有点不同。你可以使用require
有一个连接字符串。例如:
require(`./src/${moduleName}/test`);
哪些模块就需要的WebPack在包中包括什么?变量moduleName
可以是任何东西,所以确切的模块在编译时不知道。相反,它包括那些可能匹配上述表达式的所有模块。假设下面的目录结构:
src
├─ one
│ └─ test.js
├─ two
│ ├─ subdir
│ │ └─ test.js
│ └─ test.js
└─ three
└─ test.js
所有这些test.js
文件将被包含在捆绑,因为moduleName
可能是one
什么样的嵌套two/subdir
。
欲了解更多详情,请参阅require with expression的官方文档中。
无法通过的阵列循环并导入所述阵列的每一个模块,通过连接字符串上述异常,但具有包括所有可能的模块和一般应避免的效果。