【问题标题】:Mvc4 bundling, minification and AngularJS servicesMvc4 捆绑、缩小和 AngularJS 服务
【发布时间】:2013-02-01 07:17:47
【问题描述】:

有没有办法自定义 Asp.Net MVC4 捆绑和缩小功能缩小 js 文件的方式?

意思是,我不想完全关闭缩小,但“按原样”它只会破坏 AngularJs。

由于 AngularJs 使用 DI 和 IoC 方法在控制器中注入服务,因此:

function MyController($scope) { }

一旦缩小,就变成:

function MyController(n) { }

通常这不会有问题,但 AngularJs 使用参数名称来了解要注入的服务。所以 $scope 应该保持 $scope 以及角度控制器中的任何其他参数。其他一切,如局部变量等,都应该正常缩小。

我找不到任何关于如何配置 Mvc4 缩小的明确文档,而且“全有或全无”似乎相当愚蠢,所以我认为我遗漏了一些东西。

谢谢。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-4 angularjs bundling-and-minification


【解决方案1】:

实际上,您可以(并且应该!)编写 AngularJS 代码,因此它是“缩小安全的”。详细信息在http://docs.angularjs.org/guide/di 的“依赖注释”部分中进行了描述,但简而言之,对于全局定义的控制器,您可以编写:

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

请注意,全局定义的控制器会污染全局命名空间(有关详细信息,请参阅this),应避免使用。如果您在模块级别声明控制器,您也可以使其缩小安全:

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

【讨论】:

  • 全局命名空间污染是我即将解决的另一个问题,因此您的解决方案似乎是经典的“两鸟一石”。谢谢。
【解决方案2】:

如果您仍想控制哪些要缩小,哪些不能(或者如果您想包含插件供应商已经缩小的版本),只需声明两个捆绑包,并且只在您的 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);

【讨论】:

  • 我认为你的意思是相反的——你必须用dontMinify.Transforms.Clear()明确删除缩小转换
【解决方案3】:

对于那些不想/不能编写“缩小安全”的 angular-DI 语法并且不关心变量名被混淆的人,我使用了 BundleTransfomer 和 Yui Js 缩小器- 可通过 nuget 获得:

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

对缩小/混淆提供非常细粒度的控制。在 Angular 世界中,只需将 yui web.config 部分中的 obfuscateJavascript 设置为 false。

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 2017-12-13
    • 2023-03-03
    • 1970-01-01
    • 2013-09-11
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多