[ Node.js的应用场景 上 | 青训营笔记]

170 阅读4分钟

这是我参与「第五届青训营」笔记创作活动的第十五天

Node.js的应用场景

前端工程化 (Node.js的出现促进了前端工程化)

​ 其它语言加入竞争: esbuild (Go), parcel (Rust), Prisma (基于Node.js 但好像不是打包工具 是Node.js ORM)

Web服务端应用

​ Node在这方面的优势:

  • Node.js作为一门不需要编译环境的语言,它的运行效率比较高,在脚本语言中是处于前列的,甚至可以用它去比肩一些需要编译的语言

  • Node在传统后端语言的经典应用场景,很多包的成熟度是不如传统后端语言的 (即没有优势)

  • V8 inspector 和 浏览器上的chrome dev tools是同一套东西,降低了学习成本

前置知识补充:什么是脚本语言

我想许多人并不是困惑脚本语言和非脚本语言的不同,而是困惑脚本语言为什么叫脚本语言。脚本是由script翻译来的,这个词在用到计算机前的意思是剧本,现在把script还原到原有的意思——“剧本”来理解其在编程中的延伸意义。(脚与非脚的不同在于执行之前是否需要编译)我们可以把“编译”对应到制作电影时的“拍摄”,就是由源代码生成可执行程序的过程。脚本语言不需要编译,即这个剧本不需要拍摄成电影,一句一句“解释”着执行就可以了。(引用自 www.zhihu.com/question/22…

Electron跨端桌面应用 (Electron等)

优势:

  • ROI (Return On Investiment) 比较高
  • 多端无需编写多套代码

劣势:

  • performance没有原生语言高

BFF(Backends For Frontends): 谁需要谁开发,在字节是底层的后端是后端来开发,然后涉及到接口的拼接,裁切等,则是端开发者自己来开发

Node.js运行时结构

基本结构
  • 通过Npm引入的包,也算是用户代码的一部分
  • Node.js Core (JavaScript)偏上层, Node.js Core (C++) 偏底层,比如说HTTP模块,偏上层提供的是API等,而偏下层则会去调用底层的接口等
  • N-API -> 比如说我们在性能方面遇到了瓶颈,JavaScript无法满足我们的需求,我们需要一种更直接的方法与native 语言打交道,这时我们就会用上N-API
  • libuv -> 封装了操作系统API,提供了核心的Event Loop
  • zlib -> 做一些常见的压缩与解压缩的算法
  • c-ares -> DNS查询的一个库
  • llhttp -> http的一个解析
  • Openssl -> 网络层面上的加密解密工具

这里使用node-fetch举例:

  • 客户端 到 服务器端:

npm(下载node-fetch) -> 用户代码 -> Node.js Core (JavaScript) -> Node.js Core (C++) -> llhttp (序列化 反序列化等) -> llibuv (建立 TCP 连接等) -> 发送到服务器端

  • 服务器端 到 客户端:

把上面的步骤反过来

结构带来的特点 (可以是优点 也可以是缺点)
  • 异步IO 这里是和EventLoop相关,有兴趣的可以了解

  • Node.js 是单线程的,可能不是很适合做CPU密集型的工作,但从Node v12开始,就可以另起独立线程了,但由于新线程 和 你主线程是没有太大区别的,都是有一个V8Engine示例,独立的EventLoop,所以使用起来可能与主线程差别不大

    注意:这里的单线程实际上指的是JavaScript的主线程是单线程的

    • uv线程池 大部分系统读文件时,都是同步的系统操作,Node.js为了不阻塞后面的操作,会把这个读的操作交给 (lib)uv的线程池去操作,这样JavaScript的主线程就可以做其它的事情。(默认下,uv会起4个线程作为线程池来完成这些操作,包裹一些对CPU消耗比较大的底层操作,比方说加密解密)
    • V8 Inspector线程,比方说我们写的代码是个死循环,为了调试它,我们肯定不能使用这个已经陷入死循环的线程,所以要把调试跑在另外一个线程上
  • 不用太担心跨平台,Node已经帮你做了大部分这方面的工作了,比如说在Linux 或 windows上读一个文件,虽然底层调用的API不一样,但你写的代码是一样的

注:大部分!!!!