使用 Google Closure Compiler 缩小一个用 Typescript 编写的 AngularJs 应用程序

Minifying with Google Closure Compiler an AngularJs app written in Typescript

我一直在 Visual Studio 中使用 Typescript 编写一个 AngularJs 应用程序。 Typescript 在构建时将所有文件编译成一个文件。我们在发布时为 google 闭包编译器添加了 post-构建步骤,以缩小单个文件输出。 --compilation_level 参数上 WHITESPACE_ONLY 以外的任何选项都会导致应用程序无法初始化。例如 my.module.name { } 的嵌套模块名称变成 function(a){ function(a) { function (a) { 缩小时。当它在打字稿中注入时,这会导致 angular 错误,最终注入条目是 "modulename.classname" 引用。 AngularJs 无法启动此缩小版,因为它变为 a.classname。请参阅下面的示例,了解它是如何编写的,以及它是如何缩小的。 myApp 在 my.module 模块中,控制器在名为 my.module.name

的子模块中
myApp.controller("myController", ["$scope", "myService", "myService2", name.myControllerClass]);

如果我们知道 myControllerClass 是一个 class 作为控制器编写的,在 .ts 文件的 my.module.name 模块中,这就很好用了。 (它也都被很好地引用了,并且在没有缩小的情况下也能工作)

当用 WHITESPACE_ONLY 以外的任何东西缩小时,输出变为:

(function(a){(function(a){var d=angular.module("MyModule",[]);
d.controller("myController", ["$scope", "myService", "myService2", a.myControllerClass]);

angular 初始化失败说 a 不包含 myControllerClass。这是有道理的,因为在这种情况下 a 是 "my.module" 而不是 "my.module.name"

有没有人以前遇到过这个,有没有人知道允许缩小过去 "WHITESPACE_ONLY" 的解决方案,这对我们的情况来说有点不够好。压缩的不一定是 google 闭包编译器,但我们的打字稿 angularJs 应用程序输出的压缩是必要的。这似乎是一个 Typescript 缩小问题,关于它如何输出其命名空间模块内容,然后是缩小器如何解释它,但我不确定。

angular 框架提供了一个专业指令,旨在帮助识别 Dependency Injection 的潜在问题:ng-strict-di

Strict mode throws an error whenever a service tries to use implicit annotations.

ng-strict-di 方法添加到您的 bootstrap,方法是将其包含在 ng-app (<body ng-app="myApp" ng-strict-di>) 中,或者在手动 [= 时设置 strictDi: true 24=]ping 将启用严格模式。

严格模式不修改代码,生产安全。使用严格模式可以让您识别依赖注入的潜在问题区域,这些区域不是缩小安全的。