27

有沒有一種方法來自定義方式Asp.Net MVC4捆綁&縮小功能縮小js文件?Mvc4捆綁,縮小和AngularJS服務

這意味着,我不想完全關閉縮小,但「原樣」它只是打破AngularJs。

由於AngularJs使用DI和IoC機制在控制器注射服務,以下內容:

function MyController($scope) { } 

精縮後,就變成了:

function MyController(n) { } 

通常這不會是一個問題,但AngularJs使用參數名稱來了解要注入哪個服務。所以$ scope應該保持$ scope,以及角度控制器中的任何其他參數。其他一切,如局部變量等,都應該正常縮小。

我找不到任何關於如何配置Mvc4縮小的清晰文檔,它看起來相當愚蠢,因爲它是「全部或全部」,所以我認爲我錯過了一些東西。

謝謝。

+0

從技術上講,http://stackoverflow.com/questions/13032721/system-web-optimization-making-function-argument-names-stay-the-same-for-rtain,雖然我不認爲答案是有道理的。 – drzaus 2013-11-12 18:06:06

+0

這個問題也複製了http://stackoverflow.com/questions/17410012/customizing-net-4-5-bundler-minifier – drzaus 2013-11-12 18:06:37

回答

45

其實你可以(也應該!)編寫AngularJS代碼,這樣它就可以「保證安全」了。細節的http://docs.angularjs.org/guide/di「依賴註釋」部分中,但短描述的,全局定義的控制器,你可以寫:

MyController.$inject = ['$scope'];

請注意,全局定義的控制器被污染全局命名空間(見this有詳細介紹)應該避免。如果您在模塊級聲明控制器,你可以把它縮小安全以及:

angular.module('mymodule', []).controller('MyController', ['$scope', function($scope){ 
//controller code goes here 
}]); 
+1

全球命名空間污染是我將很快解決的另一個問題,所以看來你的解決方案是古典的「一石二鳥」。謝謝。 – 2013-02-16 17:43:06

+0

謝謝!這對我工作:) – 2014-06-05 17:07:50

1

如果你仍然想控制什麼來縮小,什麼不能(或者,如果你想以包括已精縮版插件供應商)剛剛宣佈兩捆,只有運行如下您BundleConfig.cs其中之一:

var dontMinify = new Bundle("~/bundles/toNotMinify").Include(
         "~/Scripts/xxxxx.js"); 
bundles.Add(dontMinify); 

var minify = new Bundle("~/bundles/toNotMinify").Include(
         "~/Scripts/yyyyyy.js"); 
minify.Transforms.Add(new JsMinify()); 
bundles.Add(minify); 
+3

我認爲你的意思是相反的 - 你必須顯式刪除與'dontMinify.Transforms.Clear()'minify變換' – drzaus 2013-11-12 18:01:29

1

對於那些你們誰不想/不能arsed寫的「微小安全「angular-DI語法,並且不關心被混淆的變量名稱,我使用BundleTransfomer和Yui Js縮小器 - 通過nuget提供:

Install-Package BundleTransformer.Core 
Install-Package BundleTransformer.Yui 

對縮小/模糊處理提供了非常細緻的控制。在角度世界中,只需將yui web.config部分中的obfuscateJavascript設置爲false即可。