Я написал модуль с 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, похоже, не работает?
Смотрите документы для babel:
ПРИМЕЧАНИЕ. По умолчанию все требует node_modules, будет проигнорировано. Вы можете переопределить это, передав регулярное выражение ignore.
В общем случае ожидание состоит в том, что модули в node_modules
уже были переписаны раньше времени, поэтому они не обрабатываются Babel. Если вы этого не сделаете, вам нужно сказать, какие файлы он может обрабатывать. ignore
позволяет это.
require("babel/register")({
// Ignore everything in node_modules except node_modules/rcomponents.
ignore: /node_modules\/(?!rcomponents)/
});
Как правило, пакеты, загруженные в 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.
Вы можете использовать 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
]);
а затем он компилирует перечисленные модули как другие файлы
babel-node --ignore '/node_modules/(?!my_module1|my_module2)' script.js