摩卡/通天塔如何即时转换我的测试代码?

时间:2018-12-20 18:43:37

标签: node.js ecmascript-6 mocha transpiler

我的问题不是关于为什么某事无效的问题,而是关于它为何有效的问题。是的。

我有一个小的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吗?我还在做什么呢:+)?有没有办法在我的(调试)版本中使用此实时编译?

1 个答案:

答案 0 :(得分:2)

长话短说

从v6.5开始,Node.js支持

String.prototype.includes@babel/register使您的代码被即时编译,这就是您的import语句起作用的原因。我怀疑您是否需要@babel/plugin-transform-runtime插件,除非我缺少您要实现的目标。

什么会引起这种混乱?

我认为这个(完全可以理解的)奥秘有两个根本原因:

  1. Babel的作者使真的易于使用。有时很难知道如何/何时调用它(尤其是与其他工具(如Mocha)配对时)。
  2. 传统上,Node.js本身不支持/不支持什么(就ES2015,ES2016等而言)。

因此,涉及两个奥秘。

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的现代时代完全可以理解的谜。