require.context:内联RegExp有效,var RegExp没有

时间:2016-07-14 04:33:49

标签: javascript commonjs

如果声明SPEC Env,我试图有条件地加载我的测试:

var context = null
if (process.env.SPEC) {
  context = require.context('./tests', true, /.*?SearchInput.*/);
} 
context.keys().forEach(context);

这非常有效。 现在如果我这样做

var context = null
if (process.env.SPEC) {
  var c = /.*?SearchInput.*/;
  context = require.context('./tests', true, c);
} 
context.keys().forEach(context);

这根本不起作用,并且./中的所有文件都匹配('./tests'参数被忽略)

我错过了什么? 我希望require.context函数的第三个参数是一个RegExp对象,所以我可以使用变量构造RegExp。

编辑1

这不起作用:

var context = null
if (process.env.SPEC) {
  var c = new RegExp(/.*?SearchInput.*/);
  context = require.context('./tests', true, c);
} 
context.keys().forEach(context);

要测试这个,你可以编辑这个项目的tests.webpack.js文件: https://github.com/erikras/react-redux-universal-hot-example

您需要允许SPEC变量通过webpack

  new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify('test'),
        SPEC: JSON.stringify(process.env.SPEC || null)
      },
      __CLIENT__: true,
      __SERVER__: false,
      __DEVELOPMENT__: true,
      __DEVTOOLS__: false  // <-------- DISABLE redux-devtools HERE
    })

并运行:npm run test

或:SPEC = t npm run test

2 个答案:

答案 0 :(得分:1)

Sokra在webpack github上回答这个问题,说传递给require.context的正则表达式必须是静态可分析的。这就是为什么传递/thing/有效而不是new RegExp(thing)

的原因

https://github.com/webpack/webpack/issues/4772

答案 1 :(得分:0)

4 年后,我面临同样的问题。检查 require.context

的警告消息

https://webpack.js.org/guides/dependency-management/#requirecontext