我有一些老式的普通旧ES5 JavaScript,我需要将其作为捆绑包使用webpack。问题是这些文件的位置在路径为动态的文件夹中。似乎webpack不能很好地处理require
中的表达式,而require.context
根本不允许使用它们。
对于要求目录及其子目录中所有文件的已知路径目录,此方法正常工作:
let domainRequires = require.context('./app/domain', true, /\.js$/);
domainRequires.keys().forEach(domainRequires);
由于我无法在require.context
中使用表达式,因此我尝试使用普通require
并且无效:
require('../../path/to/code/my-library-' + versionNumber + '/domain/clazz.js');
使用完整的相对路径。
我也尝试使用require.context
但是增强了正则表达式部分以使其正常运行并且没有运气:
require.context('../../path/to/code', true, /^my-library-.*\/domain\/.*\.js$/);
欢迎任何想法,建议或解决方案。如果我需要在webpack中使用第三方,那也没关系。
答案 0 :(得分:15)
我最终搞清楚了。通过使用webpack resolve.alias
,我可以添加:
resolve: {
alias: {
common: path.resolve(__dirname, '../../path/to/code/my-library-' + versionNumber + '/domain')
}
}
webpack.config
中的。
然后在我的代码中,我可以要求/domain
下的所有文件:
var commonRequires = require.context('common', true, /\.js$/);
commonRequires.keys().forEach(commonRequires);
同样,我可以通过以下方式获得单个文件:
require('common/clazz.js'); // ../../path/to/code/my-library-1.0.0/domain/clazz.js
FWIW,获取versionNumber
我使用节点的fs
模块从json文件中读取,使用JSON.parse(file)
然后检索{{1}顶部的版本}}
答案 1 :(得分:0)
从Webpack 3.9(我认为)不需要commonRequires
。我在webpack.config.js中运行它:
resolve: {
alias: {
tmpDir: path.resolve(__dirname, '/tmp')
}
}
然后我将自定义模块加载为:
const dynModule = require('tmpDir/dyn_module.js');
不确定我是否遗漏了您的要求,但我不需要commonRequires
,而且Webpack构建得很好(并且可以正常工作)。