Node.js 与前端开发实战|青训营笔记

110 阅读3分钟

Node.js 与前端开发实战

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

Node.js 的应用场景

前端工程化

  • 早期的jQuery等库都是直接在页面中引入,后来模块化逐渐成熟,Node.js赋予了开发者在浏览器外运行代码的能力,前端逐渐模块化

  • Bundle:webpack、Vite、esbuild、Parcel等

  • Uglify:UglifyJS

  • Transplie:babeljs、TypeScript

  • 其他语言加入竞争

    • esbuild、Parcel 、prisma等
  • 现状

    • Node.js难以替代

Web服务端应用

  • 学习曲线平缓,开发效率较高

  • 运行效率接近常见的编译语言

  • 社区生态丰富及工具链成熟

    • npm,V8 inspector
  • 与前端结合的场景会有优势

    • SSR,同构前端应用。 编写页面和后端数据的获取和填充都由 JavaScript 来完成
  • 现状

    • :竞争激烈,Node.js 有自己独特的优势

Electron跨端桌面应用

  • 商业应用: vscode、slack、discord、zoom

  • 大型公司内的效率工具

  • 现状

    • 大部分场景在选型时,都值得考虑

Node.js运行时结构

  • N-API:用户代码中利用npm安装的一些包

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

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

  • 举例

    • 用node-fetch发起请求时
    • 整个过程中底层会调用非常多的c++代码

特点

  • 异步I/O

    • 读取文件时。当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待。
  • 单线程

    • worker_thread可以起一个独立线程,但每个线程的模型没有太大变化
  • JS单线程

    • 实际:JS线程 + uv线程池(4个线程) + V8任务线程池 + V8 Inspector线程
    • 优点:不用考虑多线程状态同步问题,也就不需要锁。同时还能比较高效地利用系统资源
    • 缺点:阻塞会产生更多负面影响、异步问题、延时有要求的场景需要考虑
    • 解决办法:多进程或多线程
  • 跨平台(大部分功能、api)

    • Node.js跨平台 + JS无需编译环境(+ Web跨平台 + 诊断工具跨平台)= 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低

编写Http Server

Hello World

image.png

Json

image.png

Client

image.png

延伸话题

快速了解Node.js代码

  • 好处

    • 从使用者的角色逐步理解底层细节,可以解决更复杂的问题,
    • 自我证明,有助于职业发展;
    • 解决社区问题,促进社区发展
  • 难点

    • 花时间

编译Node.js

  • 为什么要学习编译Node.js

    • 认知:黑盒到白盒,发生问题时能有迹可循
    • 贡献代码的第一步
  • 如何编译

    • ./configure &&make install
    • 演示:给net模块添加自定义属性

诊断/追踪

  • 诊断是一个低频、重要同时也相当有挑战的方向。是企业衡量自己能否依赖一个门语言的重要参考。

  • 技术咨询行业中的热门角色

  • 难点:

    • 需要了解Node.js底层,需要了解操作系统以及各种工具
    • 需要经验

WASM, NAPI

  • Node.js(因为V8)是执行WASM代码的天然容器,和浏览器WASM是同一运行时,同时Node.js支持WASI。
  • NAPI执行C接口的代码(C/C++/Rust…),同时能保留原生代码的性能。
  • 不同编程语言间通信的一种方案。