从Webpack

时间:2016-06-28 11:59:44

标签: javascript regex webpack

我试图在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文件。

我做错了什么?

3 个答案:

答案 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;
&#13;
&#13;

答案 2 :(得分:0)

即使从node_modules中排除require.contextwebpack仍会递归地查找目录,这很浪费时间。在类似的情况下,我遇到了内存不足的堆。

我认为不为每个模块安装node_modules应该是更好的方法。但是将node_modules保留在其他位置,并在wepback module.resolve中指定位置。将源代码和依赖项分开保存。