Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

技术之巅:Node.js简明史 #214

Closed
wangduanduan opened this issue Mar 18, 2019 · 0 comments
Closed

技术之巅:Node.js简明史 #214

wangduanduan opened this issue Mar 18, 2019 · 0 comments

Comments

@wangduanduan
Copy link
Owner

wangduanduan commented Mar 18, 2019

《JavaScript高级程序设计》的作者在书中写道:要想全面理解和掌握JavaScript, 关键在于弄清楚它的本质,历史,和局限性。我想:对于想深入学习Node.js的人来说,必然也要弄清楚它的本质,历史和局限性。

编程圈喜欢比来比去,这个语言怎么怎么好,那个语言的缺点怎么怎么样的。小学生才讲好坏,大人只谈利弊。老板并不会因为你会某某很火的语言就给你加工资。使用某种语言,和要取决于很多因素,公司大小,公司技术栈,项目开发周期等很多因素有关。

与其去关注某一门语言缺点,不如去深入掌握一门语言的优点。和美国总统比说中国话,赢了又有什么意义呢?

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这个项目,其实也是也是一个Node.js,只不过它使用了微软的ChakraCore js引擎。

那么Node.js究竟是什么?

我的个人见解是:Node.js是一系列优秀项目的封装。

Node.js上层提供了核心的模块,例如http, fs, buffer。中间层是一层绑定。下层是各个非常牛叉的项目。下面就请Node.js背后的项目

Jietu20190320-124907@2x

V8

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中。

libuv

Node.js中非阻塞IO, 都是利用libuv的能力。libuv还提供了fs, DNS, 网络, 子进程, 管道, 信号处理, 流处理等等。

image

其他

  • http-parser 负责处理http解析
  • c-ares 负责DNS相关
  • OpenSSL 负责加密解密
  • zlib 负责压缩解压

很多人在学习Node.js时,经常会有已经错误的倾向。NPM中有很多优秀的包,新手门往往被眼花缭乱的各种包诱惑的头晕目眩,而忽视了这些包背后的Node.js runtime。

Node.js 历史

  • 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,都会觉得Node.js单进程,单线程,不能充分利用CPU资源,而且一旦线程崩溃,服务就要挂了。
另外Node.js也不适合做CPU密集型的服务。

但是,所有所有的Node.js的劣势,在目前看来,社区都已有有了成熟的方案去处理。

针对单进程单线程的进程监控与管理,有以下方案

针对CPU密集型

参考

@wangduanduan wangduanduan added this to the 技术之巅 milestone Mar 27, 2019
@wangduanduan wangduanduan changed the title Node.js十年:十年之前,我不认识你 技术之巅:Node.js简明史 Mar 27, 2019
@wangduanduan wangduanduan reopened this May 16, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant