Babelify 在从 node_modules 导入模块时抛出 ParseError

Babelify throws ParseError on import a module from node_modules

我正在与 BabelifyBrowserify 合作。此外,我正在通过节点模块系统使用 ES6 样式模块功能。

我想把我自己的所有模块都放入node_modules/libs

例如:

test.jsnode_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"
  ]
},

将读取配置并自动执行任何给定的转换。

我认为这个问题实际上与 ESLint 有关。

ESLint 2.0 改变了解释 ES6 模块的要求。 http://eslint.org/docs/user-guide/migrating-to-2.0.0

您需要修改 ecmaFeatures 配置选项并将其替换为:

  "parserOptions": {
    "ecmaVersion": 6,
    "sourceType": "module"
  },