使用node.js半年来总结的 10 条经验


Posted in Javascript onAugust 18, 2014

先不说房价,堵车,雾霾。。。先说说我这半年使用 Node.js 的经验吧。。。都是工作上遇到的问题,血的教训。。

1.精确版本号

“一定要精确到具体版本号!使用*直接滚,^和~都不行!”,早上刚到公司,我们服务器的头头满眼血丝(估计又凌晨几点睡的),对我抱怨道:“妈蛋,以前写的代码package.json里的版本和服务器正在运行的版本不一样。安装最新的又咣咣一顿报错。”此处省略几千字。。。

好吧。我先打自己脸。以前只会用*。。。大多时候也没必要写死版本号,使用^和~也可以。扫一下盲:

semver
node.js 中的版本管理

2.测试

一定要写测试用例。就拿我来说,我负责的那块包含过滤部分(用正则神马的过滤文本,提取出有用的文本)。有了测试用例,每次改动过滤规则后,npm test 下,妥妥的。依个人喜好挑选使用的测试模块,mocha, should, tape, tap, supertest 等等。

尝试本地运行,测试成功后才上传到服务器。我好几次改完代码(就简单的改了几行)以为怎么可能会出问题,结果一重启服务器就挂了。。尼玛少了括号什么的。。这种问题也可以通过使用jslint或jshint等编辑器插件来检测低级语法错误。

服务器代码备份。目前我使用的方法:起初服务器上有两个一模一样的工程(git库,文件名不一样),一个正在运行,另一个当作备份。当有代码改动时,到备份工程下 git pull ,然后停止正在运行的程序,启动备份的程序。假如程序经过一段时间没有挂掉也就是感觉比较稳定后,将此工程当作主,另一个工程当作备。当又有改动时,重复以上步骤,主备来回切换。假如程序挂掉了,则切换回较稳定的备即可。

3.使用 debug

写程序免不了调试,很多人喜欢并习惯用万能的 console.log() ,包括我。。就个人而言,我使用 console.log() 调完后,不是删掉就是注释掉。删掉吧以后也许还会用到,注释掉吧怪难看。这个时候不妨用用 debug 模块。暂时没用过 node-inspector,不做评价。

4.保持代码精简

尝试用较少的代码完成较多的事情,也是对自己能力的提升与考验。包括正确的缩进,恰当的变量名,清晰的代码组织结构等等。。代码精简了,漂亮了,当出问题了回头查错也快,总比先弄明白一团乱糟的代码干了些什么就花了几个小时强。

假如团队没有使用CoffeeScript的话就不要使用它。一是别人无法读懂你的代码帮你纠错。二是出错后显示出错的行数和coffee代码的行数不一样。。。自己的开源项目可以用用。

5.多请教,保持独立思考

刚开始工作的时候,我也各种一头雾水,包括技术上的不足和业务逻辑上的欠缺,常常请教团队内的大牛。而后我会尝试弥补技术上的不足,理清业务上的逻辑。后来有一次,我要根据 PM 的要求设计一个 api,既要考虑用户的需求(多客户端的情况),客户端的需求和行为,数据库的设计(怎么存冗余少,查询次数少,易扩展,易修改,差量查询)等等,考虑了一个周多,几近崩溃。。。虽然我和头头商量了好多次,但它总是给我理逻辑,不告诉我方法。后来终于找了一种还算不错的解决方式。。他后来也告诉我,想让我保持独立思考去解决问题,这样才能有提高。。

6.使用现有的库

目前npm上已经有近9W的第三方模块了,理论上想用的都能在npm上找到,当然npm上不乏非常多的优秀的模块,文档全面,使用也非常方便,通常都会满足需求。假如你发现某个模块能满足大部分需求可以有功能上的完善,或有bug,可以去github上提pr,假如你发现没能找到满足的模块的话,可以自己创建个并npm publish到npm上与大家共享。当然你发现某类实现某个功能的模块都很shit的话,你也可以publish个不shit的。

7.保持简单

假如你想展示一个饼图的话,用 HTML5 canvas 或 CSS3 即可,没必要用 C++ 的 canvas 库画一个图片,“光下载依赖的库就 400+ MB”,头头如是说。

8.良好的文档

良好的文档是客户端与服务器团队交流的最重要的渠道。文档写得明明白白了,假如客户端请求出错了,就可以先去查看文档(比如每个错误代码代表了什么),而不是每次出问题了就来找服务器的人讨论。PS: 一些 http 请求示例尽量用 curl 写,而不是 js 中的对象等的方式,也许你看的很懂,但客户端的人不懂 js。

9.配置文件

在每个工程目录下都建一个配置文件,如 config.js/config.json。而不是写死在代码里。如:

{
  "app": 3000,
  "mongo": {
    "host": "localhost",
    "port": 27017
  },
  "redis": {
    "host": "localhost",
    "port": 6379
  }
  ...
}
10.使用 pm2

使用 pm2 等这种进程管理工具,很方便,最不济进程挂掉了还能自动重启?取C挥霉 forever 不做评价。。还有 grunt 神马的也没用过,不做评价。

Javascript 相关文章推荐
Javascript 读书笔记索引贴
Jan 11 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
Aug 28 Javascript
AngularJS进行性能调优的7个建议
Dec 28 Javascript
Bootstrap面板使用方法
Jan 16 Javascript
Web前端框架Angular4.0.0 正式版发布
Mar 28 Javascript
python爬取安居客二手房网站数据(实例讲解)
Oct 19 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
Jan 08 Javascript
vue项目关闭eslint校验
Mar 21 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 jQuery
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
Aug 24 Javascript
Vue核心概念Getter的使用方法
Jan 18 Javascript
使用异步controller与jQuery实现卷帘式分页
Jun 18 jQuery
推荐 21 款优秀的高性能 Node.js 开发框架
Aug 18 #Javascript
根据当前时间在jsp页面上显示上午或下午
Aug 18 #Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
Aug 18 #Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
Aug 18 #Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 #Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
Aug 18 #Javascript
javascript ajax的5种状态介绍
Aug 18 #Javascript
You might like
php 移除数组重复元素的一点说明
2008/11/27 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
PHP发送短信代码分享
2015/08/11 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
php实现的顺序线性表示例
2019/05/04 PHP
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
详解用async/await来处理异步
2019/08/28 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
Python标准库defaultdict模块使用示例
2015/04/28 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
使用python爬取B站千万级数据
2018/06/08 Python
我就是这样学习Python中的列表
2019/06/02 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
PyTorch预训练的实现
2019/09/18 Python
python 循环数据赋值实例
2019/12/02 Python
python连接mongodb集群方法详解
2020/02/13 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
使用C#编写创建一个线程的代码
2013/01/22 面试题
蟋蟀的住宅教学反思
2014/04/26 职场文书
食品安全处置方案
2014/06/14 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
教师辞职书范文
2015/02/26 职场文书
2019入党申请书格式
2019/06/25 职场文书
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫