【问题标题】:Aurelia / ES6 class and property definition, plumber syntax errorAurelia / ES6 类和属性定义,管道工语法错误
【发布时间】:2015-06-19 07:40:43
【问题描述】:

我正在尝试让 Aurelia 的入门应用程序正常工作,但我在第一页就遇到了错误。 http://aurelia.io/get-started.html

有问题的代码:

export class Welcome {
  heading = 'Welcome to the Aurelia Navigation App!';
  firstName = 'John';
  lastName = 'Doe';

  get fullName(){
    return `${this.firstName} ${this.lastName}`;
  }

  welcome(){
    alert(`Welcome, ${this.fullName}!`);
  }
}

错误:

    [21:46:19] Plumber found unhandled error:
 SyntaxError in plugin 'gulp-babel'
Message:
    D:/workspace/aurelia/navigation-app/src/app.js: Unexpected token (2:10)
  1 | export class Welcome {
> 2 |   heading = 'Welcome to the Aurelia Navigation App!';
    |           ^
  3 |   firstName = 'John';
  4 |   lastName = 'Doe';
  5 |
[21:46:19] Finished 'build-system' after 20 ms

我不得不说我在windows上,它可能会造成一些麻烦。


我通过将变量放在构造函数中“解决”了这个问题。但是上面的语法不是有效的 ES6 吗?是 ES7 还是什么还不能用?


我知道这段代码看起来很奇怪,但我不是作者,它是来自 Aurelia 教程的原始代码

【问题讨论】:

  • 不知道你是如何设置的,很难说它为什么不起作用。我在 Windows 中构建了导航应用程序,它工作正常。可能是你的依赖有问题。
  • 我真的按照入门页面的所有说明进行操作。只是语法问题使它如此奇怪......
  • @sam 我更新了您的问题以提供更好的上下文,如果您不同意,请告诉我,我可以撤消它。问题在于您的 ES6 语法,并非特定于 Aurelia。有意义吗?
  • 我不确定它是 ES6 但可能直接是 ES7 ,因为这种语法在 ES6 中无效

标签: javascript ecmascript-6 aurelia


【解决方案1】:

但是上面的语法是不是 ES6 无效?

不,不是。类主体只能包含方法定义。不过,它似乎在 Babel 的实验模式下工作。

我通过将变量放在构造函数中“解决”了这个问题。

这是正确的解决方案。数据 properties 通常应该是实例属性。如果你想把它们放在原型上,你必须在 ES6 中明确地这样做:

export class Welcome {
  constructor() {
    this.firstName = 'John';
    this.lastName = 'Doe';
  }

  get fullName(){
    return `${this.firstName} ${this.lastName}`;
  }

  welcome(){
    alert(`Welcome, ${this.fullName}!`);
  }
}
Welcom.prototype.heading = 'Welcome to the Aurelia Navigation App!';

【讨论】:

  • 我还是想知道为什么 Aurelia 的首页给出了这个代码,因为它应该是 ES7 代码,那么我只能猜测它应该与他们的库一起使用?
  • thias 不是一个糟糕的答案,尽管它也不是最好的答案
【解决方案2】:

以下语法对于类不是有效的 ES6 语法。但是,它是类的有效 ES7 属性初始化器语法。要使用它,如果您使用的是 Babel,则需要确保专门启用此功能。这在 Aurelia 博客中有记录,并被配置为最新框架的一部分。

export class Welcome {
  heading = 'Welcome to the Aurelia Navigation App!';
  firstName = 'John';
  lastName = 'Doe';

  get fullName(){
    return `${this.firstName} ${this.lastName}`;
  }

  welcome(){
    alert(`Welcome, ${this.fullName}!`);
  }
}

【讨论】:

  • 谢谢!这就是我所怀疑的,而且最新的骨架确实可以完美运行,感谢这个伟大的框架!
  • 那么我该如何启用它呢?我和 aurelia 有同样的问题
  • 你的 Babel 选项应该如下所示: module.exports = { modules: 'system', moduleIds: false, cmets: false, compact: false, stage:2, optional: [ //注意这些可选的 ES7 特性被启用 "es7.decorators", "es7.classProperties" ] };
  • @EisenbergEffect 您已经告诉博客解决方案在哪里,但您没有提供链接。能否请您也添加它以供参考?
  • 可选属性不适用于 babel 6。我找到了这个 here,但我并不聪明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2018-08-29
  • 2016-11-13
  • 2022-01-01
  • 2017-06-21
  • 1970-01-01
相关资源
最近更新 更多