## 一、榫卯
  榫卯(sǔn mǎo),是古代中國建筑、家具及其它器械的主要結構方式,是在兩個構件上采用凹凸部位相結合的一種連接方式。
  若榫卯使用得當,兩塊木結構之間就能嚴密扣合,達到“天衣無縫”的程度,并且不用釘子。
:-: 
  下面這張圖來自于山西懸空寺,屋檐下面的那些都是用榫卯做成的,沒有用一顆釘子。
:-: 
## 二、JavaScript與榫卯
  在開發頁面的時候,或多或少的要寫JavaScript,除了些業務邏輯的代碼外。
  還有DOM操作,AJAX處理,事件綁定,實用功能,Promises/A+規范實現,樣式、集合、數組、函數、對象、時間、URL、動畫、模版、cookie等各種操作。
  現在網上相關的開源庫很多,例如封裝DOM操作的,有[Zepto](https://github.com/madrobby/zepto)、[Sizzle引擎](https://github.com/jquery/sizzle)等,實用庫[Underscore](http://underscorejs.org/)、[Sugar](http://sugarjs.com/)等。
:-: 
  這些封裝好的庫使用起來方便兼容性好,但是有些時候我僅僅是需要使用里面的個別方法,例如做活動頁面。
  就為了這幾個個別方法而把整個庫都引進來,有種殺雞用牛刀的感覺。
  當看到下面那位非洲朋友用圣劍來切牛排,囧,瞬間就能體會那種感覺。
:-: 
  而如果想把里面的個別方法抽出來,又不能直接用,因為這些方法可能引用了庫中的私有方法屬性等,就好像建筑里的釘子,需要釘子來銜接。
  所以這個時候就需要使用自己封裝的函數,就好比榫卯,拿來即可用,而不需要特定的釘子。
## 三、構建榫卯結構
  要想構建,最方便的還是要參考下現有的庫是如何做的,這樣能少走些彎路。
  在Github上面看到了兩個頁面,專門記錄了各種類庫《[Front-End-Develop-Guide](https://github.com/icepy/Front-End-Develop-Guide)》與《[Awesome JavaScript](https://github.com/sorrycc/awesome-javascript)》
  有些時候也不用一定要自己寫,有相關的類庫就直接收錄進來,要用的時候就不用再到網上去各種搜索啦!
**1)DOM選擇器**
  這是在平時開發頁面必用的,ES5規范出來后,定義了很多實用的方法,可以不再像以前那樣編寫大量的兼容代碼。
  原生的“[querySelectorAll](https://developer.mozilla.org/zh-CN/docs/Web/API/Element/querySelectorAll)”和“[querySelector](https://developer.mozilla.org/zh-CN/docs/Web/API/Document/querySelector)”非常強大,語法和JQuery中的選擇器大致一樣。
[Sizzle](https://sizzlejs.com/)也就是是[jQuery](https://jquery.com/)的選擇器引擎,將近2000行的代碼,不過很多代碼是在兼容IE6、IE7等古老的PC瀏覽器,關于這個引擎可以參考《[jQuery中的Sizzle引擎分析](http://www.cnblogs.com/strick/p/5078435.html)》
  我現在都是在移動端開發,移動端的瀏覽器都要高級些,所以我打算參考[Zepto](https://github.com/madrobby/zepto)來封裝。
  這個是針對移動端瀏覽器,并且是模塊化的,想參考里面的3個模塊,event是事件模塊。
:-: 
  還看到兩個更小的庫,[HTML](http://nbubna.github.io/HTML/)和[140 medley](https://github.com/honza/140medley)。
**2)實用庫**
  實用庫我打算參考[Underscore](http://underscorejs.org/)與[Sugar](http://sugarjs.com/),這兩個庫都有各自的主頁,分類也很清晰。
  Underscore還有個帶注釋的[源代碼頁面](http://underscorejs.org/docs/underscore.html)。
  Underscore分為Collection、Array、Function、Object、Utility幾大部分。
  Sugar分為Array、String、Number、Date、Object、Function、RegExp、Range幾大部分。
  根據他們的分類,兩個庫之間有些地方應該還能互補一下。
:-: 
**3)其他相關的庫**
1. 對時間的各種操作,有兩個庫用的人蠻多,[Datejs](http://www.datejs.com/)和[moment](http://momentjs.com/)。我是比較前者,代碼比較少,比較容易看源碼。
2. Promises/A+規范的實現,相關庫比較多,[when.js](https://github.com/cujojs/when)、[Zepto中的deferred.js](https://github.com/madrobby/zepto/blob/master/src/deferred.js)還有[promise-polyfill](https://github.com/taylorhakes/promise-polyfill)。如果對這個規范概念不是很清楚,可以參考《[Promises/A+規范的實現](http://www.cnblogs.com/strick/p/5092092.html)》
3. 模板喜歡用[mustache](https://github.com/janl/mustache.js),代碼簡潔,但功能不簡潔,用了以后就會知道很方便。
4. 本地存儲的封裝,可以借鑒或直接引用[store.js](https://github.com/marcuswestin/store.js),代碼就100多行,完全能看懂。
5. cookie的各種操作,可以借鑒或直接引用[js-cookie](https://github.com/js-cookie/js-cookie),源碼也是我喜歡的100多行。
6. 對URL的基本操作,可以借鑒或直接引用[domurl](https://github.com/Mikhus/domurl)。
  我選擇庫都會選擇小巧、功能比較單一、而且不依賴第三方庫。
  源碼看起來也能方便點,抽出代碼的時候也能少費點時間。
  這里只是做個拋磚引玉,具體怎么構建可以根據實際情況來操作。
*****
參考資料:
[Zepto源碼分析](https://github.com/mominger/blog)
[前端開發指南](https://github.com/icepy/Front-End-Develop-Guide)
[Awesome JavaScript](https://github.com/sorrycc/awesome-javascript)
*****
> 已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎閱讀。

- ES6
- 1、let和const
- 2、擴展運算符和剩余參數
- 3、解構
- 4、模板字面量
- 5、對象字面量的擴展
- 6、Symbol
- 7、代碼模塊化
- 8、數字
- 9、字符串
- 10、正則表達式
- 11、對象
- 12、數組
- 13、類型化數組
- 14、函數
- 15、箭頭函數和尾調用優化
- 16、Set
- 17、Map
- 18、迭代器
- 19、生成器
- 20、類
- 21、類的繼承
- 22、Promise
- 23、Promise的靜態方法和應用
- 24、代理和反射
- HTML
- 1、SVG
- 2、WebRTC基礎實踐
- 3、WebRTC視頻通話
- 4、Web音視頻基礎
- CSS進階
- 1、CSS基礎拾遺
- 2、偽類和偽元素
- 3、CSS屬性拾遺
- 4、浮動形狀
- 5、漸變
- 6、濾鏡
- 7、合成
- 8、裁剪和遮罩
- 9、網格布局
- 10、CSS方法論
- 11、管理后臺響應式改造
- React
- 1、函數式編程
- 2、JSX
- 3、組件
- 4、生命周期
- 5、React和DOM
- 6、事件
- 7、表單
- 8、樣式
- 9、組件通信
- 10、高階組件
- 11、Redux基礎
- 12、Redux中間件
- 13、React Router
- 14、測試框架
- 15、React Hooks
- 16、React源碼分析
- 利器
- 1、npm
- 2、Babel
- 3、webpack基礎
- 4、webpack進階
- 5、Git
- 6、Fiddler
- 7、自制腳手架
- 8、VSCode插件研發
- 9、WebView中的頁面調試方法
- Vue.js
- 1、數據綁定
- 2、指令
- 3、樣式和表單
- 4、組件
- 5、組件通信
- 6、內容分發
- 7、渲染函數和JSX
- 8、Vue Router
- 9、Vuex
- TypeScript
- 1、數據類型
- 2、接口
- 3、類
- 4、泛型
- 5、類型兼容性
- 6、高級類型
- 7、命名空間
- 8、裝飾器
- Node.js
- 1、Buffer、流和EventEmitter
- 2、文件系統和網絡
- 3、命令行工具
- 4、自建前端監控系統
- 5、定時任務的調試
- 6、自制短鏈系統
- 7、定時任務的進化史
- 8、通用接口
- 9、微前端實踐
- 10、接口日志查詢
- 11、E2E測試
- 12、BFF
- 13、MySQL歸檔
- 14、壓力測試
- 15、活動規則引擎
- 16、活動配置化
- 17、UmiJS版本升級
- 18、半吊子的可視化搭建系統
- 19、KOA源碼分析(上)
- 20、KOA源碼分析(下)
- 21、花10分鐘入門Node.js
- 22、Node環境升級日志
- 23、Worker threads
- 24、低代碼
- 25、Web自動化測試
- 26、接口攔截和頁面回放實驗
- 27、接口管理
- 28、Cypress自動化測試實踐
- 29、基于Electron的開播助手
- Node.js精進
- 1、模塊化
- 2、異步編程
- 3、流
- 4、事件觸發器
- 5、HTTP
- 6、文件
- 7、日志
- 8、錯誤處理
- 9、性能監控(上)
- 10、性能監控(下)
- 11、Socket.IO
- 12、ElasticSearch
- 監控系統
- 1、SDK
- 2、存儲和分析
- 3、性能監控
- 4、內存泄漏
- 5、小程序
- 6、較長的白屏時間
- 7、頁面奔潰
- 8、shin-monitor源碼分析
- 前端性能精進
- 1、優化方法論之測量
- 2、優化方法論之分析
- 3、瀏覽器之圖像
- 4、瀏覽器之呈現
- 5、瀏覽器之JavaScript
- 6、網絡
- 7、構建
- 前端體驗優化
- 1、概述
- 2、基建
- 3、后端
- 4、數據
- 5、后臺
- Web優化
- 1、CSS優化
- 2、JavaScript優化
- 3、圖像和網絡
- 4、用戶體驗和工具
- 5、網站優化
- 6、優化閉環實踐
- 數據結構與算法
- 1、鏈表
- 2、棧、隊列、散列表和位運算
- 3、二叉樹
- 4、二分查找
- 5、回溯算法
- 6、貪心算法
- 7、分治算法
- 8、動態規劃
- 程序員之路
- 大學
- 2011年
- 2012年
- 2013年
- 2014年
- 項目反思
- 前端基礎學習分享
- 2015年
- 再一次項目反思
- 然并卵
- PC網站CSS分享
- 2016年
- 制造自己的榫卯
- PrimusUI
- 2017年
- 工匠精神
- 2018年
- 2019年
- 前端學習之路分享
- 2020年
- 2021年
- 2022年
- 2023年
- 2024年
- 日志
- 2020