在Meteor中导入ES6 npm模块时的SyntaxError

时间:2016-11-20 08:49:33

标签: javascript node.js meteor npm ecmascript-6

  1. 我使用meteor create
  2. 创建了一个新的流星项目
  3. 我跑npm install -S spacy-nlp,其中包含一些ES6代码
  4. 在我的server/main.js中,我写了import spacy from 'spacy-nlp'
  5. 运行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
  6. 我安装了babel-runtime
  7. 然后抱怨

    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 {
    
  8. 不知道从哪里去。为什么我不能导入使用ES6的npm包?

    我在全球安装了Node.js 7.1.0,而我正在使用Meteor 1.4.2.3。

3 个答案:

答案 0 :(得分:1)

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

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

此版本的节点通常不支持解构赋值(const {foo} = ...语法)。这需要使用--harmony_destructuring标志。您可以通过运行版本4.x与6.x的节点shell(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 将正常运行。
  • 语句2 将无法被节点v4识别(期望更多用户输入),并将按节点v6和v4的预期进行评估。
  • 语句3 强制节点将表达式作为一个单元进行评估而不期望用户进一步输入,因此它将导致节点v4抛出您看到的错误,并将由节点v6正确评估和v4 w / flag。

这意味着您遇到的错误是节点问题,您需要:

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

答案 1 :(得分:0)

这里有一个关于babel-runtime的故事,这对我来说似乎有点混乱,但我认为解决方案是做

meteor npm install --save babel-runtime

https://forums.meteor.com/t/meteor-1-4-2-1-is-an-important-patch-for-1-4-2-users/31190

答案 2 :(得分:0)

Meteor拒绝对node_modules中的内容做任何事情,以为这些软件包应该已经可以分发了。

但是越来越多的npm软件包在打包前没有从ES6进行转译,因此Meteor被迫迁移到look into this

对于不需要修改解决方案的软件包来说,这很容易(一旦知道):

node_modules/<package>到应用程序中的某个位置(可能是import)建立符号链接。没有流星认为这是您的应用程序中的代码,并且可以执行所需的任何操作。