使用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 相关文章推荐
关于jquery append() html时的小问题的解决方法
Dec 16 Javascript
JS动态添加option和删除option(附实例代码)
Apr 01 Javascript
js获取视频时长代码
Apr 10 Javascript
PHP PDO操作总结
Nov 17 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
Sep 02 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
详解axios在vue中的简单配置与使用
May 10 Javascript
javascript中new Array()和var arr=[]用法区别
Dec 01 Javascript
基于IView中on-change属性的使用详解
Mar 15 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
微信小程序仿知乎实现评论留言功能
Nov 28 Javascript
利用vue-i18n实现多语言切换效果的方法
Jun 19 Javascript
推荐 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获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
PHP递归算法的简单实例
2019/02/28 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
jquery实现拖动效果
2016/08/10 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
中医专业职业生涯规划书范文
2014/01/04 职场文书
运动会稿件100字
2014/02/21 职场文书
《长相思》听课反思
2014/04/10 职场文书
人事任命书格式
2014/06/05 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python