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即可。