如何以编程方式将选项传递给Babel转换/插件?

时间:2017-02-21 07:52:53

标签: javascript node.js babeljs strict

我工作的工具以编程方式使用Babel。它需要很少的插件,一切正常。

那么,我想将选项传递给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 }
        ]
    ] 
});

虽然es2015reactifypresets数组中运行良好,但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 d模块(在本例中为babelrc)?

1 个答案:

答案 0 :(得分:1)

一般来说,这里推荐的方法是禁用ES6模块支持,因为ES6模块是自动严格的。 e.g。

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_modulesome_other_es6_module的模块除外。这样underscore之类的内容就不会受到影响。