29

已经学习 ES6、JSPM 和 angular2 一个星期了,我发现了这个 repo ES6-loader

如果我们查看底部脚本中的 index.html,您会看到

 System.import('reflect-metadata')
  .then(function() {
    return System.import('app/index');
  })
  .catch(console.log.bind(console));

这是使用 JSPM 的 systemjs polyfill 来获取 ES6 的import.

问题: 在这种情况下,反射元数据真正做了什么?npm reflect-meta阅读文档越多,我就越不了解它的作用?

4

1 回答 1

53

'reflect-metadata' 是一个为 ES7 提议的包。它允许将元数据包含到类或函数中;本质上它是语法糖

例子。角 2 ES6:

@Component({selector: "thingy"})
@View({template: "<div><h1>Hello everyone</h1></div>"})
class Thingy{};

如您所见,@Component 和@View 之后没有分号。这是因为它们本质上是类上的(元)数据链。

现在让我们看看 Angular 2 中的相同代码,但在 ES5 中:

function Thingy(){}
Thingy.annotations = [
    new angular.ComponentAnnotation({
        selector: "thingy"
    }),
    new angular.ViewAnnotation({

        template: "<div><h1>Hello everyone</h1></div>"
    })
];

如您所见,@ 符号抽象出了类的许多 annotations 属性,并使其更干燥

更进一步,Angular 团队知道注解对于新用户来说有点抽象。此外,ES5 太冗长了。这就是为什么他们做了a.js这将使与注释的接口更好:

视频来理解这一点

于 2015-06-04T22:10:43.073 回答