31

我们正在使用 ASP.NET Web 优化框架与捆绑和缩小。一个包只包含 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"));

我们在目录中有 jquery-1.9.0.js 和 jquery-1.9.0.min.js。如果没有 .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'))
             );
 */
4

4 回答 4

73

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

//@ sourceMappingURL=jquery.min.map

jQuery 1.9 的未缩小版本不包含此内容。我会在一分钟内解释为什么。

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

原因是以下文件的开头附加到 jQuery 的“ //@ ”行,这意味着它会变成一个长的、扩展的注释。在您的情况下,这意味着

window.Modernizr=function(n,t,i){function...

Modernizr 开始时的脚本作为注释从捆绑过程中输出,如下所示:

//@ sourceMappingURL=jquery.min.map window.Modernizr=function(n,t,i){function...

有一个关于 jQuery 的 Bug Tracker的讨论。

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

/*
//@ sourceMappingURL=jquery.min.map
*/

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

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

此页面对 Source Maps 有很好的解释。

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

于 2013-01-24T11:23:30.247 回答
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

现在变为第 3、4 和 5 行,如下所示:

/*
//@ sourceMappingURL=dist/jquery-migrate.min.map
*/

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

再次感谢AWJ,这对您有很大帮助!

于 2013-02-12T13:26:11.283 回答
3

阅读答案,即使是已接受的答案,建议解决此问题的方法是修改您的脚本,以便捆绑程序对此没有任何问题。这对我来说毫无意义,这显然是捆绑器没有正确连接不同脚本的错误,特别是当 n 脚本的最后一行是普通行注释时,捆绑器有问题

// this is the last line of the n script

然后你的下一个脚本不是以单行注释开头

function(){ var ...

捆绑器,默认情况下配置;为 a,ConcatenationToken所以捆绑的代码最终是这样的:

// this is the last line of the n script;function(){ var ...

脚本加载肯定会在某处出现语法错误而失败。

有人建议将脚本的最新行修改为不是内联注释,使其成为多行注释,因此当代码以*/解析器结尾时,可以在其后添加函数声明或其他内容。

我不喜欢修改我的脚本,许多是由其他人(jquery 等)编写的,我不想修改它们,如果我必须升级它们并且在我升级网站后会再次发现这个错误怎么办?它不在debug="true"配置中运行。

我提供的这个解决方案对我来说效果更好

bundles.Add(new ScriptBundle("~/bundles/mobile") { 
                ConcatenationToken = ";\r\n" }
       .Include("~/Scripts/jquery-1.11.3*",
                "~/Scripts/jquery-timeago*",
                "~/Scripts/jquery.mobile-1.4.5*",

通过这种方式,我们强制捆绑器始终使用换行符分隔脚本。当前一个脚本的最后一行是单行注释时,它应该默认执行此操作。

于 2015-08-11T18:40:39.950 回答
0

您的 modernizr.form-placeholder.js 副本可能有问题。

我在尝试加载 jquery.peity.js 时遇到了同样的错误。

当我删除库时,页面加载正常。所以我只是去从他们的网站上抓取原始 js 并重新制作文件,它加载没有问题。

于 2013-01-23T21:56:53.993 回答