文章目录
- Node.js 本质
- V8
- libuv
- 其他
- Node.js 历史
- Node.js 局限性
- 参考
《JavaScript高级程序设计》的作者在书中写道:要想全面理解和掌握JavaScript, 关键在于弄清楚它的本质,历史,和局限性。我想:对于想深入学习Node.js的人来说,必然也要弄清楚它的本质,历史和局限性。
编程圈喜欢比来比去,这个语言怎么怎么好,那个语言的缺点怎么怎么样的。小学生才讲好坏,大人只谈利弊。老板并不会因为你会某某很火的语言就给你加工资。使用某种语言,和要取决于很多因素,公司大小,公司技术栈,项目开发周期等很多因素有关。
与其去关注某一门语言缺点,不如去深入掌握一门语言的优点 。和美国总统比说中国话,赢了又有什么意义呢?
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. -- Nodejs.org
官方说明是Node.js是构建与V8引擎上的运行时。实际上Node.js可以不使用v8引擎,其他的JS引擎也可以让Node.js运行。例如node-chakracore[1]这个项目,其实也是也是一个Node.js,只不过它使用了微软的ChakraCore js引擎。
那么Node.js究竟是什么?
我的个人见解是:Node.js是一系列优秀项目的封装。
Node.js上层提供了核心的模块,例如http, fs, buffer。中间层是一层绑定。下层是各个非常牛叉的项目。下面就请Node.js背后的项目
V8执行js的地方,V代表虚拟机,数字8有人说代表V8之父Lars Bak开发的第8个虚拟机,也有人说是它来自一种发动机的引擎。在V8十年的介绍文章中,我更倾向于将8理解为一种高性能的汽车引擎。V8在2008年和Chrome浏览器发布时被开源。从此以后,V8一举成为JavaScript引擎中,性能最高的引擎。
The new JavaScript runtime was christened “V8”, a playful reference to the powerful engine you can find in a classic muscle car. --https://v8.dev/blog/10-years
V8这个赛车引擎,不仅仅被安装到谷歌浏览器和Node.js中,同时也被按照到mongodb和Couchbase Server[2]中。
Node.js中非阻塞IO, 都是利用libuv的能力。libuv还提供了fs, DNS, 网络, 子进程, 管道, 信号处理, 流处理等等。
• http-parser 负责处理http解析
• c-ares 负责DNS相关
• OpenSSL 负责加密解密
• zlib 负责压缩解压
很多人在学习Node.js时,经常会有已经错误的倾向。NPM中有很多优秀的包,新手门往往被眼花缭乱的各种包诱惑的头晕目眩,而忽视了这些包背后的Node.js runtime。
• 1995年 JavaScript诞生
• 2008年 V8开源 Chrome诞生
• 2009年 Node.js 诞生
时间是个很美好的东西,早一步晚一步都不会有Node.js。Node.js刚开始的名字其实不叫Node.js,而叫做web.js,只是后来发现Node.js的功能远不仅仅是做web,后来才改名叫做Node.js。Node.js刚开始使用的JS引擎也不是V8,而是Mozilla的SpiderMonkey,用了SpiderMonkey两天后,Ryan就决定抛弃SpiderMonkey,改用V8。因为V8更好。
刚开始Google并没有涉及到参与Node.js的开发,但是因为Node.js依赖于V8,所以Node.js项目逐渐和V8团队沟通起来,Google对这个新项目也非常支持。
在2009年jsconf大会上,Ryan用了45分钟介绍Node.js,45分钟,几乎每个人都站起来鼓掌。Node.js一炮而红。
刚学习Node.js,都会觉得Node.js单进程,单线程,不能充分利用CPU资源,而且一旦线程崩溃,服务就要挂了。 另外Node.js也不适合做CPU密集型的服务。
但是,所有所有的Node.js的劣势,在目前看来,社区都已有有了成熟的方案去处理。
针对单进程单线程的进程监控与管理,有以下方案
• https://github.com/foreverjs/forever
• https://github.com/Unitech/pm2
• http://strong-pm.io/
针对CPU密集型
• https://github.com/Microsoft/napajs
• Node dependencies[3]
• v8 十年[4]
• Lars Bak:Google Chrome浏览器背后的天才[5]
• Chrome_V8[6]
• The Node Ahead: JavaScript leaps from browser into future[7]
• V8 十年故事:从农场诞生的星球最强 JS 引擎[8]
• History of Node.js on a Timeline[9]
• A brief history of Node.js[10]
[1] node-chakracore https://github.com/nodejs/node-chakracore
[2] Couchbase Server https://en.wikipedia.org/wiki/Couchbase_Server
[3] Node dependencies https://nodejs.org/en/docs/meta/topics/dependencies/
[4] v8 十年 https://v8.dev/blog/10-years
[5] Lars Bak:Google Chrome浏览器背后的天才 http://www.kuqin.com/itman/20090421/47185.html
[6] Chrome_V8 https://en.wikipedia.org/wiki/Chrome_V8
[7] The Node Ahead: JavaScript leaps from browser into futurehttps://www.theregister.co.uk/2011/03/01/the_rise_and_rise_of_node_dot_js?page=4
[8] V8 十年故事:从农场诞生的星球最强 JS 引擎 https://www.infoq.cn/article/v8-10-years
[9] History of Node.js on a Timeline http://timeline.knightlab.com/
[10] A brief history of Node.js https://flaviocopes.com/node-history/