2017-02-21 5 views
0

Инструмент, в котором я работаю, использует программный код Babel. Он требует нескольких плагинов, и все работает нормально.Как программно передавать параметры Babel transforms/plugins?

Tho, я хочу передать варианты преобразования Babel. Я понял, что еще не сделал этого, и выглядит так, как будто я просто не работает.

В частности, я хочу включить babel-transform-strict-mode и передать strict:false, чтобы отключить глобальный строгий режим.

Документов объяснить, как использовать его, когда с .babelrc файла:

// with options 
{ 
    "plugins": [ 
    ["transform-strict-mode", { 
     "strict": true 
    }] 
    ] 
} 

В моем коде у меня есть:

const babelify = require("babelify") 
    , es2015 = require("babel-preset-es2015") 
    , reactify = require("babel-preset-react") 
    , strictMode = require("babel-plugin-transform-strict-mode") 
    ; 

... 

this.browserify.transform(babelify, { 
    global: true, 
    babelrc: false, 
    presets: [ 
     reactify 
     , es2015 
     , [ 
      strictMode 
      , { strict: false } 
     ] 
    ] 
}); 

Хотя es2015 и reactify работы большой в presets массиве, добавив strictMode с { strict: false } просто не работает.

Ошибки:

ReferenceError: [BABEL] /home/.../index.js: Unknown option: foreign.visitor. 
Check out http://babeljs.io/docs/usage/options/ for more 
information about options. 

A common cause of this error is the presence of a 
configuration options object without the corresponding 
preset name. Example: 

Invalid: 
    `{ presets: [{option: value}] }` 
Valid: 
    `{ presets: [['presetName', {option: value}]] }` 

For more detailed information on preset configuration, 
please see 
http://babeljs.io/docs/plugins/#pluginpresets-options. 

Если я использую вместо strictMode имени (["transform-strict-mode", { strict: false }]) преобразований, он не найдет модуль, очевидно, потому, что это является частью другого модуля.

Как я могу передать параметры модулям require (в данном случае strictMode), программно (без babelrc)?

ответ

1

Как правило, рекомендуемый подход заключается в отключении поддержки модуля ES6, поскольку модули ES6 являются автоматическими. например

this.browserify.transform(babelify, { 
    sourceType: 'script', 
    presets: [ 
    reactify, 
    [es2015, {modules: false}], 
    ], 
}) 

В вашем конкретном случае, так как ваш вопрос ломать вещи в node_modules, это из-за вашего использования global: true.

Я предполагаю, что вы конкретно проходите global: true, потому что у вас есть node_modules этот контейнер ES6? Если да, то вы должны белый список вещей, которые вы компилировать, указав ignore регулярное выражение для babelify как:

// ... 
global: true, 
ignore: /node_modules\/(?:some_es6_module|some_other_es6_module)/, 
// ... 

игнорировать любой файл с node_modules в пути, за исключением модулей, названных some_es6_module и . Таким образом, такие вещи, как underscore, не будут затронуты.

+0

А, это интересно. Итак, значит ли это, что я больше не буду «импортировать foo из« foo »? Я закончил использовать [этот плагин] (https://github.com/genify/babel-plugin-transform-remove-strict-mode), который, вероятно, что он делает, просто удаляет '' use strict '; 'kinda везде. Благодаря! –

+0

Это вариант, просто имейте в виду, что ваш код больше не совместим со спецификациями, поэтому, если вы хотите использовать модули ES6 после их приземления в узле, он снова столкнется с этой проблемой и не сможет исправить это, не используя CommonJS. – loganfsmyth

+0

У меня просто были проблемы с некоторыми библиотеками (например, 'underscore') на стороне клиента, потому что они проверяли' if (this._) {...} ', но' this' был 'undefined', поэтому он терпел неудачу , –

0

babel-plugin-transform-strict-mode - это плагин, который не является предустановленным компонентом, поэтому вы должны установить плагин в опции плагинов.

this.browserify.transform(babelify, { 
global: true, 
babelrc: false, 
presets: [ 
    reactify 
    , es2015 
], 
plugins:[ 
    [ 
     strictMode 
     , { strict: false } 
    ] 
] 

});

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