[译]TypeScript 2.0 Beta发布

今天我们非常兴奋地推出了TypeScript 2.0 beta版。如果你还不熟悉TypeScript,现在你就可以去我们的网站上学习。

获取beta版,你可以下载TypeScript 2.0 Beta for Visual Studio 2015 (此更新需要VS 2015 Update 3),或者运行

npm install -g typescript@beta

这个版本包含大量新特性,如新的方式获取.d.ts文件,但是这里的一些特性仅仅是对其了解。

非空类型

nullundefined是JavaScript bugs中最常见的两个来源。在TypeScript 2.0 之前,nullundefined存在每一类型域中。这意味着如果你有一个带有string类型参数的函数,你不能肯定是单一类型的,实际上有可能是string类型,也有可能是null类型。

在TypeScript 2.0,新的--strictNullChecks编译参数改变这一不确定性。string类型就是string类型,number类型就是number类型。

let foo: string = null; // 错误!

如果你为空呢?我们已经带来两个新的类型:nullundefined。正如你所料,null仅仅是null,undefined仅仅是undefined。对它们自己而言作用不大,但是你可以在联合类型中使用它们去定义是否可以包含null/undefined

let foo: string | null = null; // 正确!

由于作为开发者的你可能经常比编辑器的类型系统懂得更多,因此我们还推出了一个后缀操作符!,这个操作符可以从任何一个表达式从排除nullundefined

declare let strs: string[] | undefined;

// 错误! 'strs' 也许是undefined.
let upperCased = strs.map(s => s.toUpperCase());

// 'strs!' 意味着我们确定它不是'undefined', 因此我们可以调用'map'.
let lowerCased = strs!.map(s => s.toLowerCase());

基于控制流的类型分析

TypeScript对处理可空类型的支持成为可能,要归功于在整个程序中跟踪类型的变化。在2.0中,我们已经开始使用控制流分析,以便更好地了解在指定的位置是什么类型。例如,考虑下面这个函数。

/**
 * @param recipients An array of recipients, or a comma-separated list of recipients.
 * @param body Primary content of the message.
 */
function sendMessage(recipients: string | string[], body: string) {
 if (typeof recipients === "string") {
 recipients = recipients.split(",");
 }

// TypeScript 知道这里的'recipients'是'string[]'类型.
 recipients = recipients.filter(isValidAddress);
 for (let r of recipients) {
 // ...
 }
}

注意,在if块内赋值后,TypeScript知道它已经被处理成为了一个string类型的数组。这类事情可以在早期发现问题并节省你在调试上花费的时间。

let bestItem: Item;
for (let item of items) {
 if (item.id === 42) bestItem = item;
}

// 错误! 如果'items'是空的,'bestItem' 可能还没有被初始化。
let itemName = bestItem.name;

我们非常感谢Ivo Gabe de Wolff,他参与这一特性的实施工作,这也开始了他的论文项目并成长为TypeScript本身的一部分。

简易模块声明

有时候你仅仅想要告诉TypeScript有一个模块存在,并且你可能不关心它具体的内容是什么样子的。以前你要像下面这样写:

declare module "foo" {
 var x: any;
 export = x;
}

但是这样太麻烦的,因此我们使声明模块变得更加简易并且摆脱了样板。在TypeScript 2.0 中你可以这么写

declare module "foo";
declare module "bar";

当你准备好最终要写一个包含具体内容的模块时,你可以返回这些声明并定义你需要的结构。

如果你依靠一个有很多模块的软件包呢?为每一个模块书写一遍可能是痛苦的,但是TypeScript 2.0 通过使用通配符*使之变得容易。

declare module "foo/*";

现在您可以导入任何以foo/开头的路径,TypeScript会认为它存在。
你可以利用这一点,如果你的模块加载器也知道如何导入基于一个特定的模式。例如:

declare module "*!text" {
 const content: string;
 export = content;
}

现在每当你导入一个结尾带有!text的路径时,TypeScript就会知道导入的是string类型。

import text = require("./hello.txt!text");
text.toLowerCase();

关于模块这一部分,博客描述的太简单了,很多人可能不能明白,建议看看GitHub上的这部分内容

下一步

你可能想知道的一个特性是在ES3和ES5中支持async/await,最初,这是定于2.0版本。然而,合理的实现async/await,我们需要重写TypeScript的emitter,这会引起一系列的变化。这样做的同时还要保持TypeScript快速更新,就需要大量的工作和对细节的关注。虽然我们对于今天的实现充满了信心,但是信心不是彻底的测试,并且需要更多的时间用于async/await的稳定。你可以在TypeScript 2.1 中期待它的出现,如果你想要跟踪进度,在GitHub上的Pull request当前是公开的

TypeScript 2.0 还充满了许多有用的新功能,随着时间的推移我们将推出更多细节。如果你想听到更多的新特性,你可以看一下我们的wiki。在未来的几周内,一个更加稳定的候选版本将发布,随后最终的正式版将会发布。

我们很乐意听听你的任何反馈,无论是在下面的评论或GitHub上。黑客快乐!

使用Sublime Text打造Web集成开发环境

俗话说:“工欲善其事,必先利其器”,俗话还说了:“砍柴不误磨刀工”,当今又说了:“生产力中最活跃的因素是生产工具” 可见工具是有多么的重要,因此为自己打造一款顺手的开发工具是很有必要的。我们都知道sublime是非常棒的编辑器,插件非常的丰富,今天我就介绍几个sublime插件来打造一个web集成开发环境。

近几年web前端开发非常活跃,前端技术也基本不再依赖后端的模板引擎了,比如jsp/asp/php等后端语言模板引擎。web前端也开始从蛮荒时代走向了工程化的时代。以前来看前端就是“性功能障碍(这词是某个前端行业老总说的)”,确实如此,性能低,工具差,能力有限(调用硬件底层api不行)。如今随着HTML5/CSS3/ES6及其相关技术的发展,web这些问题基本都得到了解决。

今天我们就来谈谈工具,你看java有Eclipse,.net有宇宙级IDE——VS,oc和swift有Xcode,都是强有力的开发工具。再看看我们前端,基本开发都是编辑器了比如Vim/Emacs/Notepad++/Dreamweaver/Atom/Sublime Text/WebStorm/VS Code以及记事本等等。放在以前这些编辑器都是能应对web项目的,可是现在的web项目越来越庞大越来越复杂,单纯使用编辑器已经无法应对了,我们需要不断强化编辑器,Atom/Sublime Text和VS Code都支持丰富的插件,尤其是Sublime Text编辑器的插件相当丰富,Sublime Text还是跨平台的,你可以在你喜欢的系统上使用它,Sublime Text是我目前最喜欢的编辑器没有之一。

下载Sublime Text

首先我们得安装一个Sublime Text编辑器(如果你没有安装的话),Sublime Text是一个商业的编辑器也就是需要收费的,但是你可以长期免费试用。

我们打开Sublime Text官网就可以一个非常明显的下载按钮,现在默认下载Sublime Text 3,点击下载按钮下载即可,如果你想下载Sublime Text 2,可以点击这里,建议使用最新版本的Sublime Text。

给Sublime Text安装包管理器

安装完毕后,我们需要给sublime安装包管理,包管理就是管理sublime插件的,比如安装插件、卸载插件和禁用插件等功能。

首先我们打开sublime的控制台,你可以在菜单中依次点击View > Show Console或者快捷键ctrl+`(这个就是数字1左边那个键),然后复制下面相对应版本的代码到光标处粘贴并且回车即可,安装完毕后你可以在菜单中依次点击Preferences > Package Control或者快捷键ctrl(cmd)+shift+p输入cip看看有没有Package Control: Install Package,如果有那说明安装成功了,如果没有你可以重启sublime再次查看,重启后还没有那可能安装失败,请按照步骤再次安装。

Sublime Text2包管理器

import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')

Sublime Text3包管理

import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

包管理器官方网站安装说明,请点击这里

包管理器常用命令

  1. Package Control:Install Package 安装包
  2. Package Control:Remove Package 移除包
  3. Package Control:Upgrade Package 升级包
  4. Package Control:Disabled Package 禁用包
  5. Package Control:Enable Package 使用包
  6. Package Control:List Packages 列出所有包

安装Nodejs

现在前端很多项目都需要Nodejs或者npm来做一些处理,建议大家都安装一下Nodejs,首先去Nodejs官网下载安装最新版的Nodejs,最新版的Nodejs已经自带了npm。

npm是Nodejs的包管理器,你可以把它看做和刚才sublime里的包管理一样的都是下载工具,有了npm我们就可以方便的下载项目中需要的包。npm同样也有安装包、卸载包和查看过时包等等功能。

修改npm的register

由于我们在中国是吧你们都懂的,因此我们得用淘宝的npm镜像,你可以打开淘宝NPM镜像官网看看,我们使用下面命令来修改npm的config中的registry:

npm config set registry https://registry.npm.taobao.org

设置完毕可以使用这行命令来检测一下

npm info underscore

如果配置正确会输出字符串。

npm常用命令

  1. npm -v 查看npm版本
  2. npm help 查看帮助
  3. npm init 引导创建package.json文件。
  4. npm install 安装package.json文件已保存的包
  5. npm install <包名称> 在本地安装包
  6. npm install <包名称> -g 在全局安装包
  7. npm install <包名称> --save 安装的同时将信息写入package.json文件中的dependencies
  8. npm install <包名称> --save-dev 安装的同时将信息写入package.json文件的devDependencies
  9. npm uninstall <包名称> 卸载本地包
  10. npm uninstall <包名称> -g 卸载全局包
  11. npm uninstall <包名称> -save 卸载的同时将信息从package.json文件中的dependencies移除
  12. npm uninstall <包名称> -save-dev 卸载的同时将信息从package.json文件中的devDependencies移除
  13. npm list 查看本地所有包
  14. npm list -g 查看全局所有包
  15. npm root 查看本地包安装路径
  16. npm root -g 查看全局包安装路径
  17. npm outdated 查看本地过期包
  18. npm outdated -g 查看全局过期包
  19. npm update 升级本地所有过期包
  20. npm update -g 升级全局所有过期包
  21. npm update <包名称> 升级本地包
  22. npm update <包名称> -g 升级全局包

说明:-g代表global全局,有时候你也可能看到这样的命令npm i <包名称>,其中i代表install安装。

安装好了npm前端开发就如虎添翼,想要什么就来什么,建议多学习一些npm的命令。

npm插件

npm安装后以后,我们需要在项目中安装依赖或者安装gulp插件都需要切换到命令行(终端)中去执行相关命令,很是不舒服,如果能在sublime中完成就好了,这个早就有前辈想到了。

sublime有npm插件,我们使用sublime包管理很容易就安装成功npm插件,安装完成后就可以在sublime的命令中看到npm,这样我们在sublime中就可以使用npm的操作命令,但是npm执行的某些操作会导致sublime崩溃掉,因此我个人不太建议使用npm插件。

安装步骤:ctrl(cmd)+shift+p,然后输入npm,选中npm回车即可安装。

gulp插件

现在很多web项目都是用了gulp来构建,一般我们可能都是在命令行(终端)工具中去执行gulp命令,我觉得这是很麻烦的一件事情,因此我想在sublime中集成gulp的一些,我们使用sublime的包管理器去搜索gulp关键字发现有gulp插件,选中安装即可。

安装完成后,你就可以使用gulp的一些命令操作了,我们先来看一下sublime gulp插件的github说明文档,文档已经很详细的介绍了gulp插件的用法。有了gulp插件我们就不需要再切换到命令行(终端)中执行gulp任务了,简单方便。

常用的操作命令:

  1. Run Default Task 执行默认的gulp任务。
  2. Run Arbitrary Task 执行指定的gulp任务。
  3. List Tasks to Run 列出所有的gulp任务选择其中一个去执行。
  4. Delete Cache 删除gulp缓存。
  5. Kill All Gulp Tasks 终止所有的任务。
  6. List Gulp Plugins 列出gulp插件

说明:

  • 如果你的项目中只有一个gulpfile.js可以直接在sublime命令中使用
  • 如果你的项目中有多个gulpfile.js可以在gulpfile.js文件右击执行任务

安装步骤:ctrl(cmd)+shift+p,然后输入gulp,选中gulp回车即可安装。

svn插件

项目开发基本都会用到版本管理工具,而我用到最多的就是svn,在windows上有非常棒的小乌龟svn客户端,但是mac上就没有这么棒的客户端了,相对而言我更喜欢在mac上使用svn的命令来执行版本的操作。无论是在小乌龟的客户端操作还是在命令行(终端)中使用命令操作都需要切换,我个人很喜欢在一个环境中去完成这些操作,不想一会儿调到文件夹中一会儿调到命令行(终端)中,一会儿又调回编辑器,很凌乱容易造成一些非技术的问题浪费时间,因此我在sublime中装了svn插件。

同样我们使用包管理器安装svn插件,安装完毕后,就可以在sublime中使用svn操作了,相当简单,如果你只是用到了更新、提交、查看日志等基础操作都是没有任何问题。如果用到了分支合并等一些高级的操作,这个插件也是可以轻松搞定的。此外有些要注意的情况,比如第一次检出的时候大量的IO操作很容易卡死sublime,建议涉及到大量IO操作时使用客户端或者命令来执行,以防卡死sublime。

常用的操作命令:

  1. svn update 更新
  2. svn commit 提交
  3. svn log 查看日志
  4. svn info 查看当前仓库信息
  5. svn status 查看当前工作副本状态
  6. svn revert 撤销更改

说明:

  • 直接在sublime的命令中操作是操作整个项目
  • 在文件夹(文件)右击选择svn操作是操作当前文件夹(文件)

安装步骤:ctrl(cmd)+shift+p,然后输入svn,选中svn回车即可安装。

总结

我们的项目中没有使用到yeoman和bower,因此也并没有安装相关插件,如果你的项目使用到了可以安装相应插件,更多插件可以访问sublime的插件网站。经过上面的一番折腾,sublime就变成了一个强有力的web开发环境,可以说是一个轻量级的IDE了,并且是跨平台的。安装需要的包依赖npm插件可以轻松搞定,执行gulp任务gulp插件可以轻松搞定,版本管理svn插件同样轻松搞定,我们可以在一个稳定的环境中完成所有与项目相关的操作,不必跳来跳去影响工作效率。

最后推荐一款主题Seti_UI,这个主题提供很多文件图标,非常友爱。

[译]jQuery3新特性

jQuery称霸web江湖已经有十年了,它屹立不倒是有原因的。jQuery提供了用户容易操作DOM的接口,执行Ajax请求,创建动画,以及更多。另外,与DOM API不同,jQuery实现了复合模式。因此,你可以使用在一个无论包含多少(零个、一个或者更多)元素的jQuery集合上调用jQuery方法。

在未来几周内,jQuery随着第3个版本的发布将要达到一个重要的里程碑。jQuery3修复了很多bug,增加了一些新的功能,弃用并删除了一些功能,并更改了一些功能的行为。在这篇文章中,我将要突出介绍jQuery3最重要的变化。

新特性

以下各节中我将讨论在jQuery3中加入的重要特性。

for...of循环

jQuery3可能将使用for…of循环来遍历jQuery集合中的DOM元素。这种新的迭代器是ECMAScript2015(又名ECMAScript 6)规范的一部分。这个新迭代器可以使你遍历迭代对象(包括Array,Map,Set,等等)。

当使用这个新的迭代器时,你在循环中接受到的值不是jQuery对象而是一个DOM元素。这个迭代器将会略微的提高你操作jQuery集合的方式。

为了理解这个迭代器是怎样工作的,假设你想为页面上每一个input元素分配一个ID。jQuery3之前你会这么写:

var $inputs = $('input');

for(var i = 0; i < $inputs.length; i++ ){
 $inputs[i].id = 'input-' + i; 
}

在jQuery3中你可以这么写:

var $inputs = $('input');
var i = 0;

for(input of $inputs){
 input.id = 'input-' + i++; 
}

$.get()$.post()增加了新的方法签名

为了$.get()$.post()的实用功能和$.ajax()一样,jQuery3为其增加了新的方法签名。添加的新的方法签名是:

$.get([settings])

$.post([settings])

settings是一个具有很多属性的对象。你可以提供给$.ajax()使用,它们是相同的对象。想要了解更多关于$.ajax()的,请参考$.ajax()网页中的说明。

唯一的不同是,当settings对象传递给$.get()$.post()而不是$.ajax()时,method属性总是被忽略的。其原因是$.get()$.post()有一个预设的HTTP方法来执行Ajax请求($.get()是GET,$.post()是POST)。基本上,你不能通过$.get()发送一个POST请求的。

思考下面的代码

$.get({
 url: 'https://www.audero.it',
 method: 'POST' // 这个属性会被忽略
})

尽管设置了method属性,这段代码是不会发送一个POST请求,而是一个GET请求。

动画使用requestAnimationFrame()

所有的现在浏览器,包括IE10及以上,都支持requestAnimationFrame。jQuery3将会在内部使用这个API执行动画,使动画更加流畅并且减少对CPU资源的消耗。

unwrap()

jQuery3给unwrap()添加了一个可选参数,这个新的方法签名是:

unwrap([selector])

感谢这个变化,您将能够通过选择器表达式的字符串在已经选择的父元素中去匹配。如果存在匹配项,则匹配的子元素的父元素被移除;否则不执行操作。

改变的特性

jQuery3也修改了一些特性的行为。

:visible:hidden

新版本的jQuery修改了:visible:hidden过滤器的释义。如果元素有任何的布局容器,即使宽度和(或)高度都为0,也将会视为:visible。举例说明,br元素和没有内容的行级元素(内联元素)现在都会被:visible过滤器选中。

因此,如果在一个页面中有以下标记语言:

<div></div>
<br/>

然后你运行以下语句:

console.log($('body :visible').length);

在jQuery1.x和jQuery2.x中你得到的结果为0,但是在jQuery3中你得到的结果是2。

data()

另一个重要的变化是有关data()方法的行为。他已经变得和Dataset API规范一样了。jQuery 3将所有属性的键都转换成驼峰式命名方式。要想理解这个变化,请思考下面的元素:

<div id="container"></div>

如果你使用的jQuery3之前的版本你会这么写:

var $elem = $('#container');
$elem.data({
 'my-property':'hello'
});
console.log($elem.data());

在控制台你将会得到如下的结果:

{my-property:"hello"}

而使用jQuery3你将得到如下的结果:

{myPropery:"hello"}

请注意,在jQuery3中属性名已经变成了驼峰式没有横杠(-),而在以前的版本中,属性名会保持全小写和保留横杠(-)。

Deferred对象

jQuery3改变了Deferred对象的行为,Deferred对象是Promise对象的前身,这次改变提高了Deferred对象对Promise/A+提案的兼容性。Deferred这个对象及其它的历史都是很有趣的。想要了解更多,你可以去阅读官方文档或者阅读我写的书jQuery实战(第三版),这本书也包含了jQuery3。

在jQuery1.x和2.x中,传递给Deferred的回调函数内出现未捕获的异常会阻断程序的执行。不像原生Promise对象那样会抛出异常冒泡至window.onerror(通常冒泡到这里)。如果你没有定义一个函数处理错误事件(通常我们是会处理的),那么异常信息就会显示并且程序会终止执行。

jQuery3遵循原生Promise对象的模式。因此,抛出的异常被当作失败,接着失败回调函数执行。一旦失败回调函数执行完成,进程就会继续,下面的的成功回调函数将被执行。

为了帮助你理解两者不同,让我们看一个小例子。思考下面的代码:

var deferred = $.Deferred();

deferred
 .then(function(){
 throw new Error('An error'); 
 })
 .then(
 function(){
 console.log('Success 1'); 
 },
 function(){
 console.log('Failure 1');
 }
 )
 .then(
 function(){
 console.log('Success 2');
 },
 function(){
 console.log('Failure 2');
 }
 );

deferred.resolve();

在jQuery1和jQuery2中,只有第一个函数(抛出错误的函数)被执行。另外,因为我没有为window.onerror定义任何处理函数,所以控制台将会输出“Uncaught Error: An error”并且程序执行将会终止。

在jQuery3中,行为是完全不同的。你将在控制台上看到“Failure 1”和“Success 2”两条信息。异常被第一个失败回调函数处理,并且一旦被处理,随后的成功回调函数也会被执行。

SVG文档

没有任何版本的jQuery,包括jQuery3,官方正式支持SVG文档。然而,事实是很多方法是可以工作的,还有另外一些,比如类名操作在以前是不可正常使用的,但是它们在jQuery3中更新后也可以正常使用了。因此,在即将到来的jQuery版本中,你可以放心地在SVG文档上使用addClass()hasClass()方法。

已废弃或者已移除的方法和属性

除目前所描述的改进外,jQuery还移除和废弃了一些特性。

废弃bind()unbind()delegate()undelegate()

很久以前(jQuery1.7版本时)jQuery就引入了on()方法,它提供了统一的接口替换bind()delegate()live()方法。与此同时jQuery也提供了off()方法,同样提供了统一的接口替换unbind()undelegated()die()方法。从on()off()方法引入时就不推荐使用bind()delegate()unbind()undelegate()方法,但它们还是一直存在着。

jQuery3废弃了这些方法并且打算在未来的版本(可能是jQuery4)会移除它们。在你所有的项目中坚持使用on()off()方法,这样你就不必担心未来的版本更新。

移除load()unload()error()方法

jQuery3抛弃了已经废弃的load()unload()error()方法。这些方法很久以前(在jQuery1.8时)就被废弃了,但是他们仍旧留在jQuery中。如果你使用的插件依赖其中的一个或多个方法,升级到jQuery3后你的代码将会崩溃。因此,在升级时注意。

移除contextsupportselector属性

jQuery3抛弃了已经废弃的contextsupportselector属性。正如我在上一节讲到的,如果你仍旧在项目中使用这些属性或者使用的插件依赖这些属性,升级到jQuery3后你的代码将会崩溃。

Bug修复

jQuery3修复了在以前版本中存在的重大bug。在下面章节中,我将介绍两点,这两点在你的工作中会有很大的不同。

width()height()的值不再四舍五入

jQuery3修复了width()height()及所有其它相关方法的bug。这些方法将不再将结果像素值四舍五入到整数值,因为四舍五入后在某些情况下很难对元素进行定位。

为了理解这个问题,假设你有一个宽度为100px的容器元素,它里面包含三个宽度为三分之一(33.333333%)的元素:

<div class="container">
 <div>My name</div>
 <div>is</div>
 <div>Aurelio De Rosa</div>
</div

在jQuery3之前,如果你尝试用以下代码来获取子元素的宽度……

$('.container div').width();

……你得到的结果是33。原因是jQuery将33.33333四舍五入了。在jQuery3中,这个bug被修复了,因此你得到结果是更加精确的(即浮点数的结果)。

wrapAll()

新版本jQuery修复了一个当传递函数给wrapAll()时发生的bug。在jQuery之前,当传递一个函数给wrapAll()时,jQuery集合中每一个元素都被包裹。换句话说,这种行为和传递一个函数给wrap()是一样的。

除了修复这个问题,还有一个变化:由于这个函数在jQuery3中只会被调用一次,因此jQuery集合每个元素的索引不能传入这个方法中。最终这个方法的上下文(this)将指向jQuery集合中的第一个元素。

下载jQuery3 beta1

如果你对这篇文章感兴趣,你可能想要尝试jQuery3第一个beta版。您可以通过访问下面两个url来获得。

它在npm上也是可用的,你可以通过运行下面的命令来下载:

npm install jquery@3.0.0-beta1

总结

很多人认为jQuery将会死掉,认为在现代网页开发中已经没有一席之地。然而其仍在持续发展,jQuery使用统计(在排名前100万的网站中使用率为78.5%)反驳了这些说法。

在这篇文章中,我已经带着你介绍了jQuery3将会带来的重要特性变化。或许你可能已经注意到了,这个版本是不太会对你现有的项目造成崩溃,因为它没有引入一些重大的变化。尽管如此,在升级期间还是有一些事项需要注意得,如Deferred对象的改进。在更新第三方插件时也要注意,审查项目将帮助你发现异常行为或者崩溃的功能。

  • 本文章翻译自What’s New in jQuery 3
  • 本人英文水平有限,翻译不正确不通顺的地方,敬请指出。