之前知识星球有同学问道了这样一个问题:Node 环境和浏览器环境有什么区别?这样的思考很值得鼓励,在对比中学习,很容易将一个抽象的知识具象化。当时的回答只是简单的画了个图,感觉有必要用此文来深入挖掘一下

二、什么是前端,什么是后端?

想必没有哪个同学不知道,Node 将 Js 扩展到了后端,虽然前端与后端在猿界是高频词汇,恐怕也未必能回答清楚什么是前端,什么是后端这个问题?

存在于每个同学的潜意识里的答案:Web 前端指的是用户看得见摸得着的东西,包括 UI 层面以及 Web 层面的交互实现;后端更多的是与数据库进行交互以处理相应的,实现功能、数据的存取、平台的稳定性以及性能等等

我想说的是一个通信层面上的区分, Web 应用基本上是基于 HTTP/HTTPS 构筑的,前端(或者我们延伸到大前端:Android、IOS、浏览器等多端)作为 HTTP/HTTPS 的 Client 端,而后端则作为协议的服务端

结合上述两点,可以简单的画一个图:

有可能要被吐槽的图

通过这个对比来服务于我们对于 Node 的理解,运行在浏览器的 Js 主要是操作 Dom (UI 层面),以及作为 HTTP 客户端操作网络通信。而扩展到服务器端的 Node,能力不再受浏览器沙盒的限制,可以启动 HTTP 服务(以及 WebSocket 等各种服务),可以操作数据库、轻松读写磁盘文件,等等等等

三、Node 和浏览器的组件构成对比

抄袭自 Node 深入浅出的图

是时候祭出用来回答开篇提到的知识星球问题的图了,在 Node 横空出世之前,Js 的主要运行环境是浏览器(Android/IOS 中的 WebView 也是浏览器),浏览器主要由布局引擎(也就是我们常常说的浏览器内核)和Javascript 引擎组成,拿 Chrome 浏览器来说,它的布局引擎是 WebKit(高版本的已经换成 Blink),布局引擎的主要作用就是解析 Html Dom 和 Css 样式规则;Javascript 引擎是 V8,顾名思义,Javascript 引擎的作用当然是编译执行 javascript

相比之下,Node 就不需要布局引擎了,毕竟不需要渲染界面,所以在 Node 中是没有 Window 对象的,因为它木有 Dom、Bom 的 api。注意到图中左右皆有中间层,但是它们并不一样,前者基于浏览器的沙盒,后者基于 libuv,在 IO 读写上的能力是不一样的,例如:在 Node 上可以轻松的读写磁盘文件,但是在浏览器中,麻烦到怀疑人生

至于 V8,已经超出了我能详细讲解的能力范围,但是 V8 作为一个开源的 Javascript 引擎,你可以很方便在你的应用中调用,举个栗子:

#include <v8.h>
using namespace v8;
int main(int argc, char *argv[]) { // 创建一个句柄作用域 ( 在栈上 ) HandleScope handle_scope; // 创建一个新的上下文对象Persistent<Context> context = Context::New(); // 进入上一步创建的上下文,用于编译执行 helloworld Context::Scope context_scope(context); // 创建一个字符串对象,值为'Hello, Wrold!', 字符串对象被 JS 引擎// 求值后,结果为'Hello, World!'Handle<String> source = String::New("'Hello' + ', World!'"); // 编译字符串对象为脚本对象Handle<Script> script = Script::Compile(source); // 执行脚本,获取结果Handle <Value> result = script->Run(); // 释放上下文资源context.Dispose(); // 转换结果为字符串String::AsciiValue ascii(result); printf("%s\n", *ascii); return 0;
}复制代码

可以用一句话来概括上述使用 C++ 编写的 V8 调用实例:将 Js 代码(字符串形式),丢到 V8 中执行并返回执行结果。这是最简单的 V8 调用模板,要知道,Node 也是使用 C++ 基于 V8 写出来的,通过这个例子,是否对 Node 有多一点点的认识呢?

四、类比 Java 虚拟机

对 Java 有一定了解的同学,对它的跨平台特性肯定耳熟能详,这得益于它的虚拟机,什么是虚拟机?这又可以通过 Node 环境来帮助理解

Node 刚开始并没有 Windows 版本,知道 2011 年 7 月,Node 在微软的帮助下发布了 Windows 版本,从而实现了跨平台。兼容 Windows 和 *nix 平台主要得益于 Node 在操作系统与上层模块之间构建了一层平台架构层,也就是第三节中的中间层,也即 libuv。libuv 是许多系统实现跨平台的基础组件,感兴趣可以去了解下(具体的我也说不清楚了~~)

回到什么是虚拟机的问题,莫不过是在系统于上层模块之间架设的一套 IO 桥阶层

五、总结

不要给自己的知识领域设定边界~~

菲麦前端 是一个让知识深入原理的知识社群,我们有 知识星球、公众号以及群,欢迎加微勾搭:facemagic2014

在对比中理解 Node相关推荐

  1. 深入理解 Node.js 中的 Worker 线程

    多年以来,Node.js 都不是实现高 CPU 密集型应用的最佳选择,这主要就是因为 JavaScript 的单线程.作为对此问题的解决方案,Node.js v10.5.0 通过 worker_thr ...

  2. 理解Node.js(译文)

    前言 总括 :这篇文章十分生动形象的的介绍了Node,满足了读者想去了解Node的需求.作者是Node的第一批贡献者之一,德国前端大神.译者觉得作者的比喻很适合初学者理解Node,特此翻译. 译者 : ...

  3. 记ByteCTF中的Node题

    记ByteCTF中的Node题 我总觉得字节是跟Node过不去了,初赛和决赛都整了个Node题目,当然PHP.Java都是必不可少的,只是我觉得Node类型的比较少见,所以感觉挺新鲜的. Nothin ...

  4. 理解node.js(Understanding node.js)

    因为最近自己在学习node.js,刚开始学.看到这篇文章挺有意思,介绍了一下node.js有助于理解基于事件驱动的回调,就翻译了一下. 英文原文: Understanding node.js 理解no ...

  5. 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)

    我的个人博客文章链接如下:学习通信原理之--从实验中理解频谱/功率谱/功率谱密度(MATLAB演示) 前言 最近在复习通信原理,每次到了功率谱这一块就感到困惑,每次都要去查,我觉得不能再这样循环下去了 ...

  6. 在 Chrome 开发者工具中调试 node.js

    命令行工具 devtool ,它可以在 Chrome 的开发者工具中运行 Node.js 程序. 下面的记录显示了在一个 HTTP 服务器中设置断点的情况. 该工具基于 Electron 将 Node ...

  7. MySQL 两种存储引擎:MyISAM与InnoDB对比及理解

    MySQL 两种存储引擎:MyISAM与InnoDB对比及理解 目前MySQL默认的存储引擎是InnoDB 现在大多数时候我们使用的都是InnoDB存储引擎,但是在某些情况下使用MyISAM更好,比如 ...

  8. 来自Android客户端什么意思,如何通过回调函数中的Node.js来自Android客户端

    我想从插座Android客户端将数据发送到服务器的Node.js .. 在服务器端做了什么香港专业教育学院:如何通过回调函数中的Node.js来自Android客户端 socket.on('new u ...

  9. dotNet 5 中执行 Node.js

    在低代码产品中为了扩展功能,我们在业务编排中会扩展代码块的功能,允许用户直接在界面中进行代码(Node.js. Python)的编写,来实现取数或者赋值的一些功能.本文简单介绍下在 dotNET 5 ...

最新文章

  1. R 语言 download.file 的几点知识
  2. 使用OkHttp3之Websocket实现长连接
  3. PyTorch中使用指定的GPU
  4. invoke方法_JVM是如何执行方法调用的?
  5. linux下文件的相关信息
  6. VRAR应该是工具,而不是“玩具”
  7. 拷贝sys文件到另一个服务器,服务器文件拷贝到其他服务器
  8. animate.css做点赞效果
  9. Atitit.Base64编码原理与实现设计
  10. Smart3D倾斜摄影建模教程
  11. LAMP兄弟连PHP高薪就业班2012召集令
  12. 无线传感网络技术论文笔记
  13. 深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法
  14. Gentoo 2005.1 完整的USE参数清单中文详解
  15. 智能合约隐私计算之同态加密应用举例
  16. 十进制数转换为二进制,八进制,十六进制数的算法(欢迎拍砖)
  17. rpm和yun的使用方法
  18. 淋巴瘤可以学计算机专业吗,淋巴瘤常用检查有哪些?各有什么作用?
  19. OSChina 周五乱弹 ——论HR的日常心塞
  20. 利用Ubuntu的U盘安装盘安装build-essential

热门文章

  1. python字符串转化为数字信号_用python实现简单的数字信号软件滤波处理
  2. Django运行服务报NameError: name ‘os‘ is not defined-已解决
  3. php curl加密获取数据,PHP利用Curl模拟登录并获取数据例子
  4. 我❤️—Python自动化测试,30岁熬到月薪20K+,分享我的多年面试经…
  5. vb设置excel 字体 加粗 微软雅黑_Python操作Excel的Xlwings教程(六)
  6. loadrunner遇到错误继续运行
  7. 《高性能MySQL》第5章 创建高性能的索引
  8. oracle+5秒钟一个间隔,ORACLE日期时间函数大全 (二)
  9. SVD decomposition and polar decomposition
  10. 3DShader之阴影贴图(Shadow Mapping)