作者:小爝
链接:https://www.zhihu.com/question/30274750/answer/118846177
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
链接:https://www.zhihu.com/question/30274750/answer/118846177
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
1,如何编写健壮的javascript代码,鲁棒性,简单总结几条我觉得是常识的事:
1.1 一个javascript库最好的实现方式是占用最少的命名空间,比如window对象上或者global对象上只占用一个引用。
1.2 健壮的js程序对输入都会有完善的类型检查和异常处理,边界值的判断。
1.3 对js的几种继承方式要足够了解,什么时候用原型继承,什么时候用拷贝继承,好处缺点,以及整个库中的类管理的统一。
1.4 用好的函数名和变量名代替多余的注释。
1.5 对浏览器和宿主环境的检查,nodejs比如os的检查,web端比如浏览器版本和型号的检测,检测又分为功能检测和版本检测等方法。
1.6 一样的代码不写第二次。
1.7 少用匿名函数。
1.8 整个库的生命周期定义要想好。
1.9 可读性的维护,比如dom元素都带$,局部变量和全局变量,常量,私有变量的使用,js的2条链,作用域和原型链的概念,统一的出入口,统一的流程控制,事件机制,适当的根据场景应用设计模式,我的建议是可读性优先于代码性能。
等等等等吧,这些都属于是工程类的问题,经验包吃多了 平时写代码都会注意。而健壮的javascript代码以上都是必须的,其实其他语言也适用,可以多看看重构,编写可维护的代码这一类的书。
2,什么是js库,一个开源的js库都包含哪些东西(不仅仅只有代码)。
如果是第一条是写js库的一个前提条件,那么这里说的是当你实现了功能之后,你的库里配套的还需要什么?
2.1 文档,这个不必说了,文档分2种,一种自动的jsdoc一类的,一种手工维护的API列表和说明。最后还应该附带最佳实践和例子。
2.2 测试用例,这里一般指单元测试,如果你的pr不通过单元测试,说明你影响了你修改部分的其他逻辑,这也是保证库健壮可用的必须条件。
2.3 demo,和文档类似,但是更贴近现实生活,就是说完整的使用场景。
2.4 自动化构建或者说项目维护的脚本,如果说一个库的功能很复杂,那么多代码如何最终构建给用户使用,内部一定要有一套机制来完善,比如dev比如build,有人用make有人用gulp,这部分的额外工作在很多js库都有体现。
2.5 依赖包的状态要告诉使用者,升级策略和开发版本与稳定版本的区别。
2.6 安装文档,或者提供云cdn资源。
2.7 完善的dev环境文档,这里很多开发者没有,导致你的项目只能你自己维护,很累,其他人想帮忙,在环境这一关就被拦下来了。
3,易用性,也就是要有一定的API设计能力,足够的代码抽象能力,也就是用户体验部分。
我在编写一些玩具库的时候,都是先设计API,先写实例初始化化的伪代码,调用方法的伪代码,在脑海里想一下 我怎么用这个库更舒服,设计好之后,再对库进行实现,当然也可以多参考其他框架库的方法命名,尊重用户习惯,可以多看看API设计一类的书,这一部分也是不区分语言的。
4,肯定要对算法和数据结构要有一定了解。
举一个最简单的例子,很多库里面的缓存策略是什么样子的?这里抛砖引玉,比如vue的缓存就用了https://github.com/rsms/js-lru 这个库,而这个库说白了就是Least Recently Used 近期最少使用算法,简称LRU,很多语言都有实现,你不了解不知道算法和数据结构,你怎么做最合适的取舍呢?
5,如果是说js库,那么配套的扩展机制也一定要提前设计好。
vue有全家桶,jquery有jq-ui,yui也有自己配套的一系列插件和扩展方法。当然如果你只是想写一些小巧的独立js库,最好把一些关键方法暴露出来让其他人可以方便在外部复写或者继承重写。否则遇到问题,别人就只能破坏你的源码了,这对开发使用者来说也是非常不友好的。
1.1 一个javascript库最好的实现方式是占用最少的命名空间,比如window对象上或者global对象上只占用一个引用。
1.2 健壮的js程序对输入都会有完善的类型检查和异常处理,边界值的判断。
1.3 对js的几种继承方式要足够了解,什么时候用原型继承,什么时候用拷贝继承,好处缺点,以及整个库中的类管理的统一。
1.4 用好的函数名和变量名代替多余的注释。
1.5 对浏览器和宿主环境的检查,nodejs比如os的检查,web端比如浏览器版本和型号的检测,检测又分为功能检测和版本检测等方法。
1.6 一样的代码不写第二次。
1.7 少用匿名函数。
1.8 整个库的生命周期定义要想好。
1.9 可读性的维护,比如dom元素都带$,局部变量和全局变量,常量,私有变量的使用,js的2条链,作用域和原型链的概念,统一的出入口,统一的流程控制,事件机制,适当的根据场景应用设计模式,我的建议是可读性优先于代码性能。
等等等等吧,这些都属于是工程类的问题,经验包吃多了 平时写代码都会注意。而健壮的javascript代码以上都是必须的,其实其他语言也适用,可以多看看重构,编写可维护的代码这一类的书。
2,什么是js库,一个开源的js库都包含哪些东西(不仅仅只有代码)。
如果是第一条是写js库的一个前提条件,那么这里说的是当你实现了功能之后,你的库里配套的还需要什么?
2.1 文档,这个不必说了,文档分2种,一种自动的jsdoc一类的,一种手工维护的API列表和说明。最后还应该附带最佳实践和例子。
2.2 测试用例,这里一般指单元测试,如果你的pr不通过单元测试,说明你影响了你修改部分的其他逻辑,这也是保证库健壮可用的必须条件。
2.3 demo,和文档类似,但是更贴近现实生活,就是说完整的使用场景。
2.4 自动化构建或者说项目维护的脚本,如果说一个库的功能很复杂,那么多代码如何最终构建给用户使用,内部一定要有一套机制来完善,比如dev比如build,有人用make有人用gulp,这部分的额外工作在很多js库都有体现。
2.5 依赖包的状态要告诉使用者,升级策略和开发版本与稳定版本的区别。
2.6 安装文档,或者提供云cdn资源。
2.7 完善的dev环境文档,这里很多开发者没有,导致你的项目只能你自己维护,很累,其他人想帮忙,在环境这一关就被拦下来了。
3,易用性,也就是要有一定的API设计能力,足够的代码抽象能力,也就是用户体验部分。
我在编写一些玩具库的时候,都是先设计API,先写实例初始化化的伪代码,调用方法的伪代码,在脑海里想一下 我怎么用这个库更舒服,设计好之后,再对库进行实现,当然也可以多参考其他框架库的方法命名,尊重用户习惯,可以多看看API设计一类的书,这一部分也是不区分语言的。
4,肯定要对算法和数据结构要有一定了解。
举一个最简单的例子,很多库里面的缓存策略是什么样子的?这里抛砖引玉,比如vue的缓存就用了https://github.com/rsms/js-lru 这个库,而这个库说白了就是Least Recently Used 近期最少使用算法,简称LRU,很多语言都有实现,你不了解不知道算法和数据结构,你怎么做最合适的取舍呢?
5,如果是说js库,那么配套的扩展机制也一定要提前设计好。
vue有全家桶,jquery有jq-ui,yui也有自己配套的一系列插件和扩展方法。当然如果你只是想写一些小巧的独立js库,最好把一些关键方法暴露出来让其他人可以方便在外部复写或者继承重写。否则遇到问题,别人就只能破坏你的源码了,这对开发使用者来说也是非常不友好的。