当前一个web portal项目,我用node.js写就,大概有2个月了,后面还会继续迭代开发。总结一些心得。
- 多数团队还是主要用node.js的npm作为工具仓库,用node.js本身做核心业务支撑的比较少。确实npm发展的越来越好,早已超过cpan成为第一大open source repository了
- node.js的门槛。这个主要还是看对js的兴趣,写惯js的当然怎么都顺眼,而多年C++的人看到弱类型变量就别扭。就node.js本身,如果不是探寻底层eventlib之类架构的话,js基础知识肯定够用了。标准Ecmascript就行,ES6不是全部都支持
- node.js的便利性。其实说白了就是npm的便利性,这个简直是机器猫的四维兜,要什么伸手就行。时间处理,安全连接,异步任务,数据库操作,web爬虫,定时调度什么的,真是应有尽有。而且很多应用服务商提供的api接口,都有node版本,或者说java,python,node三接口已经是标配了,缺一个就缺了一大块火热用户群。例子就很多了,比如amazon aws,统一支付网管ping++等等。而且现有的成熟js库都可以直接使用,比如underscore,moment
- 框架选择。相比java的spring/play,c++的STL,php的thinkphp,python的django/tronado,甚至perl古董级的catalyst,它们要么一统天下,要么多年就一两个,node简直就得了选择困难症。各种框架,前端后台,我感觉一个月出一个也不为夸张。不说angular/vue/react/backbone等面向移动端的,就后端来说除了经典的express.js,还有koa.js为代表的各种后起之秀。最近阿里也开源了一个egg.js。用什么框架,第一要看是否有人维护,是否长期和稳定。还要从用户热度(其实也可以说是google结果量),文档难度,插件和扩展各方面考虑。过于小众的,github上可能久不更新,最新issue都是陈年的。如果团队里新手较多或者业务比较重要,还是建议以exress.js入手。经典,用户基础大,出了异常有的搜,这有点儿像mysql,久经考验
- 性能问题。关于单线程的javascript能否支撑QPS等吞吐,这个网上有各种压力测试。请根据实际环境自行mock测试,不要贸然上线。我的这个项目,由于是内部用户使用,所以不存在性能问题,node的eventloop机制可以很好的支撑并发请求
前面说了一些泛泛而谈的,就express.js来说,我还有以下具体建议:
- 如果拿spring来类比,express似乎不是那种DI/IOC容器,需要自行require模块,这个也是ecmascript标准。至于AOP就很简单了,app.js里有各种中间件,其实就是自定义的函数,比如拦截登录做分析等等,比spring还简单
- 可以做前后端分离,也可以大包大揽。如果是后者,那么需要选择page template。我选择的是默认的jade(现在叫pug),因为我写惯python了所以对缩进很喜欢。如果想要更原生html的可以选择其他如EJS。前端框架用的是JADE-Bootstrap,一个印度大叔写的,github上回应了我一次issue,问了下情况,后来就没touch了
- 数据库,我们的数据源是aws redshift,类似于postgre,所以采用了pg-promise,很好的异步模式
- 信息提示,用的默认的connect-flash,这个在做一些错误提示上还是很好用的
- 循环日志可以用file-stream-rotator
我的pakage.json如下
{ "name": "某个项目", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.15.2", "cookie-parser": "~1.4.3", "debug": "~2.2.0", "express": "~4.14.0", "jade": "~1.11.0", "morgan": "~1.7.0", "serve-favicon": "~2.3.0", "pg": "latest", "express-session": "latest", "express-validator":"latest", "connect-flash": "latest", "jade-bootstrap": "latest", "promise": "~6.1.0", "pg-promise": "latest", "express-logger": "latest", "file-stream-rotator": "latest", "util": "latest", "string-format": "latest", "bluebird": "latest", "date-and-time": "latest", "underscore": "latest", "underscore.string": "latest", "request": "latest", "node-schedule": "latest" }}