jQuery會過時嗎?
先答題:如果說過時指被需要得少了,那肯定是在過時。但如果同意規範的一部分來自它的思想,那就「孰謂公死,凜凜猶生」。
《致敬jQuery》
Java語言讓我敬重的框架,闕惟Spring;
JavaScript語言讓我敬重的類庫,只有jQuery。
Spring的善利萬物,jQuery的為道日損,都閃耀著道家清心自退的智慧光芒。
取天下常以無事,於是天下莫能與之爭。
有人疑惑:jQuery做的事這麼少,為什麼會這麼火?
我說:jQuery的火,既因為它做了一點事,更因為它沒做許多事。
做事是本能,不做需要大智慧,把握好做和不做的分寸,是為進退有據。
它做的,都是最核心最要命的點,DOM操作和Ajax,瀏覽器兼容。
在絕大多數情況下這就夠了,多了是累贅,占流量,拖速度,還累腦子。
很多好框架都過分好心了,把能想到的功能都封一遍,但大部分程序員使用它們的時候只用最核心的那個點,引入的其餘部分是白占空間。
jQuery就不,它只編寫20%的代碼,解決你80%的問題。至於剩下那20%各個業務場景下都不同的功能,它既無力管,也不想管,相信你能解決。
jQuery省事程序員也輕鬆,於是大家都高興,jQuery保住了專註,程序員保住了自由。
這就是技術上所謂的低侵入,這就是道家所謂的無為。
功成事遂,百姓皆謂我自然。
所以jQuery在漸漸退出歷史舞台,因為它已然成了規範的一部分。
你不再需要引入jQuery了,因為它已經在瀏覽器中。
什麼叫功成身退,天之道也?什麼叫夫唯弗居,是以不去?
轉頭望望,那邊廂,Spring也正在被規範吸容。
藤原佐為已經活在了進藤光的棋里。
小小羅以手指腕,動作里全是弗格森的神氣。
《企業應用架構模式》不再有人閱讀,因為其思想早已成為程序員的本能。
我思考做事,一舉一動全幻化著你的身影。
你來過嗎?走過嗎?我只知道,我好像進步了。
已經過時了。
略做點補充:
Zepto也是過時貨了。還有Underscore/Lodash等,也是過時了。但是過時不代表你就一定不可以再用,或者要從現有項目中清除拋棄掉。項目維護和管理本身是另一回事情,並不是完全由技術因素決定的。
下面稍微講下為什麼已經過時。說這個你得知道jQuery提供的核心價值是什麼。
我總結有幾點:
1. 發揚光大了$和CSS選擇器的天才idea(儘管都不是發明者)
2. 處理瀏覽器的兼容性問題和各種bug3. 鏈式調用為核心的DSL(此為jQuery獨創)4. 基於jQuery的生態(大量插件,各種工具如IDE也對其有良好支持)看一下前兩點,
1. 新的DOM標準(借鑒jQuery)加入了許多新的方法,覆蓋了絕大部分use cases;
2. 目前主流瀏覽器的兼容性已經大幅提高,且因為都是Evergreen browsers了,所以以後也不太會出現嚴重的兼容性問題了;此外新標準比以往要更詳盡清晰,出現不一致和bug的機率也小了;實際上這前兩點也不是一蹴而就的,而是一直在改進。比如原生querySelector API普及之後,才出現了Zepto。只不過這兩年發展加速,以至於Zepto還沒取代jQuery,就要一起過時了。
當然,現在仍然有兼容性問題,比如老瀏覽器不支持那些新的DOM方法,還有bug問題始終會有的。怎麼辦?我四年前寫的《關於國內前端和JS技術發展的亂想》就給出了答案:
另外一個我認為非常廣闊的領域是dom。是的,始終是。
儘管我之前說過了,大框架沒有機會。但是注意到一點,jQuery等仍然是建立在前ES5前HTML5時代的。因此那些庫其實都幹了大量重複的事情。真正有益的是把這些事情做一次,做好它,怎麼做好?不是發明各種自己的api,而是大家努力按照html5的規範,去盡量實現一套一致的符合html5語義的底層dom api。……
以html5規範和語義為準。時刻記得避免夾帶私貨。此庫的最高境界是只作為給瀏覽器打patch用,也就是一個patch框架加patch實現。
2011年時polyfill這個詞還沒怎麼流行,但是你們可以看到我講的就是polyfill。不同的是,當時可能還比較前衛的理念,4年後的今天,幾乎所有新API都有polyfill/shim實現,所以不再僅僅是理念,而已經有大量非常成熟的實踐了。
但直到去年,我一直沒說可以拋棄jQuery,那就是因為第三點(基於鏈式調用的DSL)。即使新的query介面已經直接返回Element數組,因此可鏈式調用forEach/map之類的方法,但總體上,標準DOM API體系仍然無法像jQuery一樣提供一致且(插件)可擴展的鏈式調用DSL。
然而ES6+的發展終於解決了這個問題,那就是bind operator的出現。且拜JS這一世界上最好的編程語言的強大生態所賜,這個還是草案的語言特性已經可以在生產環境里使用了!
BTW,這一語言特性也同樣宣告了 Underscore/Lodash 的終結。
至於第四點,原本其實就有利有弊,比方插件體系就一直被詬病。現在直接換成了ES6 module,且jQuery的生態不再獨自孤立,而是可以融入更大的JS和Web的生態,只會更好。
綜上,從今年(2015)年年初開始,我終於可以斷言 jQuery/Zepto/Underscore/Lodash 的時代已經結束了。
最後,關於Angular/React等框架或WebComponents取代jQuery,這是在另外完全不同的層面上的,我這裡不贅述。
PS. @winter說他在團隊去jQuery化的一個重要考慮是要消除手拼html字元串(標準dom方法除了innerHTML這一歷史遺迹,是完全沒有直接插html的api介面的),從根本上解決XSS隱患。這確實也是jQuery的一個缺點,茲列於此。作為DOM Wrapper的這部分feature,最終會過時的,很多可能已經在jquery的內部實現里被主動淘汰了,比如原先jquery要自己寫很多代碼實現的功能,現在只需要直接調用某個DOM API就可以了。這意味著jquery的實現效率更高,並不意味著jquery就過時。光是jquery插件社區的大量高質量組件,就已經是大量產品前端開發人員不願意擯棄的,要實現一個複雜的UI component,用原生JS還是太low level了。應該說,jquery本身在整個前端stack里的重要性和奠基石般的必要性都會逐漸降低,但jquery作為一個生態系統對高效開發的支持一定還會長期存在下去。
因為瀏覽器對標準的支持程度提高了,無論是原生 XMLHttpRequest, querySelector/querySelectorAll, CSS 動畫,還是 ECMAScript 5 的 Array 方法等均受到廣泛支持, jQuery 作為彌補不同瀏覽器差異,簡化選擇器語法的 shim 的作用已經過時了; ECMAScript 6 的原生 Promise 也正在得到越來越廣泛的支持,而且其他的 Promise shims 有著接近原生庫的 API set, 所以 jQuery 作為 Promise shim 的功能也過時了; 正如 @wangxf 所說,只要仍然存在瀏覽器兼容性問題, jQuery 就仍然存在用武之地,但是瀏覽器之間的兼容性問題已經逐步的減少了。但是它作為 DOM 操作,事件處理等的語法糖的功能個人覺得目前還沒過時,仍然適合設計者或者開發者在原型階段快速開發的功能,或者需要為傳統網頁快速添加 DOM 操作,事件處理和 Ajax 等功能的情況。
生態系統比幾個API持久多了。比方說,如果我的應用需要一個高質量(usability,compatibility,accessibility)的draggable,slider,dialog,或者date picker,那麼很可能jQuery生態仍然是我的首選,框架(angular,react,vue)不是jquery的替代,雖然框架極力避免DOM操作,但是用戶體驗的實現怎能離開DOM。所以框架需要和jquery的生態互補,拋棄jQuery自己去寫複雜UI是不現實的。
就目前來看,jQuery的selector比起document.querySelector和querySelectorAll還是強大不少的,倒不是說純JS做不了jQuery做得這些事,只不過大量程序員得重複實現這種抽象,現在還沒有「像」jQuery的但是純JS的這些API實現。
jQuery的架構和設計已經十年以上了,我個人用它為核心做中小型應用的架構和開發,七八年,二三十個項目了,並沒有發現它有什麼明顯短板,相反,配合的庫做好選型,我反而覺得用jQuery最省心,所以除非未來有絕對超越jQuery的東西(比如瀏覽器實現了jQuery所有常用東西),並且一樣好用或者更好用,我才會考慮放棄jQuery。
但想想,實際開發東西,現在真的沒有比直接用jQuery更暢快的東西啊。說「已經過時」的朋友何出此言啊。個人覺得還是看具體場景的。如果只是做一個小的展示網站,那用用jQuery又有何妨,簡單嘛,沒有必要加上一堆的polyfill來替換jQuery的一些核心價值(見賀老的回帖),因為小的展示網站真的不care這些所謂的性能。。。
幹掉jq的不是框架,而是瀏覽器
以下內容可能會引起看官的不適,非喜輕噴。
我來換個角度,嘗試發掘一下問題背後的問題,也嘗試從新角度回答類似「XX是否過時"的問題。
事情的經過不一定是這樣的:出於眾所周知或者眾所不知的原因,題主想要學習web前端開發,在簡單的學習之後,打算找一個框架/庫來學一下,度娘告訴題主很多相關內容,於是題主沒了主意,因為jQuery名氣太大了,到處都在用它,因為jQuery太老了,還值不值得學習,於是才有了這個提問。
提個新問題:題主為什麼會問出這樣的問題?
直白的說,題主缺乏對前端各種框架、庫的了解,無法進行整體對比與分析。往深了看,題主缺乏對事物發展的一般規律的了解,也就是世界觀尚未成型。縱觀世上之物,狀態無非兩種:
1. 存在過2. 存在著縱觀世上之物,結局無非兩種:1. 死得早2. 死得晚即然消失已是必然,是否曾經存在過就沒有意義了呢?答案誰都清楚。於人類而言,肉體太容易消失,而精神可以較長時期的存在。
於前端而言,jQuery遲早消失,可是jQuery的一些思想,不是在其它地方活得好好的么!儘管jQuery已經存在10餘年了,可是jQuery一直在維護,還在開發新版本3.0,誰敢保證jQuery新版本不會帶來一場新的革命呢!所以,這根本不是一個可以用會或者不會來回答的問題,要學會用發展的眼光去看待事物。
流行的未必能成為經典
經典是長久的流行作為一個庫,jQuery能在計算機軟體領域存在十餘年,絕非偶然。它的選擇符、易用的API、跨瀏覽器兼容、DOM元素批處理、插件提供的代碼復用等等,個個特性都有強大的理論支持。
對於眼裡只有API的人來說,jQuery可能已經過時了,儘管如此,當下,它仍然好用。
對於題主來說,個人以為,jQuery代表的前端水平,已經遠遠超過你了。不管題主是出於要學習的目的,還是要使用的目的,jQuery都可以選擇,但可能不是最佳選擇。jQuery在開發方式上已經是過時了。
現在前端經過這幾年的探索,有了更多新的模塊化開發方式。
很多視圖邏輯都不再依賴jQuery。
HTML5 和 CSS3的興起,一定程度上降低了jQuery的作用
但是不能否認它的確是一個很好的JavaScript 庫 , 如果你用過什麼 YUI,Dojo 之類的,你就明白了。。。我平時寫的react+webpack+es6的代碼里就沒有出現過$符號。
我才開始學,你們就說他過時了。。。
過時。但 過時 !== 沒用。
已經過時了,github上面有個項目你可以看一下,這裡直接貼過來了
You-Dont-Need-jQuery/README.zh-CN.md## You Don"t Need jQuery
前端發展很快,現代瀏覽器原生 API 已經足夠好用。我們並不需要為了操作 DOM、Event 等再學習一下 jQuery 的 API。同時由於 React、Angular、Vue 等框架的流行,直接操作 DOM 不再是好的模式,jQuery 使用場景大大減少。本項目總結了大部分 jQuery API 替代的方法,暫時只支持 IE10+ 以上瀏覽器。
## 目錄
1. [Query Selector](#query-selector)
1. [CSS Style](#css-style)
1. [DOM Manipulation](#dom-manipulation)
1. [Ajax](#ajax)
1. [Events](#events)
1. [Utilities](#utilities)
1. [Browser Support](#browser-support)
## Query Selector
常用的 class、id、屬性 選擇器都可以使用 `document.querySelector` 或 `document.querySelectorAll` 替代。區別是
* `document.querySelector` 返回第一個匹配的 Element
* `document.querySelectorAll` 返回所有匹配的 Element 組成的 NodeList。它可以通過 `[].slice.call()` 把它轉成 Array
* 如果匹配不到任何 Element,jQuery 返回空數組 []`,但 `document.querySelector` 返回 `null`,注意空指針異常
&> 注意:`document.querySelector` 和 `document.querySelectorAll` 性能很**差**。如果想提高性能,盡量使用 `document.getElementById`、`document.getElementsByClassName` 或 `document.getElementsByTagName`。
- [1.1](#1.1) && Query by class
```js
// jQuery
$(".css");
// Native
document.querySelectorAll(".css");
```
- [1.2](#1.2) && Query by id
```js
// jQuery
$("#id");
// Native
el.querySelector("#id");
```
- [1.3](#1.3) && Query by attribute
```js
// jQuery
$("a[target=_blank]");
// Native
document.querySelectorAll("a[target=_blank]");
```
- [1.4](#1.4) && Find sth.
+ Find nodes
```js
// jQuery
$el.find("li");
// Native
el.querySelectorAll("li");
```
+ Find body
```js
// jQuery
$("body");
// Native
document.body;
```
+ Find Attribute
```js
// jQuery
$el.attr("foo");
// Native
e.getAttribute("foo");
```
+ Find data attribute
```js
// jQuery
$el.data("foo");
// Native
// using getAttribute
el.getAttribute("data-foo");
// you can also use `dataset` if only need to support IE 11+
el.dataset["foo"];
```
- [1.5](#1.5) && Sibling/Previous/Next Elements
+ Sibling elements
```js
// jQuery
$el.siblings();
// Native
[].filter.call(el.parentNode.children, function(child) {
return child !== el;
});
```
+ Previous elements
```js
// jQuery
$el.prev();
// Native
el.previousElementSibling;
```
+ Next elements
```js
// next
$el.next();
el.nextElementSibling;
```
- [1.6](#1.6) && Closest
Closest 獲得匹配選擇器的第一個祖先元素,從當前元素開始沿 DOM 樹向上。
```js
// jQuery
$el.closest(queryString);
// Native
function closest(el, selector) {
const matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector;
while (el) {
if (matchesSelector.call(el, selector)) {
return el;
} else {
el = el.parentElement;
}
}
return null;
}
```
- [1.7](#1.7) && Parents Until
獲取當前每一個匹配元素集的祖先,不包括匹配元素的本身
```js
// jQuery
$el.parentsUntil(selector, filter);
// Native
function parentsUntil(el, selector, filter) {
const result = [];
const matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector;
// match start from parent
el = el.parentElement;
while (el !matchesSelector.call(el, selector)) {
if (!filter) {
result.push(el);
} else {
if (matchesSelector.call(el, filter)) {
result.push(el);
}
}
el = el.parentElement;
}
return resu<
}
```
- [1.8](#1.8) && Form
+ Input/Textarea
```js
// jQuery
$("#my-input").val();
// Native
document.querySelector("#my-input").value;
```
+ Get index of e.currentTarget between `.radio`
```js
// jQuery
$(e.currentTarget).index(".radio");
// Native
[].indexOf.call(document.querySelectAll(".radio"), e.currentTarget);
```
- [1.9](#1.9) && Iframe Contents
jQuery 對象的 iframe `contents()` 返回的是 iframe 內的 `document`
+ Iframe contents
```js
// jQuery
$iframe.contents();
// Native
iframe.contentDocument;
```
+ Iframe Query
```js
// jQuery
$iframe.contents().find(".css");
// Native
iframe.contentDocument.querySelectorAll(".css");
```
**[? 回到頂部](#目錄)**
## CSS Style
- [2.1](#2.1) && CSS
+ Get style
```js
// jQuery
$el.css("color");
// Native
// 注意:此處為了解決當 style 值為 auto 時,返回 auto 的問題
const win = el.ownerDocument.defaultView;
// null 的意思是不返回偽類元素
win.getComputedStyle(el, null).color;
```
+ Set style
```js
// jQuery
$el.css({ color: "#ff0011" });
// Native
el.style.color = "#ff0011";
```
+ Get/Set Styles
注意,如果想一次設置多個 style,可以參考 oui-dom-utils 中 [setStyles](https://github.com/oneuijs/oui-dom-utils/blob/master/src/index.js#L194) 方法
+ Add class
```js
// jQuery
$el.addClass(className);
// Native
el.classList.add(className);
```
+ Remove class
```js
// jQuery
$el.removeClass(className);
// Native
el.classList.remove(className);
```
+ has class
```js
// jQuery
$el.hasClass(className);
// Native
el.classList.contains(className);
```
+ Toggle class
```js
// jQuery
$el.toggleClass(className);
// Native
el.classList.toggle(className);
```
- [2.2](#2.2) && Width Height
Width 與 Height 獲取方法相同,下面以 Height 為例:
+ Window height
```js
// jQuery
$(window).height();
// Native
// 不含 scrollbar,與 jQuery 行為一致
window.document.documentElement.clientHeight;
// 含 scrollbar
window.innerHeight;
```
+ Document height
```js
// jQuery
$(document).height();
// Native
document.documentElement.scrollHeight;
```
+ Element height
```js
// jQuery
$el.height();
// Native
// 與 jQuery 一致(一直為 content 區域的高度)
function getHeight(el) {
const styles = this.getComputedStyles(el);
const height = el.offsetHeight;
const borderTopWidth = parseFloat(styles.borderTopWidth);
const borderBottomWidth = parseFloat(styles.borderBottomWidth);
const paddingTop = parseFloat(styles.paddingTop);
const paddingBottom = parseFloat(styles.paddingBottom);
return height - borderBottomWidth - borderTopWidth - paddingTop - paddingBottom;
}
// 精確到整數(border-box 時為 height 值,content-box 時為 height + padding + border 值)
el.clientHeight;
// 精確到小數(border-box 時為 height 值,content-box 時為 height + padding + border 值)
el.getBoundingClientRect().height;
```
+ Iframe height
$iframe .contents() 方法返回 iframe 的 contentDocument
```js
// jQuery
$("iframe").contents().height();
// Native
iframe.contentDocument.documentElement.scrollHeight;
```
- [2.3](#2.3) && Position Offset
+ Position
```js
// jQuery
$el.position();
// Native
{ left: el.offsetLeft, top: el.offsetTop }
```
+ Offset
```js
// jQuery
$el.offset();
// Native
function getOffset (el) {
const box = el.getBoundingClientRect();
return {
top: box.top + window.pageYOffset - document.documentElement.clientTop,
left: box.left + window.pageXOffset - document.documentElement.clientLeft
}
}
```
- [2.4](#2.4) && Scroll Top
```js
// jQuery
$(window).scrollTop();
// Native
(document.documentElement document.documentElement.scrollTop) || document.body.scrollTop;
```
**[? 回到頂部](#目錄)**
## DOM Manipulation
- [3.1](#3.1) && Remove
```js
// jQuery
$el.remove();
// Native
el.parentNode.removeChild(el);
```
- [3.2](#3.2) && Text
+ Get text
```js
// jQuery
$el.text();
// Native
el.textContent;
```
+ Set text
```js
// jQuery
$el.text(string);
// Native
el.textContent = string;
```
- [3.3](#3.3) && HTML
+ Get HTML
```js
// jQuery
$el.html();
// Native
el.innerHTML;
```
+ Set HTML
```js
// jQuery
$el.html(htmlString);
// Native
el.innerHTML = htmlString;
```
- [3.4](#3.4) && Append
Append 插入到子節點的末尾
```js
// jQuery
$el.append("&hello&
// Native
let newEl = document.createElement("div");
newEl.setAttribute("id", "container");
newEl.innerHTML = "hello";
el.appendChild(newEl);
```
- [3.5](#3.5) && Prepend
```js
// jQuery
$el.prepend("&hello&
// Native
let newEl = document.createElement("div");
newEl.setAttribute("id", "container");
newEl.innerHTML = "hello";
el.insertBefore(newEl, el.firstChild);
```
- [3.6](#3.6) && insertBefore
在選中元素前插入新節點
```js
// jQuery
$newEl.insertBefore(queryString);
// Native
newEl.insertBefore(document.querySelector(queryString));
```
- [3.7](#3.7) && insertAfter
在選中元素後插入新節點
```js
// jQuery
$newEl.insertAfter(queryString);
// Native
function insertAfter(newEl, queryString) {
const parent = document.querySelector(queryString).parentNode;
if (parent.lastChild === newEl) {
parent.appendChild(newEl);
} else {
parent.insertBefore(newEl, parent.nextSibling);
}
},
```
**[? 回到頂部](#目錄)**
## Ajax
用 [fetch](https://github.com/camsong/fetch-ie8) 和 [fetch-jsonp](https://github.com/camsong/fetch-jsonp) 替代
**[? 回到頂部](#目錄)**
## Events
完整地替代命名空間和事件代理,鏈接到 https://github.com/oneuijs/oui-dom-events
- [5.1](#5.1) && Bind an event with on
```js
// jQuery
$el.on(eventName, eventHandler);
// Native
el.addEventListener(eventName, eventHandler);
```
- [5.2](#5.2) && Unbind an event with off
```js
// jQuery
$el.off(eventName, eventHandler);
// Native
el.removeEventListener(eventName, eventHandler);
```
- [5.3](#5.3) && Trigger
```js
// jQuery
$(el).trigger("custom-event", {key1: "data"});
// Native
if (window.CustomEvent) {
const event = new CustomEvent("custom-event", {detail: {key1: "data"}});
} else {
const event = document.createEvent("CustomEvent");
event.initCustomEvent("custom-event", true, true, {key1: "data"});
}
el.dispatchEvent(event);
```
**[? 回到頂部](#目錄)**
## Utilities
- [6.1](#6.1) && isArray
```js
// jQuery
$.isArray(range);
// Native
Array.isArray(range);
```
- [6.2](#6.2) && Trim
```js
// jQuery
$.trim(string);
// Native
String.trim(string);
```
- [6.3](#6.3) && Object Assign
繼承,使用 object.assign polyfill https://github.com/ljharb/object.assign
```js
// jQuery
$.extend({}, defaultOpts, opts);
// Native
Object.assign({}, defaultOpts, opts);
```
- [6.4](#6.4) && Contains
```js
// jQuery
$.contains(el, child);
// Native
el !== child el.contains(child);
```
**[? 回到頂部](#目錄)**
## Browser Support
![Chrome](https://raw.github.com/alrra/browser-logos/master/chrome/chrome_48x48.png) | ![Firefox](https://raw.github.com/alrra/browser-logos/master/firefox/firefox_48x48.png) | ![IE](https://raw.github.com/alrra/browser-logos/master/internet-explorer/internet-explorer_48x48.png) | ![Opera](https://raw.github.com/alrra/browser-logos/master/opera/opera_48x48.png) | ![Safari](https://raw.github.com/alrra/browser-logos/master/safari/safari_48x48.png)
--- | --- | --- | --- | --- |
Latest ? | Latest ? | 10+ ? | Latest ? | 6.1+ ? |
# License
MIT
過時,但是仍然流行,哈哈哈哈哈哈,甩react,angular幾十個流行點吧。
jquery是牛頓的發現的經典物理學定理嗎?不是。它只是工具。依賴瀏覽器的工具。連牛頓發現的三大定理因為科學進步而有適應場景的要求。更何況於之相比愈發渺小的jquery。因為瀏覽器的進步。因為業務問題的變化。最後它會被淘汰。可後面的工具肯定會繼承它優秀的思想。它還活著。換一種方式。
問:jQuery會過時嗎答:會問:啥時候過時?答:不好說
的確過時了,但目前使用的項目還是不少的,所有想完全淘汰還是沒那麼快的,加上es6一出,七七八八的框架也一併火起來,眾人的目光已經全投入到了原聲當中了。
You Might Not Need jQuery
jQuery用的最多的是什麼?
當然是DOM操作和ajax。但隨著開發理念的更變(數據驅動視圖)就極少會用到DOM操作了。
這樣導致jQ失去了一大半的需求,且新興框架也多半有伴生的請求插件(如vue中的vue-resource、axios),這就導致了前端coder們對jQuery的需求降到了最低。所以從開發上來說jQuery過時了。
我最近在研讀jQuery源碼,其中對各種方法的封裝考慮之周全,設計之巧妙令人拍案叫絕,使我帶得到了全面的提升,用來進階再好不過。這麼好的東西怎麼說它過時了呢。
(function( global, factory ) {
if ( typeof module === "object" typeof module.exports === "object" ) {
// For CommonJS and CommonJS-like environments where a proper window is present,
// execute the factory and get jQuery
// For environments that do not inherently posses a window with a document
// (such as Node.js), expose a jQuery-making factory as module.exports
// This accentuates the need for the creation of a real window
// e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
// Pass this if window is not defined yet
}
這是jq1.11.3版本,現在到哪一版本了?不太清楚,我只知道jq在大部分公司做前端交互效果很好,生態裡面涵蓋了大量的很豐富的jq插件。再來看看代碼。時代在進步,jq也並沒有落後。jq在這個版本已經開始往未來推測客戶端的模塊化新的東西的提出。我只表明我的觀點,jq肯定沒有過時。
推薦閱讀:
※一些人瞧不起 jQuery 的理由是什麼?
※如何看待 jQuery?
※為什麼現在很多富web應用只支持chrome即使最新版edge都不支持?
※DOM與BOM分別是什麼,有何關聯?
TAG:JavaScript | jQuery |