2017-02-21 3 views
0

私が取り組むツールは、プログラムでBabelを使用しています。プラグインはほとんど必要なく、すべて正常に動作します。Babelのトランスフォーム/プラグインにプログラムでオプションを渡す方法は?

Tho、私はBabel変換にオプションを渡したいと思います。私はまだそれをやっていないことに気づき、私が試みているものがうまくいかないように見える。

具体的には、babel-transform-strict-modeを含め、strict:falseを渡してグローバル厳密モードを無効にします。私は私のコードで

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

ドキュメントが.babelrcファイルを持つときにそれを使用する方法について説明し

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ながらpresets配列に大きなreactify仕事、strictModeを追加{ strict: false }で動作しません。

エラーがある:私は代わりにstrictModeの変換名(["transform-strict-mode", { 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. 

、それは、明らかに、モジュールを見つけることができません。

requireモジュール(この場合はstrictMode)には、プログラムで(babelrcなし)オプションを渡すにはどうすればよいですか?

答えて

1

ここで推奨されるアプローチは、ES6モジュールが自動厳格であるため、ES6モジュールのサポートを無効にすることです。例えばあなたの特定のケースで

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

あなたの問題はnode_modulesで物事を破壊されているので、これはglobal: trueの使用状況です。

コンテナES6がnode_modulesであるため、具体的にはglobal: trueを渡していることを前提としていますか? some_es6_moduleとという名前のモジュールを除いてパス内のnode_modulesを持つ任意のファイルを、無視する

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

:もしそうなら、あなたは同じようbabelifyためignore正規表現を指定してコンパイルする事をホワイトリストに登録する必要があります。そうすれば、underscoreのようなものは影響を受けません。

+0

ああ、それは面白いです。だから、私はfooを "foo"からもうインポートできなくなるでしょうか?私は[this plugin](https://github.com/genify/babel-plugin-transform-remove-strict-mode)を使用して終了しました。これはおそらくそれが単に厳格な "; use"を削除するだけです。ありがとう! –

+0

これはオプションです。あなたのコードはもはや仕様に準拠していないことに留意してください。そうすればES6モジュールをNodeに置いてから使用したい場合、CommonJSを使用せずにこの問題に直面して修正する方法がありません。 – loganfsmyth

+0

'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 } 
    ] 
] 

});

関連する問題