Короткая история
String.prototype.includes
поддерживается Node.js начиная с версии 6.5.@babel/register
вызывает компиляцию вашего кода на лету, поэтому ваши операторы import
работают.Я сомневаюсь, что вам нужен плагин @babel/plugin-transform-runtime
, если только мне не хватает чего-то, чего вы пытаетесь достичь.
Что может вызвать эту путаницу?
Я думаю, что есть две основные причиныэта (полностью понятная) тайна:
- Авторы Babel сделали действительно простым в использовании инструментом;и иногда трудно понять, как / когда он вызывается (особенно в сочетании с другим инструментом, таким как Mocha).
- Что изначально поддерживается / не поддерживается Node.js (в терминах ES2015, ES2016и т. д.) Традиционно было трудно идти в ногу.
Итак, о двух загадках.
Почему String.prototype.includes
работает?
Этоу каждого есть более легкое объяснение.String.prototype.includes
изначально поддерживается с Node.js v6.5 (, как вы можете видеть , с тех пор поддерживается подавляющее большинство поддержки ES2015).
Итак, хотя вы правы в том, что у вас не настроен @babel/polyfill
(насколько я могу судить) и что вам понадобится в среде, которая не поддерживает 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
. Кроме того, эта компиляция запускается вашим параметром --require @babel/register
Mocha.
@babel/register
работает путем "привязки [самого себя] к узлу require и автоматической компиляции файлов на лету".
Вот базовый пример @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 в их документацию .Опция --require
в основном делает то, что делает приведенный выше пример: require('@babel/register');
вызывается до того, как Mocha использует require
для импорта всех ваших тестовых файлов.
Надеюсь, это поможет!Опять же, это совершенно понятная загадка в современную эпоху быстро развивающегося JavaScript.