我的问题不是关于为什么某事无效的问题,而是关于它为何有效的问题。是的。
我有一个小的nodeJS command line tool,其中包含nodeJS尚不支持的功能,最值得注意的是:
import
语句String.includes()
。因此交付(构建),我将我的源代码转移+捆绑(使用parcel,就像webpack一样)。
作为一个肯定的奇迹,我所有的(仅一个)摩卡测试直接针对我的课程而不是捆绑软件进行 。仍然,他们工作!包括许多import
语句。并包括“ ES6自检”:
it( 'String - include', () => {
var s = 'Southern Bananas'
assert( s.includes( 'anana' ) )
assert( !s.includes( 'kiwi' ) )
} )
我的测试代码中包含String.include,而不仅仅是受测源中。而且在任何地方我都无法移植或捆绑我的测试代码...因此,对我的愚蠢问题表示歉意:
我的mocha.opts
很简单:
--require @babel/register
--require ./test/once.js (nothing special here, either)
--reporter list
--recursive
我的.babelrc
具有此功能:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"Electron": "3.0",
"Node": "8.0"
}
}
]
],
"plugins": [
"@babel/plugin-transform-runtime"
],
"retainLines": true,
"comments": false,
"sourceMaps": true
}
@babel/plugin-transform-runtime
显然不应该受到指责,explicitly states
注意:实例方法,例如“ foobar” .includes(“ foo”) 将不起作用,因为那将需要修改 现有的内置功能(您可以使用@ babel / polyfill来实现)。
在{em> minimalistik-modern afaik @babel/polyfill
中包含@babel/preset-env
吗?我还在做什么呢:+)?有没有办法在我的(调试)版本中使用此实时编译?
答案 0 :(得分:2)
String.prototype.includes
。 @babel/register
使您的代码被即时编译,这就是您的import
语句起作用的原因。我怀疑您是否需要@babel/plugin-transform-runtime
插件,除非我缺少您要实现的目标。
我认为这个(完全可以理解的)奥秘有两个根本原因:
因此,涉及两个奥秘。
String.prototype.includes
为什么起作用?这有一个更简单的解释。 String.prototype.includes
早在Node.js v6.5(as you can see以来,就一直受本机支持)。自该版本以来,已支持绝大多数ES2015支持。
因此,虽然您正确地认为没有配置@babel/polyfill
(据我所知),并且您会在没有环境的环境中使用它支持String.prototype.includes
,您的环境已支持它!
从Node.js v8.x REPL:
> 'ES2015'.includes('2015')
true
import
语句为什么起作用?如您所述,Node.js v8.x 本身不支持ECMAScript模块。但是,there are some good write ups关于如何将其启用为实验性功能starting in Node.js v9.x。
因此,您可以通过Native Node.js v8.x(通过REPL)获得以下信息:
> import path from 'path';
import path from 'path';
^^^^^^
SyntaxError: Unexpected token import
导入工作的原因是因为Babel正在使用@babel/preset-env
预设来编译您的代码。此外,该编译是由您的--require @babel/register
Mocha选项触发的
@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 in their documentation的方式。 --require
选项基本上完成了上面示例的操作:require('@babel/register');
在Mocha使用require
导入所有测试文件之前被调用。
希望这会有所帮助!同样,这是在迅速发展的JavaScript的现代时代完全可以理解的谜。