虽然你可能没有在项目中直接使用jQuery,但它作为一个广泛使用的JavaScript库,对于Web生态系统具有重要影响,包括被广泛应用于WordPress等平台。版本4的发布标志着jQuery向前迈进,通过告别对IE 10的支持,移除大量弃用的API,以及迁移到ESM(ECMAScript模块)等方式,逐渐与现代Web技术保持一致。这为开发者提供了更多机会,以更好地适应和利用现代浏览器和Web标准。
jQuery 4.0.0经过长时间的努力终于迎来了Beta版!有很多需要介绍的地方,团队对其发布感到非常激动。我们进行了错误修复、性能改进,并引入了一些破坏性的变更。毕竟,我们终于移除了对IE<11的支持!不过,我们预计对现有项目的影响将会很小。
许多破坏性变更是团队多年来一直想要在补丁或小版本发布中进行的,但由于种种原因未能实现。我们精简了遗留代码,移除了一些先前弃用的API,消除了一些从未记录在文档中的内部函数的参数,并放弃了一些过于复杂的“神奇”行为。
在正式发布之前,我们将提供一份全面的升级指南,详细说明被移除的代码以及迁移方法。jQuery Migrate插件也将准备就绪。目前,请尝试使用Beta版,并告诉我们是否遇到任何问题。
与往常一样,此版本可以在我们的CDN和npm软件包管理器上获得。第三方CDN将不会托管此Beta版本,但将在稍后托管4.0.0最终版本。以下是jQuery 4.0.0 Beta的一些亮点。
再见,IE<11
jQuery 4.0.0不再支持IE 10及更早版本。有人可能会问,为什么我们没有删除对IE 11的支持。我们计划分阶段删除支持,下一步将在jQuery 5.0中实现。目前,我们将首先删除专门支持IE 11之前版本的代码,从而在一个PR中减小867个gzipped字节的体积!
我们还取消了对其他非常旧的浏览器的支持,包括Edge Legacy、iOS <11、Firefox <65和Android Browser。你无需进行任何更改。如果你需要支持这些浏览器之一,只需继续使用jQuery 3.x。
已弃用的API已删除
这些函数在多个版本中已经弃用。现在已经是一个主要版本的发布时机了,是时候移除它们了。这些函数要么一直是内部使用的,要么现在在所有支持的浏览器中都有本机等效物。已移除的函数包括:
- jQuery.cssNumber
- jQuery.cssProps
- jQuery.isArray
- jQuery.parseJSON
- jQuery.nodeName
- jQuery.isFunction
- jQuery.isWindow
- jQuery.camelCase
- jQuery.type
- jQuery.now
- jQuery.isNumeric
- jQuery.trim
- jQuery.fx.interval
移除push
、sort
和splice
jQuery原型长时间以来一直拥有行为不像其他任何jQuery方法的Array方法,这些方法一直都是为内部使用而设计的。这些方法是push
、sort
和splice
。我们已经将这些方法的用法切换到Array函数而不是jQuery原型。例如,$elems.push( elem )
变成了[].push.call( $elems, elem )
。我们在这里提到它是为了防止有插件可能依赖于这些方法的情况。
focusin
和focusout
事件顺序
很长一段时间以来,各种浏览器在焦点和失焦事件的顺序上都没有达成一致,其中包括focusin
、focusout
、focus
和blur
。最终,jQuery 4.0支持的所有浏览器的最新版本都在常见的事件顺序上达成了一致。不幸的是,这与多年前jQuery选择的一致顺序不同,这使得这个变更是破坏性的。至少现在所有人都在同一页面上了!
jQuery在先前版本中所有四个事件的顺序是:
focusout
blur
focusin
focus
从jQuery 4.0开始,我们不再覆盖本机行为。这意味着除了IE之外的所有浏览器将遵循当前的W3C规范,即:
blur
focusout
focus
focusin
对于那些好奇的人,W3C规范以前定义了一个不同的顺序:
focusout
focusin
blur
focus
但是,很少有人认为这是直观的,并且规范在2023年进行了更改以匹配浏览器已经实现的内容。具有讽刺意味的是,唯一遵循旧规范的浏览器是Internet Explorer。
FormData
支持
jQuery.ajax
已经添加了对二进制数据的支持,包括FormData
。以前,二进制数据不是已知的数据类型,并被转换为字符串。虽然可以通过禁用数据转换并手动处理数据来禁用此行为,但我们决定使其自动工作。从技术上讲,这是一个破坏性变更,但应该更接近于预期的行为。
移除自动JSONP提升
以前,jQuery.ajax
使用dataType: "json"
和提供的回调将被转换为JSONP请求。如今,与跨域后端交互的首选方式是使用跨域资源共享(CORS),它在jQuery 4.0支持的所有浏览器中都有效。这应该有助于避免由于使用内联脚本可能导致的意外行为。
jQuery源码迁移到ES模块
当jQuery源码从AMD迁移到ES模块的main
分支时,这是一个特殊的日子。jQuery源码始终与npm和GitHub上的jQuery版本一起发布,但是在没有RequireJS的情况下不能直接导入为模块,而RequireJS是jQuery的构建工具。我们后来切换到Rollup来打包jQuery,我们确实在ES模块上单独运行了所有测试。
Trusted Types和CSP
jQuery 4.0添加了对Trusted Types的支持,确保包装在TrustedHTML中的HTML可以以不违反require-trusted-types-for
内容安全策略指令的方式用作jQuery操纵方法的输入。
除此之外,虽然一些AJAX请求已经使用<script>
标签来保持诸如crossdomain
等属性,但我们已经切换到使用 <script>
标签来避免使用内联脚本引起的任何CSP错误。仍然有一些情况下XHR用于异步脚本请求,比如传递了"headers"
选项(使用scriptAttrs
代替!),但我们现在在尽可能的情况下使用<script>
标签。
更新的slim版本
slim版本在jQuery 4.0.0中变得更小,删除了Deferreds和Callbacks(现在压缩后不到20k字节!)。Deferreds长期支持Promises A+标准,因此在大多数情况下可以使用本机Promise,并且它们在除IE11之外的所有jQuery支持的浏览器中都可用。Deferreds确实具有一些本机Promise不支持的额外功能,但大多数用法可以迁移到Promise方法。如果需要支持IE11,最好使用主版本或为本机Promises添加一个polyfill。
下载
你可以从jQuery CDN获取文件,或直接链接到它们:
https://code.jquery.com/jquery-4.0.0-beta.js
https://code.jquery.com/jquery-4.0.0-beta.min.js
你也可以从npm获取此版本:
npm install jquery@4.0.0-beta
Slim版本
有时你不需要ajax,或者你更喜欢使用许多专注于ajax请求的独立库。而且通常使用CSS和类操作进行Web动画会更简单。最后,除了IE11之外,jQuery支持的所有浏览器现在都支持本机Promises,因此在大多数情况下不再需要Deferreds和Callbacks。除了包含所有内容的常规版本之外,我们还发布了一个“slim”版本,它不包括这些模块。如今,jQuery的大小很少成为加载性能的问题,但是slim版本比常规版本小大约8k字节(压缩后)。这些文件也可在npm软件包和CDN上获得:
https://code.jquery.com/jquery-4.0.0-beta.slim.js
https://code.jquery.com/jquery-4.0.0-beta.slim.min.js
这些更新已经作为当前版本发布到npm和Bower。有关获取jQuery的所有方法的信息,请访问https://jquery.com/download/。公共CDN将于今天收到它们的副本,请给他们一些时间来发布文件。如果你迫不及待地想快速开始,请在CDN上使用这些文件,直到它们有机会更新。
感谢
感谢所有参与此次发布的人,包括提交补丁、报告错误或进行测试的参与者名单以及整个jQuery团队。
我们在Mastodon上!
jQuery现在拥有自己的Mastodon账户。从现在开始,我们将同时在Twitter和Mastodon上发布。此外,您可能会对关注一些拥有Mastodon账户的团队成员感兴趣。
- jQuery: https://social.lfx.dev/@jquery
- mgol: https://hachyderm.io/@mgol
- timmywil: https://hachyderm.io/@timmywil