这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
文学跨行,从后端到算法,从算法到前端,诸君且听我吟唱当今前端魔法,有赞捧个赞场,没赞捧个夹灰场。
许久没有更文了,前两天思考了下接下来更新内容的主要方向,考虑到在新公司 Node 发挥了极为重要的作用,作者之前 Node 经验仅限于 Demo 层,所以决心从夯实 Node 基础开始,自我系统梳理和学习 Node 相关知识,希望整理下来能够和诸君共同进步,互勉。(第一篇通常要 BB 叨下学习背景
每篇内容不多,多为罗列和引用,一定能看完。。。
大纲
-
Node 可以做什么
-
Node 依赖和架构
Node 对于前端进阶重要性和必要性就不多说了,简单列下 Node 可以做什么。
Node 可以做什么?
-
Node 可以实现 轻量级、高性能的 Web 服务
-
Node 可以实现 前后端同构 JavaScript 开发
-
Node 可以实现 便捷高效的前端工程化
说明:梳理过程中会顺便理清一些相关的问题
为了打下扎实的 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(* ̄▽ ̄*)ブ
参考: