Node.js入门篇 | 青训营笔记

96 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天,今天介绍的是Node.js入门知识

Node.js应用场景

1、前端工程化

(1)前端工程化是什么?

在项目过程中利用各种技术和工具来解决问题,就是前端工程化

(2)两个问题

问题1 :前端工程化需要什么技术(technology)和工具(tool)?

e2e6a6db754f425cb672312d72a94151.png

问题2:前端工程化解决什么问题(problem)?

项目上线前要压缩代码。这样会项目运行过程中节省带宽和传输体积。

统一代码风格。每个程序员都有自己代码风格,在上线前需要统一

解决兼容性问题。比如ES6,CSS3的转换成,低版本浏览器也可以兼容的代码

对预编译语言进行处理。类似于Less,浏览器不支持less

以上所有的技术和工具都逃不过一个运行环境node.js

2. web 服务端应用

在web服务端开发中,传统的后端语言有很多,比如java,而node.js最大的特点优势在于

  • 1、学习效率平缓,开发效率高
  • 2、运行效率接近常见的编程语言
  • 3、社区生态丰富及工具链成熟(npm,V8 inspector)
  • 4、与前端结合的场景会有优势(SSR)

3. Electron 跨端桌面应用

  • 商业应用:vscode, slack, discord, zoom等等的桌面应用都是用Electron开发的
  • 大型公司的效率工具,大部分都是基于 Electron 做的

Node.js运行时结构

结构

image.png

  • V8:JavaScript Runtime,诊断调试工具(inspector)

  • libuv:eventLoop(事件循环),syscall(系统调用)

  • eg:用 node-fetch 发起请求时...

解释:结合上图阐述 node-fetch 是如何运行的

用 node-fetch 发起请求时,首先通过npm安装node-fetch模块,之后在用户代码里面调用node-fetch模块,这些代码会在V8中执行,那么node-fetch执行是调用底层http模块(Node.js Core(JavaScript)),再去调用更底层的Node.js Core(c++),之后可能调用llhttp去做http的序列化与反序列化,然后把得到的数据再通过libuv,可能调用TCP连接,再把这个数据发给远端,远端返回数据,在事件循环中得到这个数据,在把拿到的数据给llhttp解析出来,得到的数据返回给Node.js Core(JavaScript),最后送到用户代码从而得到最终的数据。

Node.js运行时结构特点

1. 异步I/O

场景分析

image.png

当调用异步API(fs.readFile())读取文件时,会把读取文件的操作交给libuv的线程池去做,此时就不用等到文件读取完,就可以做其他调用,之后文件读取的操作从node线程处理完返回给主线程执行回调,然后在做其他事情。那么异步I/o的好处是什么呢?、

异步I/O好处: 当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外的内存等待

2. 单线程

(1) js单线程

实际:JS线程+ uv线程 +V8任务线程池 + V8 Inspector线程

  • 优点:不用考虑多线程状态同步问题,也就不需要锁🔒;同时还能比较有效的利用系统资源

  • 缺点:阻塞会产生更多的负面影响

3. 跨平台

(1) 跨平台(大部分功能,api)

Node.js跨平台+JS无需编译环境(+web跨平台+诊断工具跨平台)

(2) 开发成本低

总结

Node.js是服务端语言的新新之秀,从时间成本上说,学好Node.js是前端工程师的不二之选,最后,让我们一起持续学习,共同进步吧~