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

102 阅读3分钟

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

Node.js的应用场景

  • 前端工程化:早期ajax,jquery比较流行的时候,我们直接在页面中引入需要的ib即可。后续随着模块化、transpile逐渐成熟、需求逐渐增多,对后端能力的需求也逐渐强烈。反过来说,也正是Node,js赋予了js开发者在浏览器外运行代码的能力,加速催生了这些项目的出现。
  • Web服务端应用:第二个常见的场景是使用Node.js开发Web服务端应用,也就是后端服务。
  • Electron跨端桌面应用:这里不只是指electron,还包括nwjs;这个场景在较大的企业里面非常常见。

Node.js运行时结构

image.png

从上往下,是用户的表层代码,包括npm包管理工具的部分包,诊断调试工具inspector,acron解析。然后通过Node.js的js代码,还有Node自带的部分api代码,比如fs ,http模块。往下由Node.js的底层c++语言处理。最后由浏览器等底层内容渲染展示使用。
  • V8.:JavaScript Runtime,诊断调试工具(inspector)
  • libuv:eventloop(事件循环),syscall(系统调用)
  • 举例:用node-fetch发起请求时

特点

  • 异步I/O:当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞进程。
  • 单线程:JS单线程 实际:JS线程+uv线程池+V8任务线程池+V8 Inspector线程
    • 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源:
    • 缺点:阻塞会产生更多负面影响 解决办法:多进程或多线程
  • 跨平台:Node.js跨平台+JS无需编译环境(+Web跨平台+诊断工具跨平台)
    • 开发成本低(大部分场景无需担心跨平台问题整体),学习成本低

拓展

Node.js贡献代码

  • 好处:从使用者的角色逐步理解底层细节,可以解决更复杂的问题 自我证明,有助于职业发展 解决社区问题,促进社区发展
  • 难点:花时间,底层内容较多

编译Node.js

为什么要学习编译Node.js

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

诊断/追踪

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

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

难点:

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

WASM,NAPI

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

总结

学习了部分Node.js的内容后,深刻的了解到,前端工程化的强大以及Node.js的革新性,它给前端带来的不仅是强大的功能,还给前端的发展带来了无限的可能。