我使用meteor create
创建了一个新的流星项目
我运行了npm install -S spacy-nlp
,其中包含一些ES6代码
在我的server/main.js
中,我写了import spacy from 'spacy-nlp'
运行meteor
时,它抱怨Error: The babel-runtime npm package could not be found in your node_modules. Please run the following command to install it: 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。这意味着代码将保持不变。这就是在运行时而不是在构建过程中收到错误的原因。
流星v1.4.2.x使用节点v4.6.2(可以使用meteor node --version
检查节点版本)。
此版本的节点通常不支持解构分配(const {foo} = ...
语法)。这需要使用--harmony_destructuring
标志。您可以通过运行版本为4.x和6.x的节点外壳(REPL)轻松进行测试。
在3个终端会话中键入以下内容:$ meteor node
$ meteor node --harmony_destructuring
$ node
,当节点位于v6 +中时
码:
let bar = () => ({foo: 3}); // 1
let { foo } = bar(); // 2
eval("let { foo } = bar();"); // 3
语句1可以正常运行。
语句v4将不会识别语句2(希望有更多用户输入),并且将按节点v6和v4的预期,使用标志对其进行评估。
语句3强制节点将表达式作为一个单元进行求值,而无需用户进一步输入,因此这将导致节点v4抛出您所看到的错误,并将被节点v6和v4 w / flag正确评估。
这意味着您面临的错误是节点问题,您需要执行以下任一操作:
用
--harmony_destructuring
标志找到一种使Meteor运行节点的方法。分叉包装并更改有问题的表达式。
分叉并将构建配置添加到软件包中(例如,预发布步骤)。
等待Meteor开始使用Node v6(应该很快发生,因为它现在是稳定的LTS版本)。