微软为什么没有压缩 MicrosoftAjax.js 文件?

18

我使用YuiCompressor压缩自己的JS文件,但为什么MicrosoftAjax.js没有被压缩呢?是否有设置可以运行它的压缩版本(如果存在压缩版本)?或者我需要反编译并自己对脚本资源进行压缩处理?


从我得到的回复来看,似乎没有办法直接获得MicrosoftAjax.js的压缩版本。所以像我在我选择的答案中提到的那样,自己动手做是唯一的出路。正如我对Josh所说,在ASP.NET 3.5中,现在可以组合脚本,http://msdn.microsoft.com/en-us/library/cc488552.aspx。我们还没有迁移到3.5,但是当我们这样做时,我会去看看它。我已经添加了jQuery到项目中一段时间了,所以我正在逐渐将所有可以使用jQuery的东西都转换成jQuery。 - nickytonline
2
我的上面的评论不再正确。Dave Ward的答案是正确的,所以不需要自己动手了。 - nickytonline
6个回答

23
我对这些误导性的答案感到惊讶。
ASP.NET AJAX始终提供MicrosoftAjax.js的调试和压缩版本。web.config的debug设置和ScriptManager的ScriptMode属性控制引用哪个脚本。
此外,您可以使用"retail"设置来强制使用压缩脚本。

1
感谢你,Dave。很好知道。 - nickytonline
太棒了,我之前不知道“零售”设置,我们公司有一个习惯,在生产环境中部署仍处于调试模式的东西。 - Matt

7
System.Web.Extensions中的所有脚本都是压缩的——正如Dave Ward的回答所指出的那样,每个脚本都有两个版本。当web.config处于调试模式时,ScriptManager默认使用调试版本。将其切换到发布状态,可以通过设置retail或debug="false"来实现,并查看脚本。
此外,通过WebResourceHandler或ScriptResourceHandler服务的脚本实际上是被缓存的。它们以最好的方式进行缓存——永久性地,因此它们甚至不需要在未来的访问中进行301重定向。查询字符串就是它本来的样子,因为它包含加密数据。它被加密是因为它包含有关脚本资源的信息,包括程序集名称,还因为它可以防止缓存洪泛攻击。
这里并不寻求声望,只是想提供更多细节。

1
了解WebResourceHandler或ScriptResourceHandler被缓存是很好的。因此,我认为当您进行更改并重新部署时,这些文件会再次被缓存,但作为不同的文件,因为加密的查询字符串已更改? - nickytonline
2
是的。对资源的任何更改都将更改查询字符串,从而导致新缓存的项目。另外,我没有提到脚本也被gzip压缩了。 - InfinitiesLoop

3

我之前读过这篇文章,但还是谢谢你在这里发布。不过我想要的是来自Microsoft Ajax的开箱即用解决方案。看起来DIY是解决这个问题的方法。 - nickytonline

1
你更喜欢哪一个:
  1. MicrosoftAjax.js 已经被压缩和混淆了。
  2. MicrosoftAjax.js 未经压缩,开放源代码,让你自己阅读和理解。

虽然拥有两个版本很容易,而且也相当有用,但如果你想走捷径,应该提供未压缩的版本。+1 因为这不值得被踩。 - CJM
@Neil N. 我同意,为什么不两者兼备呢?在开发时使用未压缩的版本,在生产环境中使用经过压缩/混淆的版本。 - nickytonline

0

编辑: 在我回答这个问题的时候,我没有使用过 .NET 3.5;现在我意识到他们在这个领域做出了一些非常必要的改进。


显然,微软并不认为JavaScript文件大小很重要(这是疯狂的)。此外,根据我使用MS Ajax的经验,他们还会将多个SCRIPT标签(有时超过10个)注入到标记中。这些标签从WebResource.axd处理程序中引入脚本。因此,必须进行十次或更多次请求才能获取运行页面所需的Javascript!更荒谬的是,他们在处理程序URL上附加了一个疯狂的查询字符串,这可能会防止浏览器缓存脚本。
这种疯狂的做法足以让我完全放弃MS Ajax并转向jQuery,这是一个更好的库,特别是现在Visual Studio已经支持jQuery的Intellisense

不确定,我给你点赞,因为我和你对ASP.NET Ajax的看法相同。 - Martijn Laarman
我也被踩了 - 或许我们在SO上有一位微软员工? :) 我希望踩票者能解释一下他们为什么这样投票... - CJM
3
在ASP.NET 3.5中,他们现在允许您合并客户端脚本,详见"将客户端脚本合并为复合脚本",链接为http://msdn.microsoft.com/en-us/library/cc488552.aspx。有人尝试过吗? - nickytonline
好知道。我们还没有升级我们的框架,所以还没有尝试过。 - Josh Stodola
1
更正: “微软并不认为JavaScript文件大小很重要”:不正确。他们会在发布模式下自动提供每个脚本的压缩版本。“必须进行10次或更多请求”:这是一个极端情况,我们在大型应用程序中只需要1个请求就可以轻松完成。“这可能会防止脚本被缓存”:尽管一些旧的代理服务器可能无法正确缓存,但这并不会阻止浏览器缓存。在3.5版中,脚本组合器将当前页面的所有脚本都放在一个URL中,一个已缓存的响应中。这包括我们所有的jQuery脚本。 - Nick Craver

-2
我只能假设它被保留原样是为了便于理解,正如你已经暗示的那样,我认为你没有理由不能自己压缩它,毕竟它只是JavaScript - 尽管微软可能让你相信它不同寻常,但他们并没有用神奇的精灵尘使其与众不同! :)
[面对现实吧; 微软从来不担心他们代码的大小,不是吗?]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接