成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端模塊化開發那點歷史

開發 前端
不談什么:傳統的模塊化開發方式,比如文件拆分、全局變量、命名空間,以及 YUI3 式的模塊化開發方式。談什么: 關于 CommonJS、AMD、Node.js、CMD 等相關的故事與未來趨勢,很有意思。

最近不斷有人問及,想起前些天跟 @dexteryy 等人的討論:dexteryy/OzJS#10 當時有過簡單總結,重新梳理如下。

寫在前面

1.不談什么:傳統的模塊化開發方式,比如文件拆分、全局變量、命名空間,以及 YUI3 式的模塊化開發方式。有興趣的可閱讀:前端模塊化開發的價值

2.談什么: 關于 CommonJS、AMD、Node.js、CMD 等相關的故事與未來趨勢,很有意思。

3.不一定精準:本文是基于史實的扯淡,因此部分文字特別是時間都是模糊記憶,不一定精準。關于流派、趨勢則是個人在社區的感受,不代表客觀看法。(看法都是主觀的,呵呵)

CommonJS 社區

大概 09 年 – 10 年期間,CommonJS 社區大牛云集。CommonJS 原來叫 ServerJS,推出 Modules/1.0 規范后,在 Node.js 等環境下取得了很不錯的實踐。

09年下半年這幫充滿干勁的小伙子們想把 ServerJS 的成功經驗進一步推廣到瀏覽器端,于是將社區改名叫 CommonJS,同時激烈爭論 Modules 的下一版規范。分歧和沖突由此誕生,逐步形成了三大流派:

1.Modules/1.x 流派。這個觀點覺得 1.x 規范已經夠用,只要移植到瀏覽器端就好。要做的是新增 Modules/Transport 規范,即在瀏覽器上運行前,先通過轉換工具將模塊轉換為符合 Transport 規范的代碼。主流代表是服務端的開發人員。現在值得關注的有兩個實現:越來越火的 component 和走在前沿的 es6 module transpiler

2.Modules/Async 流派。這個觀點覺得瀏覽器有自身的特征,不應該直接用 Modules/1.x 規范。這個觀點下的典型代表是 AMD 規范及其實現 RequireJS。這個稍后再細說。

3.Modules/2.0 流派。這個觀點覺得瀏覽器有自身的特征,不應該直接用 Modules/1.x 規范,但應該盡可能與 Modules/1.x 規范保持一致。這個觀點下的典型代表是 BravoJS 和 FlyScript 的作者。BravoJS 作者對 CommonJS 的社區的貢獻很大,這份 Modules/2.0-draft 規范花了很多心思。FlyScript 的作者提出了 Modules/Wrappings 規范,這規范是 CMD 規范的前身。可惜的是 BravoJS 太學院派,FlyScript 后來做了自我閹割,將整個網站(flyscript.org)下線了。這個故事有點悲壯,下文細說。

AMD 與 RequireJS

再來說 AMD 規范。真正的 AMD 規范在這里:Modules/AsynchronousDefinition。AMD 規范一直沒有被 CommonJS 社區認同,核心爭議點如下:

執行時機有異議

看代碼

Modules/1.0:

  1. var a = require("./a"// 執行到此處時,a.js 才同步下載并執行 

AMD:

  1. define(["require"], function(require) {  
  2.   // 在這里,模塊 a 已經下載并執行好  
  3.   // ...  
  4.   var a = require("./a"// 此處僅僅是取模塊 a 的 exports  
  5.    
  6. }) 

AMD 里提前下載 a.js 是瀏覽器的限制,沒辦法做到同步下載,這個社區都認可。

但執行,AMD 里是 Early Executing,Modules/1.0 里是第一次 require 時才執行。這個差異很多人不能接受,包括持 Modules/2.0 觀點的也不能接受。

這個差異,也導致實質上 Node 的模塊與 AMD 模塊是無法共享的,存在潛在沖突。

模塊書寫風格有爭議

AMD 風格下,通過參數傳入依賴模塊,破壞了 就近聲明 原則。比如:

  1. define(["a""b""c""d""e""f"], function(a, b, c, d, e, f) {  
  2.    
  3.     // 等于在最前面申明并初始化了要用到的所有模塊  
  4.    
  5.    if (false) {  
  6.        // 即便壓根兒沒用到某個模塊 b,但 b 還是提前執行了  
  7.        b.foo()  
  8.    }  
  9.    
  10. }) 

還有就是 AMD 下 require 的用法,以及增加了全局變量 define 等細節,當時在社區被很多人不認可。

最后,AMD 從 CommonJS 社區獨立了出去,單獨成為了 AMD 社區。有陣子,CommonJS 社區還要求 RequireJS 的文檔里,不能再打 CommonJS 的旗幟(這個 CommonJS 社區做得有點小氣)。

脫離了 CommonJS 社區的 AMD 規范,實質上演化成了 RequireJS 的附屬品。比如

1.AMD 規范里增加了對 Simplified CommonJS Wrapper 格式的支持。這個背后是因為 RequireJS 社區有很多人反饋想用 require 的方式,最后 RequireJS 作者妥協,才有了這個半殘的 CJS 格式支持。(注意這個是偽支持,背后依舊是 AMD 的運行邏輯,比如提前執行。)

2.AMD 規范的演進,離不開 RequireJS。這有點像 IE…… 可能是我的偏見。

AMD 的流行,很大程度上取決于 RequireJS 作者的推廣,這有點像 less 因 Bootstrap 而火起來一樣。但火起來的東西未必好,比如個人覺得 stylus 就比 less 更優雅好用。

關于 AMD 和 RequireJS,暫且按下不表。來看另一條暗流:Modules/2.0 流派。

Modules/2.0

BravoJS 的作者 Wes Garland 有很深厚的程序功底,在 CommonJS 社區也非常受人尊敬。但 BravoJS 本身非常學院派,是為了論證 Modules/2.0-draft 規范而寫的一個項目。學院派的 BravoJS 在實用派的 RequireJS 面前不堪一擊,現在基本上只留存了一些美好的回憶。

這時,Modules/2.0 陣營也有一個實戰派:FlyScript。FlyScript 拋去了 Modules/2.0 中的學究氣,提出了非常簡潔的Modules/Wrappings 規范:

  1. module.declare(function(require, exports, module)  
  2. {  
  3.    var a = require("a");   
  4.    exports.foo = a.name;   
  5. }); 

這個簡潔的規范考慮了瀏覽器的特殊性,同時也盡可能兼容了 Modules/1.0 規范。悲催的是,FlyScript 在推出正式版和官網之后,RequireJS 當時正直紅火。期間 FlyScript 作者 khs4473 和 RequireJS 作者 James Burke 有過一些爭論。再后來,FlyScript 作者做了自我閹割,將 GitHub 上的項目和官網都清空了,官網上當時留了一句話,模糊中記得是

我會回來的,帶著更好的東西。

這中間究竟發生了什么,不得而知。后來我有發郵件給 @khs4473 詢問,khs 給了兩點挺讓我尊重的理由,大意是

1.我并非前端出身,RequireJS 的作者 James Burke 比我更懂瀏覽器。

2.我們應該協同起來推動一個社區的發展,即便它不是你喜歡的。

這兩句話對我影響很大。也是那之后,開始仔細研究 RequireJS,并通過郵件等方式給 RequireJS 提出過不少建議。

再后來,在實際使用 RequireJS 的過程中,遇到了很多坑。那時 RequireJS 雖然很火,但真不夠完善。期間也在尋思著 FlyScript 離開時的那句話:“我會回來的,帶著更好的東西”

我沒 FlyScript 的作者那么偉大,在不斷給 RequireJS 提建議,但不斷不被采納后,開始萌生了自己寫一個 loader 的念頭。

這就是 SeaJS。

SeaJS 借鑒了 RequireJS 的不少東西,比如將 FlyScript 中的 module.declare 改名為 define 等。SeaJS 更多地來自 Modules/2.0 的觀點,但盡可能去掉了學院派的東西,加入了不少實戰派的理念。

最后

寫著寫著,有點滄桑感,不想寫了。

歷史不是過去,歷史正在上演。隨著 W3C 等規范、以及瀏覽器的飛速發展,前端的模塊化開發會逐步成為基礎設施。一切終究都會成為歷史,未來會更好。

原文鏈接:http://blog.jobbole.com/35528/

責任編輯:張偉 來源: github
相關推薦

2013-03-11 10:00:13

前端模塊化

2013-08-20 16:33:52

前端模塊化

2017-05-12 14:00:07

大數據前端模塊化開發

2010-08-02 09:21:48

Flex模塊化

2014-04-22 10:19:40

objection模塊化開發iOS

2023-02-15 22:13:19

客戶端Android

2023-11-08 13:55:27

2020-09-17 10:30:21

前端模塊化組件

2013-08-20 15:31:18

前端模塊化

2022-03-11 13:01:27

前端模塊

2020-09-18 09:02:32

前端模塊化

2022-09-05 09:01:13

前端模塊化

2015-10-10 10:01:28

前端模塊化webpack

2023-10-17 09:19:34

開發Java

2020-11-09 10:46:35

CommonJS

2023-05-24 10:35:11

Node.jsES模塊

2019-12-02 16:05:10

前端模塊化JavaScript

2010-08-02 09:10:36

Flex模塊化

2011-01-11 13:40:44

webcssdiv

2018-12-18 11:20:28

前端模塊化JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久成人 | 紧缚调教一区二区三区视频 | 久久精品国产一区二区三区不卡 | 在线观看你懂的网站 | 国产精品久久在线观看 | 亚洲第一av | 中文字幕av在线播放 | 国产特一级黄色片 | 福利一区视频 | 免费一二区 | 黄色免费在线观看网站 | 亚州视频在线 | 欧美日韩在线视频一区 | 国产福利在线播放 | 欧洲毛片 | 成人深夜福利 | 毛片在线看片 | 在线观看中文字幕dvd播放 | 久久免费高清 | 久久不卡日韩美女 | 日本网站免费观看 | 亚洲www啪成人一区二区 | 欧美三级久久久 | 欧美区在线 | 香蕉大人久久国产成人av | av网站免费在线观看 | 精品免费av | 亚洲精品一区中文字幕 | 久久久久高清 | 久久久久久国产精品免费 | 久久久九九九九 | 98久久| 日韩电影免费观看中文字幕 | 欧美精品欧美精品系列 | 亚洲一区二区网站 | 在线观看电影av | 91大神xh98xh系列全部 | 亚洲高清一区二区三区 | av黄色片在线观看 | 午夜视频一区二区 | 日韩一区欧美一区 |