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

新手上路,请多包涵

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

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

SyntaxError:意外的令牌导入

前面是来自项目 B 的所谓错误代码行:

(function (exports, require, module, __filename, __dirname) { import createBrowserHistory from ‘history/lib/createBrowserHistory’;

iife 似乎与 npm 或可能与 babel 相关,因为我的源文件仅包含“import createBrowserHistory from ‘history/lib/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'"

这篇 StackOverflow 帖子类似,但没有为我使用命令行提供解决方案: import a module from node_modules with babel but failed

原文由 ThinkingInBits 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 505
2 个回答

似乎唯一的解决方案是明确包括:

 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' 运行你的 mocha 测试

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

原文由 ThinkingInBits 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于 Babel <6

解决这个问题最简单的方法是:

  1. npm install babel-preset-es2015 --save-dev
  2. .babelrc 添加到项目的根目录,内容如下:
    {
    "presets": [ "es2015" ]
   }

确保您正在使用“–compilers js:babel-core/register”参数运行 mocha。

对于 Babel6/7+

  1. npm install @babel/preset-env --save-dev
  2. .babelrc 添加到项目的根目录,内容如下:
    {
    "presets": [ "@babel/preset-env" ]
   }

确保您使用 --compilers js:babel-register (Babel 6) 或 --compilers js:@babel/register (Babel 7) 参数运行 mocha

对于 mocha 版本 7 或更高版本,分别使用 --require babel-register--require @babel/register

原文由 deepelement 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题