摘要:于是模塊化的需求也就產(chǎn)生了?,F(xiàn)存的規(guī)范還真不少,不知道能否終結(jié)這場混戰(zhàn)和分別是和定義的標(biāo)準(zhǔn)。是使用的模塊化標(biāo)準(zhǔn)。的模塊化聲明的方式與類似,只是更進(jìn)一步,天然隔離了命名空間。其他,關(guān)于前端化趨勢模塊化意味著什么更強(qiáng)大的前端,技術(shù)整體前移。
作者:肖光宇
野狗科技聯(lián)合創(chuàng)始人,先后在貓撲、百度、搜狗任職,愛折騰的前端工程師。
野狗官博:https://blog.wilddog.com/
野狗官網(wǎng):https://www.wilddog.com/
公眾訂閱號:wilddogbaas
轉(zhuǎn)載請保留以上信息。
模塊化這個(gè)問題并非一開始就存在,WWW剛剛問世的時(shí)候,html,JavaScript,CSS(JS和CSS都是后來在網(wǎng)景被引進(jìn)瀏覽器的)都是極其簡單的存在,不需要模塊化。
模塊化的需求是規(guī)模的產(chǎn)物,當(dāng)web page進(jìn)化到web application,瀏覽器端處理的邏輯越來越復(fù)雜,展現(xiàn)的樣式和動(dòng)畫越來多,對于工程的要求也就越來越高。于是模塊化的需求也就產(chǎn)生了。模塊化的意義:
組件的復(fù)用,降低開發(fā)成本和維護(hù)成本
組件多帶帶開發(fā),方便分工合作
模塊化遵循標(biāo)準(zhǔn),方便自動(dòng)化依賴管理,代碼優(yōu)化,部署
JavaScript長久以來被認(rèn)為是簡單的腳本語言,實(shí)際上情況早就發(fā)生來變化,在最新版的ECMA-262(ES6)文檔中強(qiáng)調(diào)JavaScript是通用編程語言而不是腳本語言。腳本語言,比如shell并不是用來完成復(fù)雜功能的,只是用來做一些自動(dòng)化控制,是不需要模塊化的。而用于構(gòu)建復(fù)雜系統(tǒng)通用編程語言(比如Java)一般都有模塊的實(shí)現(xiàn)。
1.模塊化標(biāo)準(zhǔn)ES6之前,JavaScript并沒有原生的模塊機(jī)制,好在JavaScript非常靈活,有很多種寫法可以將代碼天然隔離,起到模塊化的功能:
//define var modules = {} modules.mod1 = { foo : function(){...}, bar : function(){...} ... } //call modules.mod1.foo()
在客戶端這種方式基本是夠用的,然而問題依然存在:你無法管理依賴,所有的代碼都必須load到內(nèi)存中,需要哪些模塊必須由人工處理。分模塊是工程化的產(chǎn)物,也是自然發(fā)展的結(jié)果,自然有很多嘗試。很顯然,模塊之間互相依賴需要編寫模塊的時(shí)候遵循一定的規(guī)范。現(xiàn)存的規(guī)范還真不少,不知道ES6 能否終結(jié)這場混戰(zhàn):
AMD
CMD
closure
CommonJS
ES6
AMD和CMD分別是requireJS和seaJS定義的標(biāo)準(zhǔn)。使用純原生的ES5語法意味者其只能使用閉包,書寫和閱讀都很怪異。值得一提的是AngularJS也使用類似的方式,以至于Angular的作者們都受不了,決定在AngularJS 2 使用新的語言AtScript,前端輪子太多,又造了一個(gè),好在這個(gè)輪子造的比較好,兼容ES6 TypeScript規(guī)范,扯的遠(yuǎn)了,看看AMD長得啥樣:
AMD:
define(["./a", "./b"], function(a, b) { ... })
Closure是google出品的前端工具,Closure提供了一系列工具和庫,谷歌自己的多個(gè)項(xiàng)目都是使用Closure開發(fā)的。closure compiler通過模塊間依賴的聲明把所有被依賴的文件打包到一起,而且Closure的一大優(yōu)勢是如果采用破壞性壓縮(ADVANCED)壓縮率極高。
//文件A goog.provide("module1") com.foo.bar = { ... } .... //文件B goog.require("module1") var a = com.foo.bar;
然而Closure并不完美,不同的文件共享同一個(gè)全局對象,所以你不得不這樣寫 a.b.c=...。
CommonJS是Node.js使用的模塊化標(biāo)準(zhǔn)。Node.js對于前端開發(fā)者來說不僅僅可以提供一個(gè)Server,還是一個(gè)完美的開發(fā)平臺(tái),在Node上使用Grunt/gulp構(gòu)建web項(xiàng)目是件很爽的事情。Node的模塊化聲明的方式與Closure類似,只是更進(jìn)一步,天然隔離了命名空間。上面的代碼如果使用CommonJS的模塊化規(guī)范可以這么寫
//文件A module.exports = {...} .... //文件B var a = require("./foo/bar")
browserify讓使用CommonJS模塊化規(guī)范的代碼可以運(yùn)行在客戶端上。(browserify原理分析)
2.靜態(tài)加載與動(dòng)態(tài)加載在看ES6之前我們先看模塊加載的兩種方式:
靜態(tài)加載:在編譯階段進(jìn)行,把所有需要的依賴打包到一個(gè)文件中
動(dòng)態(tài)加載:在運(yùn)行時(shí)加載依賴
AMD標(biāo)準(zhǔn)是動(dòng)態(tài)加載的代表,而CommonJS是靜態(tài)加載的代表。AMD的目的是用在瀏覽器上,所以是異步加載的。而NodeJS是運(yùn)行在服務(wù)器上的,同步加載的方式顯然更容易被人接收,所以使用了CommonJS。同樣的道理,如果靜態(tài)加載,那就使用同步的加載方式,如果動(dòng)態(tài)加載就必須用異步的加載方式。
那么ES6采用何種加載機(jī)制?
ES6既希望用簡單的聲明方式來完成靜態(tài)加載,又不愿放棄動(dòng)態(tài)加載的特性,而這兩種方式幾乎不可能簡單的同時(shí)實(shí)現(xiàn),所以ES6提供了兩種獨(dú)立的模塊加載方法。
2.1 聲明的方式
import {foo} from module1
2.2 通過System.import API的方式
System.import("some_module") .then(some_module => { // Use some_module }) .catch(error => { ... });
再看下export的語法,與CommonJS很像,只不過沒有了module這個(gè)對象,而直接調(diào)用export。 可以export任何一個(gè) 函數(shù),變量,對象
//expt.js export function abc(){}//export 一個(gè)命名的function export default function(){} //export default function export num=123 //export 一個(gè)數(shù)值 export obj={} export { obj as default }; //import import expt from "expt"http://default export import {default as myModule} from "expt" //rename import {abc,num,obj} from "expt"
更多細(xì)節(jié)可以看這篇文章:http://www.2ality.com/2014/09/es6-modules-final.html
目前來看,使用預(yù)編譯的方式顯然要好于使用動(dòng)態(tài)加載,瀏覽器對ES6語法支持還很差,如果使用動(dòng)態(tài)加載ES6,在瀏覽器端要做ES6到ES5的翻譯工作,這個(gè)顯然是重復(fù)低效的。但是隨著瀏覽器對ES6支持增強(qiáng),尤其是瀏覽器實(shí)現(xiàn)了動(dòng)態(tài)加載API后,動(dòng)態(tài)加載的優(yōu)勢就會(huì)展現(xiàn):
更流暢的用戶體驗(yàn),動(dòng)態(tài)加載可以實(shí)現(xiàn)類似lazyload的加載方式,將download的時(shí)間分散
更簡潔的項(xiàng)目,無需預(yù)編譯,項(xiàng)目可以少配置很多工具
HTTP/2的普及更傾向于使用多個(gè)小的請求,適合動(dòng)態(tài)加載
3.實(shí)踐如果現(xiàn)在使用ES6,可以選擇動(dòng)態(tài)加載模塊system.js 或者browserify的預(yù)編譯方法。
使用system.js+babel動(dòng)態(tài)加載依賴。system.js 是ES6動(dòng)態(tài)模塊加載的一個(gè)實(shí)現(xiàn)。寫了一個(gè)小DEMO:
項(xiàng)目初始化
bower install babel system.js --save
index.html
... ...
main.js
export default { sayHello : function(){ console.log("hello") } }
項(xiàng)目的地址在: https://github.com/stackOverMind/demo-system.js
使用gulp+browserify+babel預(yù)編譯。gulp是一個(gè)Node.js平臺(tái)上的任務(wù)管理平臺(tái)。預(yù)編譯要做很多配置,非常繁瑣,推薦使用yeoman來生成項(xiàng)目骨架。比如使用generator-es6-webapp。
生成非常簡單,在項(xiàng)目目錄中執(zhí)行
yo es6-webapp
缺少依賴的化安裝依賴就好。
4.其他,關(guān)于前端化趨勢ES6模塊化意味著什么?
更強(qiáng)大的前端,Web技術(shù)整體前移。HTML5的發(fā)展和某些優(yōu)秀瀏覽器的支持讓web技術(shù)整體前移,以前像渲染這種工作在后端進(jìn)行是由于瀏覽器薄弱,且有老IE這種拖后腿搗亂的選手。
簡化編程模型,人工管理JS依賴和將多個(gè)JS打包這種工作可以不需要了,而配合WebComponents標(biāo)準(zhǔn),開發(fā)Web將不再借助模板引擎和預(yù)編譯引擎。
前端化還有更深遠(yuǎn)的影響--在過去瀏覽器是個(gè)工具,現(xiàn)在瀏覽器是個(gè)重要的工具,在未來瀏覽器就是用戶唯一的操作系統(tǒng)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/86170.html
摘要:而在中國,云計(jì)算也經(jīng)歷了十年來風(fēng)起云涌的發(fā)展歷程。在季昕華看來,中國云計(jì)算將進(jìn)入指數(shù)級的增量市場,優(yōu)秀的企業(yè)將在千淘萬漉之后脫穎而出。他認(rèn)為就中國來看,從年進(jìn)入云計(jì)算行業(yè)到現(xiàn)在,年間,已經(jīng)沉淀了一批比較優(yōu)秀的云計(jì)算企業(yè)。十年之前,云計(jì)算還屬于一門曲高和寡的新興技術(shù),從認(rèn)識(shí)到認(rèn)可,隨著云計(jì)算技術(shù)發(fā)展與應(yīng)用的普及,也帶來了更大的市場潛力。來自Gartner的數(shù)據(jù)顯示,到2021年,全球公共云服務(wù)...
摘要:去年,預(yù)測,云計(jì)算將從根本上加速全球企業(yè)的數(shù)字化轉(zhuǎn)型。該公司預(yù)測,到年,云計(jì)算將迎來成人時(shí)代,為企業(yè)應(yīng)用程序帶來創(chuàng)新的開發(fā)服務(wù),而不僅僅是提供更便宜的臨時(shí)服務(wù)器和存儲(chǔ)。年,云計(jì)算將堅(jiān)定地確立自己的地位,并成為未來企業(yè)應(yīng)用平臺(tái)的基礎(chǔ)設(shè)施。去年,F(xiàn)orrester預(yù)測,云計(jì)算將從根本上加速全球企業(yè)的數(shù)字化轉(zhuǎn)型。云計(jì)算為中小企業(yè)的成功提供了十年的動(dòng)力,并為創(chuàng)新性企業(yè)與全球巨頭開展競爭提供了所需的工...
摘要:關(guān)于作者是軟件基金會(huì)的成員,也是巴西第一個(gè)黑客空間的聯(lián)合創(chuàng)始人。他曾在巴西媒體,銀行和政府部門教授開發(fā),并在,,和上發(fā)表演講。他是一位自學(xué)成才的程序員,也是使用學(xué)習(xí)編程一系列書的作者。 showImg(https://segmentfault.com/img/remote/1460000018926735); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | ...
摘要:阿里妹導(dǎo)讀近日,螞蟻金服副胡喜應(yīng)邀做了螞蟻金服十五年技術(shù)架構(gòu)演進(jìn)之路的演講,分享螞蟻金服對金融科技未來的判斷,并首次對外公開螞蟻金服技術(shù)人才培訓(xùn)體系以及項(xiàng)目。 showImg(https://segmentfault.com/img/remote/1460000019158592); 阿里妹導(dǎo)讀:近日,螞蟻金服副CTO 胡喜應(yīng)邀做了《螞蟻金服十五年技術(shù)架構(gòu)演進(jìn)之路》的演講,分享螞蟻金...
摘要:阿里妹導(dǎo)讀近日,螞蟻金服副胡喜應(yīng)邀做了螞蟻金服十五年技術(shù)架構(gòu)演進(jìn)之路的演講,分享螞蟻金服對金融科技未來的判斷,并首次對外公開螞蟻金服技術(shù)人才培訓(xùn)體系以及項(xiàng)目。 showImg(https://segmentfault.com/img/remote/1460000019158592); 阿里妹導(dǎo)讀:近日,螞蟻金服副CTO 胡喜應(yīng)邀做了《螞蟻金服十五年技術(shù)架構(gòu)演進(jìn)之路》的演講,分享螞蟻金...
閱讀 1798·2023-04-25 19:37
閱讀 1450·2021-11-16 11:45
閱讀 2885·2021-10-18 13:30
閱讀 2859·2021-09-29 09:34
閱讀 1784·2019-08-30 15:55
閱讀 3178·2019-08-30 11:10
閱讀 1905·2019-08-29 16:52
閱讀 1053·2019-08-29 13:18