Противоречивое использование babel / register

у меня есть то, что кажется конфликтом в babel/register между двумя локальными пакетами npm.

в пакете я делаю следующее:

require('babel/register');
require('index');

и в индексном файле того же пакета:

require('test');

и в пакете" test":

require('babel/register');
require('test/index');

это вызывает следующую ошибку:

throw new Error("only one instance of babel/polyfill is allowed");

но если я возьму babel/register строка из пакета "test", я получаю следующую ошибку в из пакета" test":

import fs from 'fs';
^^^^^^
SyntaxError: Unexpected reserved word

я пробовал использовать System.import чтобы импортировать пакет "test" (используя polyfill, указанный на сайте BabelJS), но в этом контексте я получаю ту же ошибку, что и выше. Как мне импортировать один пакет в другой и сохранить возможность использования импорта/экспорта ES6 и других функций ES6?

EDIT: я немного упростил это, мне все еще требуется "тест" в первый пакет, но я не загружаю промежуточный файл. Вместо этого" главный "файл" test установлен в test/index. теоретически, теперь он просто загружает один модуль ES6, который он должен быть в состоянии зарегистрировать. Я все еще получаю вышеуказанную ошибку.

3 ответов


Как видите, babel/register предназначен только для запуска один раз в приложении, и обычно это будет приложение верхнего уровня, которое вы запускаете.

проблемы заключается в том, что по умолчанию require('babel/register') будет только настроить систему для транспилирования файлов непосредственно внутри модуля, он не будет обрабатывать node_modules. Ожидание вообще, что что-нибудь в node_modules будут скомпилированы заранее при публикации в реестре модуля.

один вариант пройти ignore: false как вариант, например,require('babel/register')({ignore: false}); но это вообще плохая идея и может привести к другим проблемам. Это сделает Babel transpile все файлы, но это не всегда безопасно, потому что не весь код JavaScript гарантированно будет действительным модулем ES6.

лучшим решением было бы транспилировать ваш test модуль досрочно. Если это не сработает, вы можете использовать указать regex или Глоб для путей, которые следует transpiled.


в моем случае мне сошло с рук:

self._babelPolyfill = false;

Я не знаю, если установка polyfill во второй раз вызовет некоторые тонкие проблемы, но с большим количеством модульных тестов я не видел никаких проблем, используя этот хак, чтобы избежать удушья сценария.


ошибки: only one instance of babel/polyfill is allowed - Это именно то, что @loganfsmyth отметил: несколько полифилов, которые могут быть вызваны с помощью babel-node и требование ./register-babel в то же время.

однако в моем случае эта ошибка странно не появлялась до у меня была еще одна ошибка. Я имею в виду, все работало, тогда у меня был EADDRINUSE ошибка. Когда это произошло, он затенялся, и появилась ошибка polyfill. Очень странный. Я не трогал свой код в любом месте, связанном с Вавилонское столпотворение.

как только я исправил polyfill,EADDRINUSE появился и я смог решить все.