这是我参与「第四届青训营 」笔记创作活动的的第5天,今天介绍的是Node.js入门知识
Node.js应用场景
1、前端工程化
(1)前端工程化是什么?
在项目过程中利用各种技术和工具来解决问题,就是前端工程化
(2)两个问题
问题1 :前端工程化需要什么技术(technology)和工具(tool)?
问题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运行时结构
结构
-
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
场景分析:
当调用异步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是前端工程师的不二之选,最后,让我们一起持续学习,共同进步吧~