我工作的工具以编程方式使用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 }
]
]
});
虽然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
d模块(在本例中为babelrc
)?
答案 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_module
和some_other_es6_module
的模块除外。这样underscore
之类的内容就不会受到影响。