импортировать модуль из node_modules с babel, но не удалось

15

Я написал модуль с es6 и публиковал в npm, я хочу использовать его в другом проекте, поэтому я печатаю вот так:

import {ActionButton} from 'rcomponents'

Но это не сработало:

D:\github\blog\node_modules\rcomponents\src\actionButton.jsx:1
(function (exports, require, module, __filename, __dirname) { import React fro
                                                              ^^^^^^
SyntaxError: Unexpected reserved word
    at exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:443:25)
    at Module._extensions..js (module.js:478:10)
    at Object.require.extensions.(anonymous function) [as .jsx] (D:\github\blog\
node_modules\babel\node_modules\babel-core\lib\api\register\node.js:214:7)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at D:\github\blog\node_modules\rcomponents\src\index.js:3:19
    at Object.<anonymous> (D:\github\blog\node_modules\rcomponents\src\index.js:
7:3)

Вот моя конфигурация js loader в webpack:

{ test: /\.jsx?$/, loader: `babel?cacheDirectory=${babelCache}` }

Когда я пытаюсь импортировать модуль, который не из node_modules, babel работает хорошо. Но импортировать модуль из node_modules, babel, похоже, не работает?

Теги:
babeljs

3 ответа

19
Лучший ответ

Смотрите документы для babel:

ПРИМЕЧАНИЕ. По умолчанию все требует node_modules, будет проигнорировано. Вы можете переопределить это, передав регулярное выражение ignore.

В общем случае ожидание состоит в том, что модули в node_modules уже были переписаны раньше времени, поэтому они не обрабатываются Babel. Если вы этого не сделаете, вам нужно сказать, какие файлы он может обрабатывать. ignore позволяет это.

require("babel/register")({
    // Ignore everything in node_modules except node_modules/rcomponents.
    ignore: /node_modules\/(?!rcomponents)/
});
  • 2
    Если вы хотите использовать тот же подход с babel-node, вы можете сделать babel-node --ignore '/node_modules/(?!my_module1|my_module2)' script.js
  • 10
    Это не подходящий ответ для Babel 6, я столкнулся с подобной ситуацией и, похоже, не могу найти какой-либо способ перенести модули из модуля узла. Так же, как приложение к тем, кто все еще ищет решение в Вавилоне 6.
Показать ещё 8 комментариев
3

Как правило, пакеты, загруженные в npm, должны быть предварительно скомпилированы, поэтому пользователи получают нормальную JS и не требуют шага сборки. Используйте npm prepublish для этого.

Однако, если вы используете webpack, вы можете указать функцию exclude в конфигурации вашего веб-пакета (см. документы в веб-пакете):

module: {
  loaders: [{
    test: /.jsx?$/,
    loader: 'babel-loader',
    exclude(file) {
      if (file.startsWith(__dirname + '/node_modules/this-package-is-es6')) {
        return false;
      }
      return file.startsWith(__dirname + '/node_modules');
    },

Если вы используете babel напрямую, вы можете написать аналогичную функцию ignore в требуемом hook.

1

Вы можете использовать https://www.npmjs.com/package/babel-node-modules для этого случая

npm install --save-dev babel-node-modules
require('babel-node-modules')([
  'helloworld' // add an array of module names here 
]);

а затем он компилирует перечисленные модули как другие файлы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню