2016-06-28 114 views
3

我試圖在Webpack的require.context中包含我的伊斯坦布爾記者應該報道的所有文件。從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文件內工作。

我在做什麼錯?

回答

6

你需要知道什麼部分負面的超前使用它是拒絕。如果你在第一個正斜槓之後執行它,它可以正常工作。

而你想在斜槓後面拒絕.*test,而不是直接在它後面的test

/^(?!internals).*\/(?!.*test).*\.js$/ 

或更具體的不允許internals在路徑名中。
也不符合test.js結尾:

^(?!.*(?:internals|test.js$)).*\.js$ 
+0

從他的樣本路徑的測試,你的答案只返回'應用程序/ app.js'? – Veverke

+0

它將返回任何目錄中的路徑,但不會返回內部/ *'。他們在第一次斜線後不會有'測試'。所以從這個意義上說,'test/internals.js'仍然會通過。但在正則表達式中很容易改變。 – LukStorms

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]);