2015-07-08 5 views
6

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

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

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

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

require('test'); 

И в пакете "тест":

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

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

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

Но если я беру babel/register строку из пакета «тест», я получаю следующее сообщение об ошибке в index файл пакета «тест»:

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

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

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

+0

Как правило, ожидается, что библиотеки будут предварительно скомпилированы перед распространением. 'babel/register' по умолчанию не обрабатывает файлы внутри' node_modules'. – loganfsmyth

+0

Он делает, если вы будете следовать шаблону, за которым я следую. Если я полностью исключаю второй пакет, все модули в первом пакете регистрируются и преобразуются. – BTC

+0

Я в замешательстве. В вашем вопросе говорится, что если вы берете 'babel/register' из модуля' test', он дает ошибку об импорте. Это потому, что 'test' находится в' node_modules', поэтому он не будет скомпилирован. Ожидаете ли вы, что внешний 'babel/register' должен также скомпилировать' test'? – loganfsmyth

ответ

2

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

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

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

Лучшим решением было бы перевести ваш test модуль раньше времени. Если это не будет работать, вы можете использовать опцию only, чтобы указать регулярное выражение или glob для путей, которые должны быть переписаны.

0

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

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

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

1

В моем случае, я ушел с установкой:

self._babelPolyfill = false; 

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

Смежные вопросы