使用ASP.NET Web Optimization Framework无法缩小jquery 1.9.0和modernizr

Rem*_*emy 30 asp.net jquery modernizr bundling-and-minification

我们正在使用ASP.NET Web Optimization Framework进行捆绑和缩小.一个包只包含jquery和modernizr.这一切都适用于jquery 1.8.3,但由于我们更新到1.9.0,组合jquery/modernizer包不再工作了.

bundles.Add(new ScriptBundle("~/st-scripts-load-first.js")
       .Include("~/Resources/JavaScript/jquery-1.9.0.js",
                "~/Resources/JavaScript/modernizr.form-placeholder.js"));
Run Code Online (Sandbox Code Playgroud)

我们在目录中有jquery-1.9.0.js和jquery-1.9.0.min.js.如果没有.min文件,优化框架将自动生成一个.min文件.如果.min文件存在与否则它不起作用.
它适用于编译debug ="true"并且没有缩小或捆绑.

/* Minification failed. Returning unminified contents.
(5,2-3): run-time warning JS1195: Expected expression: *
(11,60-61): run-time warning JS1004: Expected ';': {
(395,2-3): run-time warning JS1195: Expected expression: )
(397,21-22): run-time warning JS1004: Expected ';': {
(397,4590-4591): run-time warning JS1195: Expected expression: )
(398,28-29): run-time warning JS1195: Expected expression: )
(398,84-85): run-time warning JS1002: Syntax error: }
(402,44-45): run-time warning JS1195: Expected expression: )
(408,1-2): run-time warning JS1002: Syntax error: }
(393,5-22): run-time warning JS1018: 'return' statement outside of function: return Modernizr;
(404,5,406,16): run-time warning JS1018: 'return' statement outside of function: return !!('placeholder' in (Modernizr.input || document.createElement('input')) &&
               'placeholder' in (Modernizr.textarea || document.createElement('textarea'))
             );
 */
Run Code Online (Sandbox Code Playgroud)

awj*_*awj 73

我确定您的问题的原因是jquery-1.9.0.min.js的最后一行:

//@ sourceMappingURL=jquery.min.map
Run Code Online (Sandbox Code Playgroud)

jQuery 1.9的未公开版本不包含此内容.我会在一分钟内解释原因.

我注意到自己,当jquery-1.9.0.min.js与另一个文件捆绑在一起 - 而另一个文件跟在 jquery-1.9.0.min.js之后 - 那么下面的JS文件就是说,损坏.

原因是以下文件的开头被附加到jQuery 的" // @ "行,这意味着它随后成为一个长的扩展注释.在你的情况下,这意味着

window.Modernizr=function(n,t,i){function...
Run Code Online (Sandbox Code Playgroud)

在Modernizr开始时的脚本从捆绑过程中输出作为评论如下:

//@ sourceMappingURL=jquery.min.map window.Modernizr=function(n,t,i){function...
Run Code Online (Sandbox Code Playgroud)

有一个在jQuery的Bug跟踪讨论关于这一点.

您可以选择删除最后一行或将其包装在多行注释符号中:

/*
//@ sourceMappingURL=jquery.min.map
*/
Run Code Online (Sandbox Code Playgroud)

此外,您可以看到Modernizr还在其缩小版本的末尾包含源映射.并有充分的理由.

其背后的基本原理是在使用缩小版本的代码时帮助您调试问题.该行告诉浏览器这个缩小的文件映射到另一个可以帮助调试的文件.要利用这一点,您需要在服务器上拥有该引用文件(jquery.min.map)或下载到客户端.另外,我相信Chrome是目前支持此功能的唯一浏览器; 它仍在Firefox中开发.

此页面对源地图有很好的解释.

总而言之,删除它不应该真正导致任何问题,除非您希望在浏览器中调试时映射回源的原始版本.在您的情况下,由于ASP.NET的优化框架的工作方式,当debug ="True"时,无论如何它都将提供未编译的版本,因此您可能不需要使用sourceMappingURL.

  • 在jquery中修复但不在jquery.migrate :( (6认同)

djm*_*tte 6

我无法回复上面的awj的回答,所以我只是投票了.神奇的侦探工作.我想补充一点评论,虽然问题确实在jquery 1.9.1中修复了,但它现在出现在jquery-migrate-1.1.0中

我注意到地图文件引用只是"jquery-migrate-1.1.0.min.js"文件末尾的单行注释.因此,根据awj的建议,我做了一个多行评论.

所以第3行:

//@ sourceMappingURL=dist/jquery-migrate.min.map
Run Code Online (Sandbox Code Playgroud)

现在成为第3,4和5行如下:

/*
//@ sourceMappingURL=dist/jquery-migrate.min.map
*/
Run Code Online (Sandbox Code Playgroud)

一旦我上传回我的ISP,我再次拥有完整的ajax功能.

再次感谢AWJ,这大大帮助了!