长期以来,使用 jQuery 的一个主要原因是它使 Ajax 操作变得非常容易。 它拥有一个超级简洁、灵活且跨浏览器兼容的 API,适用于所有 Ajax 方法。 jQuery 仍然非常流行,但现在越来越多的人开始放弃它,特别是在旧版浏览器的市场份额下降,而新版浏览器拥有许多我们过去在 jQuery 中学习的强大功能的情况下。 即使是 querySelectorAll
也经常被认为是放弃 jQuery 依赖的理由。
Ajax 现在怎么样了?
假设我们需要进行一个 GET 请求,从一个 URL 终结点获取一些 HTML。 我们不会进行任何错误处理,以保持简洁。
jQuery 的做法是这样的
$.ajax({
type: "GET",
url: "/url/endpoint/",
}).done(function(data) {
// We got the `data`!
});
如果我们想放弃 jQuery,使用浏览器原生的 Ajax,我们可以这样操作
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = ajaxDone;
httpRequest.open('GET', '/url/endpoint/');
httpRequest.send();
function ajaxDone() {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
// We got the `httpRequest.responseText`!
}
}
}
浏览器的支持情况有点复杂。 基本功能可以追溯到 IE 7,但真正稳定是在 IE 10 开始。 如果你想更健壮,但仍然跳过任何依赖项,你甚至可以使用 window.ActiveXObject
作为回退,甚至可以降到 IE 6。
总之,在没有任何依赖的情况下进行 Ajax 并获得相当广泛的浏览器支持是完全可能的。 请记住,jQuery 本质上也是 JavaScript,因此你始终可以模仿它在后台的操作。
但是,jQuery 在它的 Ajax 中做了一件别的事情,它已经做了一段时间了:它的 Promise
是基于的。 Promise 的许多酷炫之处之一,特别是在与像 Ajax 这样的“异步”事件结合使用时,它允许你 并行运行多个请求,这对性能来说非常棒。
我刚刚发布的原生 Ajax 代码不是基于 Promise 的。
如果你想要一个强大的、便捷的基于 Promise 的 Ajax API,并且具有相当不错的跨浏览器支持(可追溯到 IE 8),你可以考虑使用 Axios。 没错,它与 jQuery 一样是一种依赖项,只是它专注于 Ajax,在 GZip 之前的体积只有 11.8 KB,并且本身没有任何依赖项。
使用 Axios,代码看起来像这样
axios({
method: 'GET',
url: '/url/endpoint/'
}).then(function(response) {
// We got the `response.data`!
});
注意 then 语句,这意味着我们回到了 Promise
的世界。 小贴士,显然这些请求在 服务器端 看起来并不完全相同。
不过,浏览器还没有放弃我们! 现在有一个相当新的 Fetch API,它使用基于 Promise 的 Ajax 以及简洁的语法。
fetch('/url/endpoint/')
.then(function(response) {
return response.text();
})
.then(function(text) {
// We got the `text`!
});
对它的浏览器支持也越来越好! 它已包含在所有稳定的桌面浏览器中,包括 Edge。 危险区域是没有 IE 支持,只有 iOS 10.1 及更高版本。
如果你只需要针对 IE10 及更高版本,你还可以使用 ProgressEvent 接口来监控上传/下载进度
更多信息请访问 MDN。
使用
fetch
时请注意 - 404 和其他非 200 OK 响应不会被视为错误通常在像这样的情况下,存在一个固定的现代标准,其 API 与库一样好,我更喜欢使用现代标准,并尽可能地进行 polyfill。 这样一来,一旦标准变得更加通用,你只需要删除 polyfill 而不是重构代码。 也就是说,fetch polyfill 似乎只支持回溯到 IE 10,因此我认为这取决于你的用例。
我很多年前就写了这段代码,从 ajax 开始流行以来我一直使用它,我从未使用过 jQuery
示例
GitHub 还提供 Fetch 的 polyfill: https://github.com/github/fetch
这样,支持 Fetch 的浏览器将使用它,而其他浏览器将使用 polyfill。
我来这里是为了链接相同的内容。 请注意,polyfill 方法可以让你在未来使用现代 API,并且比 Axios 还要轻量级。 加入一个 Promise polyfill,你就可以支持回溯到 IE10 和 Safari 6,虽然它并不普遍,但在很多情况下它确实涵盖了你的大部分需求。
这篇文章就为了这一行才值得一看。
对于所有这些情况,我都会从 ki.extend.js 中获取一个副本 - 它是一个非常棒的 JS 集合,扩展了几乎没有“框架”的 ki.js - 提取出 AJAX 的“抽象”,然后就完事了。
或者直接导入整个包。 无论你使用的是 AJAX 部分还是整个微型库,你都可以快速完成任务。
cu, w0lf.