5.3 Lodash.js的源碼結(jié)構(gòu)
本章的最后一節(jié)將詳細介紹Lodash.js的基本框架結(jié)構(gòu)。官方代碼倉庫中的Lodash.js文件是完整的代碼,其中包含的大量注釋可以幫助開發(fā)者理解代碼的意圖。
5.3.1 基本結(jié)構(gòu)
1. 模塊化結(jié)構(gòu)
如果在編輯器中將代碼折疊起來,就能看到Lodash.js的最外層代碼框架如下所示:
;(function(){}.call(this));
第4章中介紹過這種代碼結(jié)構(gòu),從模塊外部傳入?yún)?shù)“this”,就可以讓Lodash.js脫離對環(huán)境的依賴,因為瀏覽器環(huán)境與Node.js環(huán)境中全局“this”的指向是不同的。Lodash.js會先將方法聚合在一起,然后在整個代碼的最后部分根據(jù)運行環(huán)境支持的模塊化標準選擇導(dǎo)出方式,盡管其沒有使用通用的模塊定義(UMD)規(guī)范的代碼范式,但基本思想是完全一致的。
2. 面向?qū)ο笏枷?/p>
Lodash.js中導(dǎo)出的“_”標識符并不僅僅是一個聚合了各種方法的命名空間,同時也是一個用于生成Lodash包裝對象的工廠函數(shù)。事實上,這種結(jié)構(gòu)與jQuery是一致的,jQuery中的“$”既可以作為靜態(tài)方法的命名空間(例如直接使用“$.each”“$.ajax”等方法),也可以作為jQuery包裝對象的構(gòu)造方法(傳入查詢字符串后返回jQuery包裝對象,而不是原生的DOM節(jié)點),jQuery包裝對象可以直接使用更豐富的方法來操作文檔對象模型(DOM),并通過在方法體中返回“this”來實現(xiàn)鏈式調(diào)用,因為原型對象方法中的“this”是指向?qū)嵗?。Lodash.js的做法與jQuery如出一轍,只不過它針對的不是文檔對象模型元素,而是JavaScript中的引用類型。如果你喜歡鏈式調(diào)用風格的代碼,則可以使用“_”將原生類型轉(zhuǎn)換成一個Lodash包裝對象。從源代碼中我們可以發(fā)現(xiàn),前面啟用鏈式調(diào)用時使用的“_.chain()”方法實際上是將數(shù)據(jù)集作為參數(shù)傳入構(gòu)造函數(shù),然后返回一個新的Lodash包裝對象,使得它可以訪問定義在Lodash原型對象上的那些支持鏈式調(diào)用的方法,這個看起來非常神奇的操作只有3行代碼。這里需要注意的是,Lodash.js對外暴露的構(gòu)造函數(shù)是一個工廠方法,根據(jù)傳入?yún)?shù)的不同,該方法會以不同的方式返回包裝對象,只有在傳入了未被包裝的數(shù)組或?qū)ο箢愋偷闹禃r才會生成新的包裝對象。
了解了Lodash.js的基本結(jié)構(gòu)之后,剩下的工作就是編寫內(nèi)部函數(shù)和對外暴露的工具函數(shù)了,其中會涉及大量的JavaScript基礎(chǔ)知識和編程技巧,但它們并不會對整體架構(gòu)造成影響,感興趣的讀者完全可以自學(xué),限于篇幅本書不再贅述。
5.3.2 Lodash.js源碼的學(xué)習(xí)方法
筆者曾經(jīng)閱讀過很多分析Lodash.js源碼的文章,它們能幫助筆者更好地理解這些代碼,但直到自己動手實踐之后,筆者才能逐漸運用那些經(jīng)典原則和抽象編程知識來改善自己的代碼。如果你只想要高效且省力的工作,那么熟練使用API就可以了;如果你想要成為高手,就需要搞清楚API背后的邏輯和原理;如果你想要成為大師,就需要將經(jīng)典代碼中包含的思想和技巧內(nèi)化為自己的能力?,F(xiàn)代前端開發(fā)通常是基于框架來進行的,除了聲明式的組件代碼之外,使用Lodash.js改善代碼的細節(jié)幾乎是初級工程師唯一可以自由發(fā)揮的部分。
如果決定開始學(xué)習(xí)Lodash.js的源碼(默認你已經(jīng)了解了Lodash.js中大部分常用的API),可以從官方代碼倉庫復(fù)制一份完整版的Lodash.js源代碼,大約有17 000行,不要擔心,其中多半都是注釋,你的目標很簡單,就是從這份完整的Lodash.js源碼中逐步刪除自己已經(jīng)掌握的代碼,直到它成為一個空文件為止。建議從自己最常用的那些方法開始,先試著自己去編寫它,然后到官方代碼倉庫中找到對應(yīng)方法的獨立模塊文件,看看Lodash.js是如何實現(xiàn)該方法的,確認自己已經(jīng)搞清楚相關(guān)的知識之后,將它從你復(fù)制的Lodash.js中刪除,或者將自己的收獲寫成博文分享給其他人,隨著那份源代碼的行數(shù)不斷減少,你就能感知到自己的進步了。不用趕進度,一定要做得足夠細。秘籍就在這里,能否成為高手,就看自己愿意付出多少了。