背景:

最近在各种社区看到很多同学在咨询“作为前端Node应不应该学”,“Node应该怎们学”,这里就我自己的学习经历做一个总结,来社区的同学交流下,希望能帮到一定层级的同学

Node是啥

Node是JavaScript的一种宿主环境,为JS提供了一种runtime环境,就像浏览器一样,我们写的JS可以在这种环境下跑起来;

Node是单线程,异步I/O的

我们总是会在社区看到一种说法:“javascript是单线程的”对吧,其实这是不对的,javascript也可以多线程执行,是执行javascript的数组换进提供的是单线程,异步的实现机制,这才是底层理解 与浏览器不同,Node实现了更多的与操作系统交互的API(例如:进程控制,文件操作,网络编程等)

Node有啥作用

常规:

1.前端工程基建:我想作为前端工程师,你一定熟练使用Vue和react等各种本地开发环境,npm start或者npm run dev后,本质就是起了一个node的本地server,同时webpack等的打包工具一样使用了Node文件操作能力

2.后端能力:说到后端,我想,很多前端同学一定是对后端有憧憬的,希望自己不仅仅是一个切图仔,希望能拥有后端能力,Node是可以做到的,但是要看使用场景,其适合高网络I/O,不适合高计算I/O。应用场景典型的有:ssr,bff,serverless等等,比较浅的后端服务,直接用Node也不是不可,看个人或者公司需求

兴趣:

3.树莓派上跑Node,也是一个不错的选择,之前我在树莓派上跑了一个服务,用来分发信号数据

4.发上天的特斯拉的大屏也是node的吧😁

5.有个叫做NodeOS的玩意儿,要用Node搞一个操作系统,我看了下,现在只是命令行,快去提交PR,搞个界面啊😁

0基础Node怎么学习(按照我的这个来,不走弯路)

1.javacsript是你必须学会的,这是编写Node应用的基础

2.浏览Node中文官网,把中文字的看一下,先理解Node是个啥,然后,去学两个核心模块http和fs,并用这两分别起一个本地网络服务和文件读写服务,这两搞头,恭喜你,hello word完成了

3.这个时候,你可以选择两个方面继续学习 1.应用出发 2.继续模块学习,或者,这两并行,去买本书《Nodejs实战》随便哪卷都可以,里面全是讲应用的,买回来,挨着看,比较简单,自己动手实现,实现的过程中,不断补齐node的模块

4.完成《Nodejs实战》书籍阅读后,你应该会接触到很多框架,最多的应该是Express,其次koa,这个时候,去看express和koa的官网,学习这两,这两的官方文档,是我觉得写的不错的文档,我很不理解一些东西官方文档为什么写的那么晦涩难懂。框架的话,别搞太多,什么egg,nest等等都是企业级别的封装,有各种中间件,是为了更好的为企业服务,了解就可以了

5.接下来你就可以深入Node底层了,去买本书《Nodejs深入浅出》比较老了,但是对Node底层基础还是写的比较可以的,这本书要坚持挨着看完,看完后,你会感谢我的

6.这个时候,你应该对上层应用和底层原理有了四知五解了,还想继续深入,就需要选定具体方向了,我目前可能也就到这个层面了,可以选择继续阅读源码等,可以选择大型Node应用的集群调优等等,各种应用等着你玩

7.到这里,来找我私聊吧,我也不知道要继续搞啥了,要不一起来搞deno? 一起写个oka?哈哈哈

我理解的Node优势

Node是单线程,异步I/O的,其优势就是异步I/O和异步编程,说到异步编程,我相信这对于除开javascript以外的众多语言都是比较陌生的,而且在绝大多数高级编程语言中,异步貌似不太被采纳,大多数都喜欢利用从头到脚同步阻塞的方式来执行,例如:PHP(哈哈哈,天下最好的语言),当然这样利于逻辑的理解与实现,但是在复杂的应用中,阻塞那是不能想象的,可能你会说,我多线程啊,再进行线程通信不就好了,继续看,看到这篇博客的人,一定是用过nginx的,为什么nginx会有如此高的性能表现,这得益于事件驱动,异步I/O的架构设计,在进行I/O的过程中,不用等待着上一个I/O执行完成才进行下一个步骤的执行。而Node的设计就与Nginx的事件驱动、异步I/O架构不能说一模一样,但也90%一样了。

前面我在吐槽PHP没有异步I/O不能承载高并发应用时,PHPer会说,我为什么不能多线程并行执行来提高并发的能力,为什么非要异步I/O尼,无可厚非,如果创建多线程的开销小于并行执行的开销,那肯定多线程是首选,但是多线程就意味着你需要创建多个线程并且在多个线程之间来回切换会带来巨大的开销,通常来说,遇见比较复杂的应用,你还需要做到锁的应用,以及状态同步等问题,那么,异步I/O就能很好的解决这样的问题,利用单线程,远离多线层死锁、状态同步等问题,远离阻塞,更好的利用CPU等。

Node异步I/O是如何实现的尼?

image.png 如上图,异步I/O的精髓在于,单线程进行I/O处理时,并不会阻塞其它指令的执行,在完成处理后,通过callback完成数据返回。虽然上文一直在说异步与同步,但是对于操作系统内核来说,处理I/O只有阻塞与非阻塞之分,阻塞I/O就是调用I/O处理之后一定要等到系统内核层面完成操作后,调用才结束,才能往下执行,这就会造成CPU等待I/O执行完成,造成CPU使用空余,效率低下,而操作系统利用轮询实现的非阻塞I/O能够通过一系列机制来改善阻塞I/O,提升CPU使用效率及性能,这里我画图总结一下。应该来的更明显直观:

image.png

image.png 操作系统通过轮询实现的非阻塞调用,能够在貌似异步的情况下取的完整的I/O数据,但是对于应用程序而言,依然是同步的,因为CPU还是需要等待I/O的完全返回。理想的非阻塞异步I/O应该是应用程序发起非阻塞调用,而不是通过一些轮询,遍历机制来实现一种伪异步,现实中,实现真正的应用程序调用异步,使用了线层池方案,通过让部分线程进行阻塞I/O或者非阻塞I/O加轮询完成数据的获取,让一个线程来进行计算处理,通过线程间通信将I/O线程获取的数据进行传递,实现异步I/O。这也是Node实现的异步I/O的底层方案。

image.png 当然,Node实现了跨平台的异步I/O,开发者在*nix及windwos异步I/O之上实现了Libuv来实现跨平台,linux平台自己实现了异步I/O,windows则采用了iocp实现,所以,我总说Node是机制创新,底层还是得益于C++的线程池异步I/O带来的高性能

image.png

结论

我是鲍师傅的铜锣烧,拒绝搬运,坚持学习,坚持原创,关注我,期望大家一起学习,一起变优秀,加油~

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐