Babelify 在从 node_modules 导入模块时抛出 ParseError
Babelify throws ParseError on import a module from node_modules
我正在与 Babelify
和 Browserify 合作。此外,我正在通过节点模块系统使用 ES6 样式模块功能。
我想把我自己的所有模块都放入node_modules/libs
。
例如:
test.js
在 node_modules/libs
export default () => {
console.log('Hello');
};
main.js
(将编译为bundle.js
)
import test from 'libs/test';
test();
之后,我用这个命令将上面的代码编译成bundle.js
:
browserify -t babelify main.js -o bundle.js
但不幸的是,我遇到了一些错误:
export default () => {
^
ParseError: 'import' and 'export' may appear only with 'sourceType: module'
目录结构:
[test]
`-- node_modules
│ `-- libs
│ `-- test.js
`-- main.js
但是,当自己的模块不在 node_modules
中时,像这样:
[test]
`-- libs
│ `-- test.js
`-- main.js
然后,它工作正常。如何在 node_modules
中使用带有 babelify
的 ES6 样式模块?
这就是 Browserify 转换的工作方式,转换仅在被引用的模块中直接起作用。
如果您希望 node_modules 中的模块进行转换,您需要向该模块添加 package.json
并添加 babelify
作为该模块的转换.例如
"browserify": {
"transform": [
"babelify"
]
},
在您的 package.json
中加上 babelify
作为依赖项将告诉 browserify
到 运行 该模块内任何文件的 babelify
转换。
让 libs
成为 node_modules 中的文件夹可能不是一个好主意。通常该文件夹中会有真正的独立模块。我通常会说,如果该文件夹不能在其他地方使用和重复使用,那么它不应该在 node_modules.
中
更新
对于最近发布的 Babel v6,您还需要指定要对代码执行哪些转换。为此,我建议在您的根目录中创建一个 .babelrc
文件来配置 Babel。
{
"presets": ["es2015"]
}
和
npm install --save-dev babel-preset-es2015
You can specify source transforms in the package.json
in the
browserify.transform
field. There is more information about how
source transforms work in package.json on the module-deps
readme.
来源:https://github.com/substack/node-browserify#browserifytransform
示例 (my_batman_project/node_modules/test_robin_module/package.json
):
"browserify": {
"transform": [
"babelify"
]
},
browserify 将读取配置并自动执行任何给定的转换。
我认为这个问题实际上与 ESLint 有关。
ESLint 2.0 改变了解释 ES6 模块的要求。 http://eslint.org/docs/user-guide/migrating-to-2.0.0
您需要修改 ecmaFeatures
配置选项并将其替换为:
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
我正在与 Babelify
和 Browserify 合作。此外,我正在通过节点模块系统使用 ES6 样式模块功能。
我想把我自己的所有模块都放入node_modules/libs
。
例如:
test.js
在 node_modules/libs
export default () => {
console.log('Hello');
};
main.js
(将编译为bundle.js
)
import test from 'libs/test';
test();
之后,我用这个命令将上面的代码编译成bundle.js
:
browserify -t babelify main.js -o bundle.js
但不幸的是,我遇到了一些错误:
export default () => {
^
ParseError: 'import' and 'export' may appear only with 'sourceType: module'
目录结构:
[test]
`-- node_modules
│ `-- libs
│ `-- test.js
`-- main.js
但是,当自己的模块不在 node_modules
中时,像这样:
[test]
`-- libs
│ `-- test.js
`-- main.js
然后,它工作正常。如何在 node_modules
中使用带有 babelify
的 ES6 样式模块?
这就是 Browserify 转换的工作方式,转换仅在被引用的模块中直接起作用。
如果您希望 node_modules 中的模块进行转换,您需要向该模块添加 package.json
并添加 babelify
作为该模块的转换.例如
"browserify": {
"transform": [
"babelify"
]
},
在您的 package.json
中加上 babelify
作为依赖项将告诉 browserify
到 运行 该模块内任何文件的 babelify
转换。
让 libs
成为 node_modules 中的文件夹可能不是一个好主意。通常该文件夹中会有真正的独立模块。我通常会说,如果该文件夹不能在其他地方使用和重复使用,那么它不应该在 node_modules.
更新
对于最近发布的 Babel v6,您还需要指定要对代码执行哪些转换。为此,我建议在您的根目录中创建一个 .babelrc
文件来配置 Babel。
{
"presets": ["es2015"]
}
和
npm install --save-dev babel-preset-es2015
You can specify source transforms in the
package.json
in thebrowserify.transform
field. There is more information about how source transforms work in package.json on the module-deps readme.
来源:https://github.com/substack/node-browserify#browserifytransform
示例 (my_batman_project/node_modules/test_robin_module/package.json
):
"browserify": {
"transform": [
"babelify"
]
},
browserify 将读取配置并自动执行任何给定的转换。
我认为这个问题实际上与 ESLint 有关。
ESLint 2.0 改变了解释 ES6 模块的要求。 http://eslint.org/docs/user-guide/migrating-to-2.0.0
您需要修改 ecmaFeatures
配置选项并将其替换为:
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},