当使用类装饰器时,Angular2 + Jspm.io:reflect-metadata shim是必需的

N.S*_*per 53 systemjs jspm typescript1.5 angular

我在使用Angular2和SystemJS运行以下版本的JSPM时遇到以下问题(版本:Angular@2.0.0-alpha.27,JSPM @ 0.16.0-beta.2和SystemJS@0.18.0)曾经的打字稿是编译(没有错误)我在浏览器中收到以下错误:

/jspm_packages/npm/angular2@2.0.0-alpha.27/src/util/decorators.js:70 Uncaught reflect-metadata shim is required when using class decorators
Run Code Online (Sandbox Code Playgroud)

现在,当我手动包含文件Reflect.js:\ jspm_packages \npm\reflect-metadata@0.1.0\Reflect.js时,问题就消失了但是下一个问题出现了,说明列表在另一个角度文件中是未定义的.

从system.js和typescript/jspm.io看到下面的bitbucket src中的配置文件(src代码)

https://bitbucket.org/schippie/angular-2-jspm-hello-world/src/8af83f2066e5e3e9eede7db495545234f3b0c04a

我想知道的是,如果它现在甚至可以使用jspm和system.js来检索角度正常运行所需的所有角度包.看作system.js的配置确实明确指出angular取决于它:

"npm:angular2@2.0.0-alpha.27": {
  "fs": "github:jspm/nodelibs-fs@0.1.2",
  "path": "github:jspm/nodelibs-path@0.1.0",
  "process": "github:jspm/nodelibs-process@0.1.1",
  "reflect-metadata": "npm:reflect-metadata@0.1.0",
  "rx": "npm:rx@2.5.1",
  "url": "github:jspm/nodelibs-url@0.1.0",
  "zone.js": "npm:zone.js@0.5.1"
},
Run Code Online (Sandbox Code Playgroud)

但它们未被检索(查看网络选项卡)

小智 66

是的,你正在寻找的是可能的并且运作良好.看起来好像你有依赖关系.我认为您只缺少以下内容,这些内容需要位于顶级打字稿或JavaScript文件的开头.具体来说,这些需要在第一行之前加载Angular.

import 'zone.js';
import 'reflect-metadata';
Run Code Online (Sandbox Code Playgroud)

(另一个答案指向一个详细但非现场的解释.)

  • 不要忘记添加`jspm install reflect-metadata zone.js`. (3认同)
  • 虽然这有效,但是如果你使用bundle-sfx捆绑源它可以工作,但它会抛出一个"超出最大调用堆栈大小"的错误.我认为,因为angular2还包含reflect-metadata和zone.js作为依赖关系,它会在某处导致循环依赖. (3认同)

N.S*_*per 13

Robwormald写了一个非常详细的解释,涵盖了人们可能在这一点和时间试图获得角度alpha 27与jspm和typescript https://gist.github.com/robwormald/429e01c6d802767441ec一起工作的问题