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