长话短说
String.prototype.includes
Node.js 从 v6.5 开始支持。@babel/register
导致你的代码被动态编译,这就是为什么你的import
声明有效。我怀疑你需要@babel/plugin-transform-runtime
插件,除非我错过了你想要实现的目标。
什么会导致这种混乱?
我认为这个(完全可以理解的)谜团有两个根本原因:
- Babel 作者已经做到了really该工具易于使用;有时很难知道如何/何时调用它(特别是与 Mocha 等其他工具配合使用时)。
- Node.js 原生支持/不支持的内容(就 ES2015、ES2016 等而言)传统上很难跟上。
那么,接下来就是两个谜团了。
为什么String.prototype.includes
work?
这个有更简单的解释。String.prototype.includes
早在 Node.js v6.5 就得到了原生支持(如你看到的,自该版本起就支持绝大多数 ES2015)。
所以,虽然你是对的,但你没有@babel/polyfill
配置(据我所知)并且你would在不支持的环境中需要它String.prototype.includes
, 你的环境已经支持它!
来自 Node.js v8.x REPL:
> 'ES2015'.includes('2015')
true
为什么你的import
声明工作?
正如您所说,Node.js v8.x本身不支持 ECMAScript 模块。然而,有一些不错的文章关于如何将其作为实验性功能启用从 Node.js v9.x 开始.
因此,您可以使用本机 Node.js v8.x(通过 REPL)获得以下内容:
> import path from 'path';
import path from 'path';
^^^^^^
SyntaxError: Unexpected token import
你的导入工作的原因是因为你的代码是由 Babel 使用@babel/preset-env
preset.此外,该编译是由您触发的--require @babel/register
摩卡选项。
@babel/register其工作原理是“将自身绑定到节点的要求并自动动态编译文件”。
这是一个基本示例@babel/register
行动中:
从命令行:
$ node main.js
You will see this, because there is no syntax error!
main.js
require('@babel/register');
// This next file is compiled on the fly
require('./file1.js');
file1.js
import path from 'path';
console.log('You will see this, because there is no syntax error!');
好消息是,这就是 Mocha 建议您集成 Babel 的方式在他们的文档中. The --require
选项基本上执行上面示例的操作:require('@babel/register');
在 Mocha 使用之前调用require
导入所有测试文件。
希望这可以帮助!同样,在 JavaScript 快速发展的现代时代,这是一个完全可以理解的谜团。