有没有办法阻止一些变量通过asp.net System.Web.Optimization重命名

时间:2014-09-11 16:53:47

标签: c# asp.net bundling-and-minification

我正在使用ASP.Net捆绑&在AngularJS项目中缩小(System.Web.Optimization)。

除了一种情况外,一切都很完美。

此时,我们必须eval()表达。我们知道这并不理想,但目前没有其他解决方案可以满足我们的需求。

所以我们有这一行:

var isValid = eval('globalJson.Permissions.' + attrs.drHasPermissionFor);

现在,因为缩小已更改变量的名称等globalJson不存在,所以此行失败。

有没有办法指示ASP.Net Minification 重命名特定变量?

更新

根据给出的答案 - 我们已经使用Angulars安全的方式进行注射。

使用它的指令如下所示:

    appDirectives.directive('drHasPermissionFor', ['globalJson', function (globalJson) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                //code .....

                // how can I reference the injected globalJson here - so that i know it's using the
                // newly minified name..
                var isValid = eval('globalJson.Permissions.' + attrs.drHasPermissionFor);

//more code......
            }
        };
    }]);

3 个答案:

答案 0 :(得分:2)

好的 - 所以一位同事想出了解决这个问题的方法。

它并没有真正回答整体"你能告诉优化是否只留下某些变量"问题,虽然它解决了手头的问题。

如果回答最初的问题,我很乐意改变接受的答案。

现在,这可以被黑客攻击:

appDirectives.directive('drHasPermissionFor', ['globalJson', function (globalJson) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {

            // this function will return the minified globalJson
            function returnGlobalJson() {
                return globalJson;
            };

            // call this function as part of the eval - works perfectly :)
            var isValid = eval('returnGlobalJson().Permissions.' + attrs.drHasPermissionFor);

        }
    };
}]);

答案 1 :(得分:1)

Angular有一种以这种方式处理缩小的机制。您必须使用称为内联注释的内容as described here

这可以通过允许缩小器缩小注释,然后angular将使用注释来确定缩小的变量名称是什么。

因此,您可以只注入要使用的变量并使用缩小变量。

这里也有一篇好文章:

http://thegreenpizza.github.io/2013/05/25/building-minification-safe-angular.js-applications/

答案 2 :(得分:0)

我正在使用BuildBundlerMinifier,由于该功能也已缩小,因此使用该功能的解决方案不起作用。

我使用的解决方案是将变量复制到this并在评估中使用this.value,然后再将值复制回变量。

仍然是一种解决方法,但可能会帮助其他人...