一尘不染

运行Mocha测试时Babel意外导入令牌

node.js

我的项目中已经实现了其他相关问题中提供的解决方案,例如在.babelrc中包含正确的预设(es2015)。

我有两个项目(分别称为A和B),它们都使用ES6模块语法。在项目A中,我导入了通过npm安装的项目B,该项目位于node_modules文件夹中。当我为项目A运行测试套件时,出现错误:

SyntaxError:意外的令牌导入

在此之前,项目B声称存在以下错误代码行:

(函数(导出,需求,模块, filename, dirname)){从’history / lib /
createBrowserHistory’中导入createBrowserHistory;

Iife似乎与npm或可能与Babel有关,因为我的源文件仅包含“从’history / lib /
createBrowserHistory’导入import
createBrowserHistory”;项目B的测试套件中的单元测试运行良好,并且如果我从以下位置删除了项目B作为依赖项项目A,然后是我的测试套件(仍然对内部项目模块使用es6导入)就可以了。

全栈跟踪:

 SyntaxError: Unexpected token import
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:374:25)
    at Module._extensions..js (module.js:405:10)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:138:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (actionCreators.js:4:17)
    at Module._compile (module.js:398:26)
    at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/ProjectA/src/components/core/wrapper/wrapper.js:28:23)
    at Module._compile (module.js:398:26)
    at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/ProjectA/src/components/core/wrapper/wrapperSpec.js:15:16)
    at Module._compile (module.js:398:26)
    at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at /ProjectA/node_modules/mocha/lib/mocha.js:219:27
    at Array.forEach (native)
    at Mocha.loadFiles (/ProjectA/node_modules/mocha/lib/mocha.js:216:14)
    at Mocha.run (/ProjectA/node_modules/mocha/lib/mocha.js:468:10)
    at Object.<anonymous> (/ProjectA/node_modules/mocha/bin/_mocha:403:18)
    at Module._compile (module.js:398:26)
    at Object.Module._extensions..js (module.js:405:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Function.Module.runMain (module.js:430:10)
    at startup (node.js:141:18)
    at node.js:980:3

这是我来自package.json的测试命令:

"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"

阅读 304

收藏
2020-07-07

共1个答案

一尘不染

似乎唯一的解决方案是显式包括:

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
});

在测试帮助程序文件中,并将其传递到我的测试命令中的mocha中:

mocha --require ./test/testHelper.js...

最终的解决方案:

添加 registerBabel.js :一个单独的文件,其工作是需要babel-core / register …

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
});

如果您的应用程序还依赖于babel-node,请添加一个 entry.js 。这充当包含es6的应用程序的包装。

require('./registerBabel');
require('./server'); // this file has some es6 imports

然后,您将使用 node entry

对于Mocha测试, testHelper.js 还应要求registerBabel.js在运行时初始化babel支持。

require('./registerBabel');

并用以下命令运行摩卡测试 mocha --require ./testHelper.js '+(test)/**/*Spec.js'

这将递归测试“ ./test”中任何以“ Spec.js”结尾的文件。用与您的项目中的规范匹配的模式替换模式。

2020-07-07