6

在尝试让 Angular (1.x) 与 systemjs 一起工作时,我意识到目前没有能力(据我所知)自动插入$inject到 Angular 组件中,即使函数的参数被破坏,这也能让组件保持工作状态缩小器。手动创建$inject注释是乏味的、容易出错的并且违反了DRY原则。

有一个成熟的 npm 模块ng-annotate可以解决这个问题,并在许多类似的情况下用于捆绑。当我一直在探索 SystemJS 时,我看到有一个插件系统包括翻译源代码的能力,这正是ng-annotate它的功能。

不过,据我所知,SystemJS 只让您能够将特定的文件扩展名映射到单个加载器,并且所有插件示例都支持新的文件类型。我想做的是对 SystemJS 的转译过程的输出进行后处理,而不是添加新的文件类型。看起来 SystemJS 应该能够做到这一点,因为它有一个处理管道,但我不太清楚如何以正确的方式连接它。现在我正在使用 Browserify 来实现相同的效果,但我最终得到了一组相当复杂的构建任务,如果可能的话,我想用 SystemJS 来简化它。

能够ng-annotate在加载器管道中使用 SystemJS 的其他策略也将受到赞赏。

4

1 回答 1

2

最终我想出了一个办法,但这感觉真的很笨拙。 System.src它本身使用一个hook()函数来执行此操作,但它不会导出以供使用。我将不胜感激任何改进这一点的方法,我希望最终可以使用适当支持的机制来链接加载器功能:

var System = require('systemjs');
var systemTranslate = System.translate;
System.translate = function(load) {
  return systemTranslate.call(this, load).then(function (result) {
    if (result) {
      var processedResult = result; // Do your processing here.
      load.source = processedResult;
    }
    return load.source;
  });
}

我没有对此进行太多试验,因为我的 System.js 构建的特定用例目前是一个死胡同(Typescript 源映射仍然被破坏),但大概你也可以返回一个承诺。

我会暂时不选择这个答案,看看是否有人有更好的建议。

于 2015-09-11T22:45:18.043 回答