node.js - 我应该如何使用 browserify 和 babelify 转换 ES6 node_modules?

标签 node.js npm gulp ecmascript-6 browserify

为了在我的项目中使用 ES6 语法,我正在使用 gulp、browserify 和 babelify。一旦我导入一个同样用 ES6 编写的 node_module,gulp 就会抛出一个错误:'import' and 'export' may appear only with 'sourceType: module'

我已经在 babelify's github page 上阅读了建议的解决方案.简而言之,两种可能性是:

  1. 向受影响的 node_module 的 package.json 添加 browserify 选项
  2. 配置 gulp,以便 browserify 尝试使用 babelify 转换所有文件(并为不需要的文件添加忽略选项)。

第一个选项会阻止其他人克隆我的项目并立即启动和运行它。是否有解决方法,或许使用 npm 安装后脚本?

第二个选项似乎有点矫枉过正。有没有更优雅的解决方案?

最佳答案

Babelify有一个 only可用于避免转译与正则表达式不匹配的文件的选项。当与 Browserify 的 global 选项结合使用时(默认情况下,转换不会应用于 node_modules 目录中的文件),您可以选择性地转译 node_modules 中的文件.

使用此示例配置:

browserify({ entries: ["index.js"] })
  .transform("babelify", {
    global: true,
    only: /^(?:.*\/node_modules\/(?:a|b)\/|(?!.*\/node_modules\/)).*$/,
    presets: ["es2015"]
  })
  .bundle()
  .pipe(fs.createWriteStream("bundle.js"));

不在 node_modules 中的文件将不会被编译,除非它们在以下之一中:

  • /node_modules/a
  • /node_modules/b

如果在 node_modules 下只有一个目录需要转译,可以将正则表达式简化为:

/^(?:.*\/node_modules\/a\/|(?!.*\/node_modules\/)).*$/

如果你有更多,你可以添加它们:

/^(?:.*\/node_modules\/(?:a|b|c|d)\/|(?!.*\/node_modules\/)).*$/

关于node.js - 我应该如何使用 browserify 和 babelify 转换 ES6 node_modules?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39321384/

相关文章:

gulp - 我如何 gulp.src 整个文件夹及其子文件夹,然后 gulp.dest 基于文件的位置?

node.js - npm-yeoman 中的代理设置

javascript - 带有 npm 的客户端 Prism.js

testing - Gulp 和 Jenkins 中的 Protractor 和 Selenium

node.js - knexjs postgresql 迁移运行不正常

node.js - Mocha 中的观察者自动化

visual-studio - 如何自动将 gulp 创建的文件添加到我的 Visual Studio 项目中?

html - 图像不显示在 Node 元素的浏览器中

facebook - Node.js:如何访问 FaceBook 广告 API

node.js - 使用 Node.js 发布请求内容