这是我参与「第五届青训营」伴学笔记创作活动的第13天
前言
也许在日常前端开发中并不经常用到Node,那为什么还要学习呢?其实并不是说一定要学习node,而是为了职场更好的发展,尤其是为了学习更高级的编程思维,学习node很有必要。
为什么学习Node.js
- Node.js最根本的能力是让js能够脱离浏览器运行,学好node,可以让自己不再是一个“纯前端”
- 学习nodejs是进行前端工程化的基础(NodeJS Stream)
- 学好node,可以编写服务端API,实现独立开发项目
- 作为中间层(位于服务器与客户端之间的应用层)
Node.js介绍
Node.js是JavaScript语言的服务器运行环境
用官方话来说就是:一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。
事件驱动:事件驱动就是当进来一个新的请求的时,请求将会被压入一个事件队列中,然后通过一个循环来检测队列中的事件状态变化,如果检测到有状态变化的事件,那么就执行该事件对应的处理代码,一般都是回调函数。
非阻塞异步: Node.js 采用了非阻塞型 I/O 机制,在做 I/O 操作的时候不会造成任何的阻塞,当完成之后,以时间的形式通知执行操作。
Node.js中的npm
npm(node package manager)是Node的包管理工具,能解决NodeJS代码部署上的很多问题npm里面有接近60万个别人已经写好的包。到目前为止,npm差不多收集了60万个别人写好的包,其实每个包就是一个功能,一个需求,npm里面有关于创建服务器的包,启动电脑摄像头的包,如果正好我们有这些需求,那么我们就没必要自己去写代码,完全可以用别人已经写好的包。
为什么用Node.js
javaScript语言本身是完善的函数式语言,在前端开发时,开发人员往往写得比较随意,让人感觉JavaScript就是个“玩具语言”。无法像其他编程语言一样满足工程的需要。
但是,在Node环境下,通过模块化的JavaScript代码,加上函数式编程,并且无需考虑浏览器兼容性问题,直接使用最新的ECMAScript 6标准,可以完全满足工程上的需求。
Node.js的应用场景
前端工程化
- Bundle: webpack, vite, esbuild, parce
- Uglify: uglifyjs
- Transpile: bablejs, typescript
- 其他语言加入竞争:esbuild,parcel, prisma
- 现状:难以替代
Web服务端应用
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟 (npm,V8 inspector)
- 与前端结合的场景会有优势(SSR)
- 现状: 竞争激烈,Node.js 有自己独特的优势
Electron跨端桌面应用
- 商业应用: vscode,slack,discord,zoom
- 大型公司内的效率工具
- 现状:大部分场景在选型时,都值得考虑
Node.js运行时的结构
- V8:JavaScript Runtime,诊断调试工具(inspector)
- libuv: eventloop(事件循环),syscall (系统调用)
- 举例: 用 node-fetch 发起请求时