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

Plu*_*eco 32 javascript node.js browserify ecmascript-6 babeljs

BabelifyBrowserify一起工作.此外,我正在使用节点模块系统的ES6样式模块功能.

我想把所有自己的模块都放进去node_modules/libs.

例如:

test.jsnode_modules/libs

export default () => {
  console.log('Hello');
};
Run Code Online (Sandbox Code Playgroud)

main.js(将编译为bundle.js)

import test from 'libs/test';

test();
Run Code Online (Sandbox Code Playgroud)

之后,我bundle.js用以下命令编译了上面的代码:

browserify -t babelify main.js -o bundle.js
Run Code Online (Sandbox Code Playgroud)

但不幸的是,我有一些错误:

export default () => {
^

ParseError: 'import' and 'export' may appear only with 'sourceType: module'
Run Code Online (Sandbox Code Playgroud)

目录结构:

[test]
  `-- node_modules
  ? `-- libs
  ?  `-- test.js
  `-- main.js
Run Code Online (Sandbox Code Playgroud)

但是,当自己的模块不是node_modules这样的时候:

[test]
  `-- libs
  ? `-- test.js
  `-- main.js
Run Code Online (Sandbox Code Playgroud)

然后,它工作正常.我如何使用ES6风格模块,babelifynode_modules

log*_*yth 46

这就是Browserify转换工作的方式,转换只会直接在被引用的模块中产生影响.

如果您希望node_modules中的模块具有转换,则需要package.json将该模块添加到该模块并添加为该模块babelify的转换.例如

"browserify": {
  "transform": [
    "babelify"
  ]
},
Run Code Online (Sandbox Code Playgroud)

在你的package.jsonplus中babelify作为依赖将告诉在该模块内的任何文件上browserify运行babelify转换.

libs在node_modules文件夹然而可能是一个坏主意.通常,该文件夹中将包含真正的独立模块.我通常会说,如果文件夹无法在其他地方使用和重用,那么它不应该在node_modules中.

更新

对于最近发布的Babel v6,您还需要指定要对代码执行哪些转换.为此,我建议.babelrc在根目录中创建一个文件来配置Babel.

{
  "presets": ["es2015"]
}
Run Code Online (Sandbox Code Playgroud)

npm install --save-dev babel-preset-es2015
Run Code Online (Sandbox Code Playgroud)

  • 这不是我想要的,我添加预设`"browserify":{"transform":[["babelify",{"presets":["es2015"]}]]}`并且这样做 (2认同)

mat*_*e64 5

您可以指定源转换package.jsonbrowserify.transform字段.有关源变换在package.json中如何在module-deps自述文件中工作的更多信息.

资料来源:https://github.com/substack/node-browserify#browserifytransform


示例(my_batman_project/node_modules/test_robin_module/package.json):

"browserify": {
  "transform": [
    "babelify"
  ]
},
Run Code Online (Sandbox Code Playgroud)

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

  • 基于这个答案,我发现我需要一个额外的步骤来使用Babel 6.0.从版本6.0开始,Babel是一个通用平台,默认情况下不再转换ES2015.在[babel-preset-2015](https://github.com/babel/babel/tree/master/packages/babel-preset-es2015)之后,我创建了一个.babelrc文件来加载es2015预设,解决这个问题`ParseError`问题. (5认同)