【徐徐图之】(一)NodeJS 基础/依赖/架构

142 阅读3分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

文学跨行,从后端到算法,从算法到前端,诸君且听我吟唱当今前端魔法,有赞捧个赞场,没赞捧个夹灰场。

      许久没有更文了,前两天思考了下接下来更新内容的主要方向,考虑到在新公司 Node 发挥了极为重要的作用,作者之前 Node 经验仅限于 Demo 层,所以决心从夯实 Node 基础开始,自我系统梳理和学习 Node 相关知识,希望整理下来能够和诸君共同进步,互勉。(第一篇通常要 BB 叨下学习背景

每篇内容不多,多为罗列和引用,一定能看完。。。

大纲

  • Node 可以做什么

  • Node 依赖和架构

      Node 对于前端进阶重要性和必要性就不多说了,简单列下 Node 可以做什么。

Node 可以做什么?

  • Node 可以实现 轻量级、高性能的 Web 服务

  • Node 可以实现 前后端同构 JavaScript 开发

  • Node 可以实现 便捷高效的前端工程化

为什么要做同构

同构和 SSR 有什么区别

说明:梳理过程中会顺便理清一些相关的问题

      为了打下扎实的 Node 功底,我们需要先行了解 Node 的依赖和架构。

Node 依赖和架构

  • Natives modules(第一层)

  • 以 JavaScript 形式提供的模块

  • 内置的核心模块,开发者可以直接调用,通常 require 导入的包都在这块:fs、path、http 等

  • JS 是无法直接操作底层硬件设置的,所以会出现下面几层

  • Builtin modules(第二层)

  • 胶水层,让 Natives modules 的模块得到能力支持,去完成底层操作

  • 以 C++ 形式提供的模块

  • 有些模块虽然表面上我们是使用 require 导入包和调用方法来实现的,但实际这些包的底层能力是使用 C/C++ 实现的,Builtin modules 能够帮助我们找到 JS 包对应的调用的 C/C++ 底层实现

  • 具体的功能模块(第三层)

  • 如:V8、Libuv 等功能模块,被 Builtin modules 调用执行

  • V8:主要用于执行 JS 代码,把 JS 代码转换为可以在各个平台上运行的机器码,构建 JS 运行环境

  • Libuv:完善代码执行过程中的细节处理,如事件循环、事件队列、异步 IO 都是 Libuv 实现的(回调函数是在 Libuv 触发的),再如调用平台和机器的系统特性:操作文件、监听 socket

  • V8 和 Libuv 是最大的两个依赖

  • 其它功能模块:zlib(快速的压缩和解压缩)、http_parser(HTTP 解析器)等

  • 总结

  • 我们导入方法调用时,会自上而下贯穿三层,JS 直接调用 native modules 层,通过 builtin modules 层将代码基于 V8、Libuv 等其它模块执行和调用,再自下向上回溯触发回调函数

篇尾知识小彩蛋

      1. 在 Node.js 中,可以毫无问题地使用新的 ECMAScript 标准,因为你不必等待所有用户更新他们的浏览器,你负责通过更改 Node.js 版本来决定使用哪个 ECMAScript 版本,你还可以通过运行带有标志的 Node.js 来启用特定的实验性功能。
2. 由于 Web 运行环境的安全性考虑,运行在浏览器的 JavaScript 有许多的局限性,而为了使其在更广泛的环境里可以使用,Node 补充了这部分功能
3. 存在一个文件:“js2c.py”, Python 实现了将一部分 JS 转为 C 的能力

知识梳理过程中会进行修改更新 o(* ̄▽ ̄*)ブ

参考: