## 一、榫卯
  榫卯(sǔn mǎo),是古代中国建筑、家具及其它器械的主要结构方式,是在两个构件上采用凹凸部位相结合的一种连接方式。
  若榫卯使用得当,两块木结构之间就能严密扣合,达到“天衣无缝”的程度,并且不用钉子。
:-: ![](https://img.kancloud.cn/6a/2a/6a2af20876cd4c585add559e748399a8_600x495.jpg =300x)
  下面这张图来自于山西悬空寺,屋檐下面的那些都是用榫卯做成的,没有用一颗钉子。
:-: ![](https://img.kancloud.cn/74/83/7483486fefdd20bad17b47f7c906f3d2_450x389.jpg =300x)
## 二、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/)等。
:-: ![](https://img.kancloud.cn/1c/b5/1cb52371a4785cd898ce154cd665c093_1458x208.png =600x)
  这些封装好的库使用起来方便兼容性好,但是有些时候我仅仅是需要使用里面的个别方法,例如做活动页面。
  就为了这几个个别方法而把整个库都引进来,有种杀鸡用牛刀的感觉。
  当看到下面那位非洲朋友用圣剑来切牛排,囧,瞬间就能体会那种感觉。
:-: ![](https://img.kancloud.cn/30/37/30378b9d05afacf2d3edbe7b030ad92d_523x477.jpg =300x)
  而如果想把里面的个别方法抽出来,又不能直接用,因为这些方法可能引用了库中的私有方法属性等,就好像建筑里的钉子,需要钉子来衔接。
  所以这个时候就需要使用自己封装的函数,就好比榫卯,拿来即可用,而不需要特定的钉子。
## 三、构建榫卯结构
  要想构建,最方便的还是要参考下现有的库是如何做的,这样能少走些弯路。
  在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是事件模块。
:-: ![](https://img.kancloud.cn/2c/ed/2cedad440a7187d0a6f4654d7271ac75_738x118.jpg)
  还看到两个更小的库,[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几大部分。
  根据他们的分类,两个库之间有些地方应该还能互补一下。
:-: ![](https://img.kancloud.cn/f5/96/f596638169c782991f3dff9022611d7d_419x149.jpg =300x)
**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),欢迎阅读。
![](https://box.kancloud.cn/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200)
- 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年
- 日志
- 2020