当前位置: 首页 > article >正文

3. 简述node.js特性与底层原理

😺😺😺 一、Node.js 底层原理(简化版)

Node.js 是一个 基于 Chrome V8 引擎构建的 JavaScript 运行时,底层核心由几部分组成:

组成部分简要说明
1.V8 引擎
将 JS 编译成机器码执行,提供高性能执行环境。
2.libuv 库
用于实现事件循环、非阻塞 I/O、线程池等。
3.C++模块
Node.js 内部很多底层模块(如 fs、net)是用 C++ 写的。
4.事件循环(Event Loop)
负责调度异步任务(定时器、I/O、Promise 等)。
5.Bindings机制
JS 和 C++ 之间的桥梁,用于 JS 调用底层 C++ 模块。

😺😺😺 二、Node.js 核心特性 + 示例 + 简单底层机制

😺😺1.事件驱动(Event-driven)

Node 使用 观察者模式 和 事件循环 来处理事件。

😺示例
下面展示一些 内联代码片

const EventEmitter = require(‘events’);
const emitter = new EventEmitter();

emitter.on(‘sayHi’, () => {
console.log(‘Hi!’);
});

emitter.emit(‘sayHi’);

😺底层原理
• EventEmitter 是 Node 封装的事件机制;
• 内部维护一个事件与回调函数的映射表;
• emit 触发时,把对应回调函数放入 事件队列,由 事件循环 取出执行。

😺😺2. 非阻塞 I/O(Non-blocking I/O)

Node 的所有 I/O 操作默认都是异步的。

😺示例

fs = require(‘fs’);
fs.readFile(‘demo.txt’, ‘utf8’, (err, data) => {
console.log(data);
});
console.log(‘Start reading file…’);

😺底层原理
• JS 发起调用后,实际由 libuv 用 C/C++ 发出系统调用;
• I/O 任务交给内核或线程池去执行;
• 操作完成后将回调放入事件队列;
• 最终由事件循环执行回调。

😺😺3.单线程+事件循环(Single Thread + Event Loop)

Node 只有一个主线程在跑 JS,但能处理高并发任务。

😺示例

setTimeout(() => {
console.log(‘Timeout called’);
}, 1000);
console.log(‘After setTimeout’);

😺底层原理
• 主线程执行 setTimeout,libuv 记录定时器;
• 到时间后将回调放入事件队列;
• 事件循环轮询队列并执行回调。

😺😺4. 模块化(CommonJS 模块系统)

Node 用 CommonJS 实现模块导入与导出。

😺示例

// math.js
module.exports.add = (a, b) => a + b;

// app.js
const math = require(’./math’);
console.log(math.add(2, 3));

😺底层原理
• Node 内部用 C++ 实现了模块加载器;
• require() 会先缓存模块,防止重复加载;
• 模块包装成 (function(exports, require, module) {…}) 执行。

😺😺5.跨平台

Node 可在 Windows、Linux、macOS 上运行。

😺底层原理
• 使用 C++ 写的 libuv 提供跨平台兼容性;
• 统一抽象了不同操作系统的 I/O 接口。

😺😺总结对照表

在这里插入图片描述

😺😺 😺三 具体源码学习
1. fs 模块(文件读写)
• JS 层:lib/fs.js
• C++ 层绑定:src/node_file.cc、src/fs_event_wrap.cc
• libuv 层:deps/uv/src/unix/fs.c / fs-poll.c
2. http 模块(网络)
• JS 层:lib/http.js
• C++ 层绑定:src/stream_base.cc、src/tcp_wrap.cc
3. 事件循环
• 核心文件:src/node.cc、src/env.cc
• 事件循环封装在 libuv:deps/uv/src/unix/core.c
4. 模块加载机制(CommonJS / ESM)
• 代码:lib/module.js、lib/internal/modules、src/module_wrap.cc

可以用 VS Code 加 ctags / ripgrep 辅助跳转分析。

4.vue.js特性
5.js原生语法 promise async/await的使用

http://www.lryc.cn/news/2404130.html

相关文章:

  • OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()
  • 【Kubernetes】K8s 之 ETCD - 恢复备份
  • CMS、G1、ZGC、Shenandoah 的全面对比
  • RabbitMQ 学习
  • 如何轻松、安全地管理密码(新手指南)
  • AWS App Mesh实战:构建可观测、安全的微服务通信解决方案
  • 9.axios底层原理,和promise的对比(2)
  • 用HTML5 Canvas打造交互式心形粒子动画:从基础到优化实战
  • Gartner《How to Create and Maintain a Knowledge Base forHumans and AI》学习报告
  • 【软件工具】批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项
  • PyTorch 中cumprod函数计算张量沿指定维度的累积乘积详解和代码示例
  • docker镜像下载到本地,并导入服务器
  • 数据通信与计算机网络——数字传输
  • oracle 归档日志与RECOVERY_FILE_DEST 视图
  • 黄柏基因组-小檗碱生物合成的趋同进化-文献精读142
  • 前端杂货铺——TodoList
  • Spring Boot SSE流式输出+AI消息持久化升级实践:从粗暴到优雅的跃迁
  • camera功能真的那么难用吗
  • Model Context Protocol (MCP) 是一个前沿框架
  • SQL Server 日期时间类型全解析:从精确存储到灵活转换
  • Android Test3 获取的ANDROID_ID值不同
  • [蓝桥杯 2024 国 B] 立定跳远
  • 内容力重塑品牌增长:开源AI大模型驱动下的智能名片与S2B2C商城赋能抖音生态种草范式
  • 手机号在网状态查询接口如何用PHP实现调用?
  • 【Java微服务组件】分布式协调P4-一文打通Redisson:从API实战到分布式锁核心源码剖析
  • 一个简单的德劳内三角剖分实现
  • Python入门手册:异常处理
  • C#子线程更新主线程UI及委托回调使用示例
  • 使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中
  • 手写Promise.all