我试图在Webpack的require.context
中包含伊斯坦布尔记者应该涵盖的所有文件。
我想要包含/要求app
下没有.test.js
扩展名的所有文件。
// internals/testing/test-bundler.js
const context = require.context('../../app', true, /^.*(?!(\.test|internals.*))\.js$/);
context.keys().forEach(context);
我的文件结构是:
app/components/
app/containers/
app/decorators/
app/orm/
app/pages/
app/store/
app/tests/
app/utils/
app/app.js
app/reducers.js
app/routes.js
internals/testing/test-bundler.js
显然我的正则表达式不起作用,因为在覆盖率报告中我看到了所有.test.js
个文件,甚至是internals/testing/test-bundler.js
文件。
我做错了什么?
答案 0 :(得分:15)
你需要注意负面前瞻在哪些部分使用它的拒绝。如果你在第一个正斜杠后立即执行它,它可以正常工作。
然后你想在斜杠后面拒绝.*test
,而不是直接在它后面test
。
/^(?!internals).*\/(?!.*test).*\.js$/
或者更具体地说,路径名中不允许internals
也不以test.js
结尾:
^(?!.*(?:internals|test.js$)).*\.js$
答案 1 :(得分:2)
如果只是简单地使用filter
过滤您的路径怎么样?
小提琴:
var paths = [
'app/components/',
'app/containers/',
'app/decorators/',
'app/orm/',
'app/pages/',
'app/store/',
'app/tests/',
'app/utils/',
'app/app.js',
'app/reducers.js',
'app/routes.js',
'internals/testing/test-bundler.js',
'app/blablabla.test.js'
];
var result = paths.filter(function(e,i){
return (e.startsWith('app/') && !e.endsWith('.test.js'))
});
for(var i = 0; i < result.length; i++)
console.log(result[i]);
&#13;
答案 2 :(得分:0)
即使从node_modules
中排除require.context
,webpack
仍会递归地查找目录,这很浪费时间。在类似的情况下,我遇到了内存不足的堆。
我认为不为每个模块安装node_modules
应该是更好的方法。但是将node_modules
保留在其他位置,并在wepback
module.resolve
中指定位置。将源代码和依赖项分开保存。