javascript - 在 Meteor 中导入 ES6 npm 模块时出现语法错误

标签 javascript node.js meteor npm ecmascript-6

  1. 我使用meteor create创建了一个新的 meteor 项目
  2. 我运行了npm install -S spacy-nlp,其中包含一些 ES6 代码
  3. 在我的 server/main.js 中,我编写了 import spacy from 'spacy-nlp'
  4. 运行meteor后,它提示错误:在您的node_modules中找不到babel-runtime npm包。请运行以下命令进行安装:meteor npm install --save babel-runtime
  5. 我安装了babel-runtime
  6. 然后它提示

    W20161120-16:40:30.175(8)? (STDERR) /Users/prashanthcr/code/es6-meteor-test/node_modules/spacy-nlp/src/start-io.js:3
    W20161120-16:40:30.176(8)? (STDERR) const { spawn } = require('child_process')
    W20161120-16:40:30.176(8)? (STDERR)       ^
    W20161120-16:40:30.177(8)? (STDERR)
    W20161120-16:40:30.178(8)? (STDERR) SyntaxError: Unexpected token {
    

不知道从那里去哪里。为什么我无法导入使用 ES6 的 npm 包?

我在全局安装了 Node.js 7.1.0,并且使用 Meteor 1.4.2.3。

最佳答案

Meteor 不会将 node_modules 中的任何文件编译为 ES5。这意味着代码不变地运行。这就是您在运行时而不是在构建过程中收到错误的原因。

Meteor v1.4.2.x 使用 Node v4.6.2(您可以使用 meteor node --version 检查 Node 版本)。

此版本的 Node 通常不支持解构赋值(const {foo} = ... 语法)。这需要使用 --harmony_destructuring 标志。您可以通过运行版本 4.x 与 6.x 的 Node shell (REPL) 来轻松测试这一点。

在 3 个终端 session 中键入以下内容:

  • $ meteor Node
  • $ meteor Node --harmony_destructuring
  • $node,当 Node 处于 v6+ 时

代码:

let bar = () => ({foo: 3}); // 1
let { foo } = bar(); // 2
eval("let { foo } = bar();"); // 3
  • 语句 1 可以正常运行。
  • 语句 2 不会被 Node v4 识别(需要更多用户输入),并且将由带有标志的 Node v6 和 v4 按预期进行评估。
  • 语句 3 强制 Node 将表达式作为一个单元进行求值,而不期望用户进一步输入,因此它将导致 Node v4 抛出您所看到的错误,并将由 Node v6 和 v4 带标志正确求值。

这意味着您面临的错误是 Node 问题,您需要:

  • 找到一种方法让 Meteor 使用 --harmony_destructuring 标志运行 Node 。
  • fork 软件包并更改有问题的表达式。
  • fork 并向包添加构建配置(例如预发布步骤)。
  • 等待 Meteor 开始使用 Node v6(应该很快就会发生,因为它现在是稳定的 LTS 版本)。

关于javascript - 在 Meteor 中导入 ES6 npm 模块时出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40702220/

相关文章:

javascript - 使用 tf.browser.toPixels() 时内存泄漏

javascript - 检查是否单击了两个元素,并且是否已在 Javascript 的文本框中输入了值

node.js - Webshot 在 DigitalOcean Ubuntu 14.04 中的 Meteor 上失败

javascript - 如何在 Meteor 中重新渲染 React 组件?Meteor 中的 React component.forceUpdate 错误

javascript - 在 Sails.js 中使用 Waterline ORM 时出现 ER_BAD_FIELD_ERROR

javascript - 退出前捕获 Electron 窗口的屏幕截图

javascript - Express.js 应用程序占用 CPU 资源

javascript - GET 请求适用于浏览器的 REST 客户端,但不适用于 JS

android - 部署 meteor 应用程序后无法使用 android-ddp 连接到 meteor

javascript - 按距离排序mongo查询