首页 > 编程语言 >【个人前端笔记】Node.js技术架构

【个人前端笔记】Node.js技术架构

时间:2024-03-04 14:45:03浏览次数:34  
标签:Node node 架构 C++ JS http js

一:node.js不是什么
1.node.js不是web框架或后端框架
所以你不能把Node.js与Flask或Spring对比
2.node.js不是编程语言
node.js并不是后端的JS,它只是以.js做后缀的
所以你不能把Node.js与Python或PHP对比

二:node.js是什么
1.node.js是一个平台
它将多种技术组合起来
让Javascript也能调用系统接口、开发后端应用

2.node.js用到了哪些技术
V8引擎
libuv
由C/C++编写实现的c-ares(DNS解析)、http-parser(解析http)、OpenSSL、zlib(加密)等库

三:node.js技术架构

--------------------------------------------------------------------------------------------------------
|                                     Node.js API                                                      |
|                             http模块、fs模块、steram模块等                                             |
|------------------------------------------------------------------------------------------------------|
|           Node.js bindings                    |                   C/C++插件                          |
|            让JS和C/C++通信                     |                 自定义其他能力                        |
|-----------------------------------------------|------------------------------------------------------|
|     JS引擎     |   跨平台的异步I/O能力    |    DNS解析   |      加密解密     |        其他              |
|       v8      |         libuv           |    c-ares    |      OpenSSl     |  http_parser、zlib等     |
|-------------------------------------------------------------------------------------------------------

四:什么是bindings
1.背景
C/C++实现了一个http_parser库,很高效
你只会写JS,但是你想调用这个库
直接调用肯定是不能成功的,你需要一个中间的桥梁

2.bindings
Node.js用C++对http_parser进行封装,使它符合某写要求,封装的文件叫做http_parser_bindings.cpp
用node.js提供的编译工具将其编译为.node后缀的二进制文件
JS代码可以直接require这个.node文件,比如const xxx = require("xxx"),不需要写后缀
这样JS就能调用C++库,中间的桥梁就是bindings
由于Node.js提供了很多的binding,所以加个s
这就是bindings
注意:编译成.node文件不是必须的,可以是其他的任何可行方式

五:关于C/C++插件的自定义其他能力
比如某一天我想通过node.js使用一个C/C++的库,但这个库并没有被binding到node中
如果我们能写C/C++,我们可以手动的方式将其进行绑定然后通过node.js使用

六:libuv是什么
1.背景
FreeBSD系统上有kqueue
Linux系统上有epoll
Windows系统上有IOCP
Ryan(node.js作者)如果想用不同系统上异步I/O库就得需要为不同的系统写不同的版本
于是Ryan为了实现一个跨平台的异步I/O库,开始写libuv
libuv会根据系统自动选择合适的方案
2.功能
可以用于TCP/UDP/DNS/文件等的异步操作

七:V8引擎是什么
1.功能
将JS源代码变成本地代码(机器语言,也就是0101)并执行
维护调用栈,确保JS函数的执行顺序
内存管理,为所有对象分配内存
垃圾回收,重复利用无用的内存
实现JS的标准库,如数组的splice、sort等等

2.注意
V8不提供DOM API,于是document.createElment这些API无法在node.js上使用
V8本身是包含多个线程的,如垃圾回收就是一个线程
V8执行JS是单线程的,理论上node.js可以开启两个线程分别执行JS,但这两个线程并不是真正意义上的多线程,这两个线程之间毫无瓜葛
V8本身是自带eventloop的(浏览器用的就是v8的eventloop),但node.js并没有使用这个,而是使用的是基于libuv自己的eventloop

标签:Node,node,架构,C++,JS,http,js
From: https://www.cnblogs.com/icerain-black/p/18051768

相关文章

  • three.js导出场景内模型为glb,gltf
    使用three,导出当前场景内指定模型为glb,或者gltf格式import{GLTFExporter}from'three/examples/jsm/exporters/GLTFExporter.js'//导出模型为GLTFpublicexportGLTFModel(){letcurrSelectObj:THREE.Object3D=SMART.scene.children[2];//需要导......
  • JSON.parse解析字符串报错-SyntaxError: Unexpected token ‘ in JSON at position 报
    “SyntaxError:Unexpectedtoken’inJSONatposition”报错原因是因为解析的字符串对象中,JSON.parse无法识别;JSON.parse可以将标准的json类型数据转换为JavaScript对象,如果数据不是正确的json类型的数据则会控制台报错,可能会阻断代码的正常运行我们可以写一个函数来......
  • nodejs安装、编译、执行 & npm 使用
    前言全局说明nodejs安装&npm使用nodejs是一个解释器,只是它运行再后端,在命令行看到执行结果;如果用html+js写的页面用浏览器打开,那就是可以在前台看到js执行结果。一、官网官网:https://nodejs.org/文档:https://nodejs.org/en/docs/中文网:http://nodejs.cn/GitHub......
  • 【JS逆向百例】某词霸翻译逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • js页面当中没有写回车事件,但是有回车效果
    前两天遇到一个问题,研究了我很差事件。问题如下:页面只有一个文本框,没有写任何回车事件,但是点回车的时候,就会触发回车,回传页面。于是各种google,终于有了结果:如果表单里有一个type=”submit”的按钮,回车键生效。如果 表单里只有一个type=”text”的input,不管按钮是什么type,回......
  • 系统架构设计师学习(一)未来信息综合技术
    一、引言本来是想着按教材顺序来进行编写的,但是出于个人喜好,我阅读的第一章即本文所描述的未来信息综合技术走向,所以就按我阅读的顺序来进行整理了。2024年其实我个人感觉到非常大的危机了,不管是大环境还是AI对我们行业的冲击,我觉得有必要要重新审视当前的自己并做出一......
  • xlua - 增加lua-cjson库
    xlua貌似不支持单独动态加载cjson.dll,试了各种方式,都是会造成Unity闪退,也不知道原因。解决办法就是直接编译进xlua.dll 1)下载lua-cjson源码,并解压到xlua的build文件夹根目录GitHub-openresty/lua-cjson:LuaCJSONisafastJSONencoding/parsingmoduleforLua 2......
  • 【python接口自动化系列】python + pytest + requests + allure + jsonpath + pyyaml,
     前置基础:python虚拟环境的创建、操作、迁移等python操作yamlpython操作mysqlpytest简易教程 配套练习环境(含相关接口):https://www.cnblogs.com/uncleyong/p/17165143.html 如果文章不能访问,请联系处理,wx:ren168632201 python接口自动化系列(01):自动化测试框......
  • 阅读《架构漫谈》后对于架构的理解
    在信息技术日新月异的今天,软件架构作为连接业务需求和代码实现的重要桥梁,越来越受到业界的关注。我深入阅读了资深架构师王概凯所著的《架构漫谈》系列专栏,深感其对于软件架构的独到见解和深入剖析。本文将从对架构概念的理解、架构的重要性和实践方法等方面展开论述,旨在探讨如何......
  • Nestjs系列 Nestjs基础(二)
    providers使用该内容可以结合Nestjs中文网-自定义提供者查看创建一个nest项目,创建一个Personcrud模块。providers写法providers完整和简写@Injectable()装饰器将PersonService类标记为提供者。然后在Module中声明,即和PersonService做关联,个人感觉provider......