如何在动态目录

时间:2016-11-04 15:53:00

标签: webpack require

我有一些老式的普通旧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中使用第三方,那也没关系。

2 个答案:

答案 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构建得很好(并且可以正常工作)。