node develop expirements
DESCRIPTION
node.js expirementsTRANSCRIPT
目录约定
• bin
• build
• app
• lib
• test
.gitignore / svn:ignore
• conf(etc, config, ...)
• log(s)
• temp(tmp)
• node_modules
• ...
package.json
• “=” 还是 “>=”?
• node_modules何时安装?
Makefile
• test
• coverage
• func
• benchmark
build
• build.js
• properties
• build/tpl/*
配置文件
• 忘掉json,慎用js,推荐ini
• 配置项的边界测试• 切勿滥用配置项• 认真写注释
/** * 用以... * 取值范围 * XXX: 注意 * 联系人 */
unittest
• mocha + should
• case命名
• test/unit/a.js
bin
• appctl {start|stop|reload|restart|status}
• logrotate
我是偏执狂
• 不用相对路径(用__dirname)
• 外部变量只在⼀一个地方读• 目录有等级,规避“越级”require
• 只写函数,不执行
快速迭代
• 自顶向下的开发,demo先跑起来
• 建立benchmark基准,不断修正
• status
可测性
• 接口简单,规避复杂参数(对象)• 代码分层,通信协议与业务协议分离• 单⼀一职责!
可读性• 机器可读• 日志格式
• 接口标准化(code和message分离,code可穷举)
• 人可读• 无脑常量
• “白富美”有风险
• 不可见字符
变量命名
• 变量名体现“作用域”
• 服务级(进程级)变量
• 请求级变量
• 变量与属性名master.register(port, path, cnum);
master.register(port, path, {/** ‘cnum‘ : 1,*/‘child_num’ : 1,
});
关于进程
• master
• worker
• daemon ...
异常处理
• error or exception?
• 强依赖越早暴露越好
稳定性
• nginx upstream
• 监控日志,尤其是error和exception
• latency监控(阈值取多少)
• 监控gc(--trace_gc, ...)
• 允许core dump,并监控core文件
几个原则
• private static变量,暴露exports.clean
• 始终考虑“深拷贝”和“浅拷贝”
让代码更漂亮
• 适当的空行• 等号(冒号)对齐• 代码折叠• vim: set expandtab && ret
• vim: set ff=unix
node-shark
• https://github.com/aleafs/node-shark