学习Node.js的基础知识和核心概念(全面)

news2024/11/15 3:42:28

Node.js,这个神奇的技术,融合了前端与后端的力量,让JavaScript在服务器端发挥了异乎寻常的魔力。本文将通过代码和文字解释,全面介绍Node.js的特点,从异步非阻塞I/O到强大的模块系统,再到丰富的包管理和事件驱动编程,一步步揭开Node.js的神秘面纱。

公众号:Code程序人生,个人网站:https://creatorblog.cn

异步非阻塞I/O:高性能的秘密武器

Node.js的核心特点之一就是采用了异步非阻塞I/O模型。这意味着Node.js在执行I/O操作(如读写文件、网络请求等)时不会阻塞程序的其他部分,而是通过事件循环和回调函数,在操作完成后异步地通知程序处理结果。这使得Node.js能够在高并发环境下表现出色,极大提高了服务器的性能。

const fs = require('fs');

// 异步读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

console.log('异步读取文件进行中...');

在这个示例中,我们使用Node.js的文件系统模块(fs)异步地读取example.txt文件。在调用fs.readFile时,Node.js不会阻塞后续代码的执行,而是继续执行后面的console.log。当文件读取完成后,回调函数被触发,异步地输出文件内容。这种非阻塞I/O特性让Node.js能够高效地处理大量并发请求。

单线程:轻盈灵活的运行环境

Node.js是单线程的运行环境,这意味着它在同一时间只能执行一个任务。然而,通过异步非阻塞I/ONode.js能够高效地处理大量并发请求。虽然Node.js本身是单线程的,但可以通过创建多个子进程来充分利用多核处理器。

const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, Node.js!');
}).listen(3000);

console.log('服务器启动中...');

在这个示例中,我们使用Node.jshttp模块创建一个简单的HTTP服务器,并监听端口3000。当执行http.createServer时,Node.js会创建一个HTTP服务器,然后继续执行后面的console.log,不会阻塞服务器的运行。这样,Node.js能够轻盈灵活地处理客户端的请求。

模块系统:代码组织与复用的利器

Node.js拥有强大的模块系统,让代码的组织和复用变得简单。在Node.js中,每个文件就是一个模块,可以通过require关键字引入其他模块。这种模块化的编程风格,使得Node.js社区拥有丰富的第三方模块,方便开发者快速扩展应用功能。

// math.js
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;

module.exports = {
    add,
    subtract
}
// app.js
const math = require('./math');

console.log(math.add(5, 3)); // 输出: 8
console.log(math.subtract(5, 3)); // 输出: 2

在这个示例中,我们将数学运算封装在一个模块math.js中,并通过module.exports方式导出两个方法addsubtract。在app.js中,我们使用require关键字引入math模块,并调用其中的方法。这种模块化的方式,让我们能够更好地组织和复用代码。

npm(Node Package Manager):开源生态系统

npmNode.js的包管理工具,是全球最大的开源软件注册表。它提供了丰富的开源模块供开发者使用,同时也允许开发者将自己的模块分享给全球社区。借助npm,开发者可以轻松地安装、发布和管理Node.js模块,极大地促进了代码的共享和协作。

我们在安装Node.js时,会默认内置npm。可以打开命令行,分别输入node -vnpm -v来验证是否能正常使用。

image.png

# 安装第三方模块
npm install lodash=

在这个示例中,我们使用npm安装了一个非常流行的第三方模块lodash,它提供了很多实用的工具函数。通过这种方式,我们可以轻松地引入和使用其他开发者共享的模块,加快项目的开发速度。

事件驱动编程:优雅而高效的处理方式

Node.js采用事件驱动的编程范式,通过触发事件和监听器来进行异步处理。开发者可以通过事件驱动方式,轻松处理复杂的数据流和状态变化。这种事件驱动的编程方式使得代码看起来更加优雅、高效。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// 监听事件
myEmitter.on('event', () => {
  console.log('事件被触发!');
});

在这个示例中,我们使用Node.jsevents模块创建了一个自定义的事件发射器MyEmitter,它继承自EventEmitter。然后,我们创建了一个myEmitter实例,并通过on方法监听了一个名为event的事件。当event事件被触发时,回调函数会被执行,输出"事件被触发!"。通过事件驱动的方式,我们可以轻松地实现模块间的通信和数据传递,让代码变得更加清晰和可维护。

V8引擎:高性能的加持

Node.js运行在Chrome V8引擎上,V8引擎是一个高性能、快速的JavaScript引擎,为Node.js的执行效率提供了强大支持。V8引擎的优秀性能使得Node.js成为处理高并发请求的理想选择。

const arr = Array.from({ length: 1000000 }, (_, index) => index + 1);

console.time('排序耗时');
arr.sort((a, b) => a - b);
console.timeEnd('排序耗时');

在这个示例中,我们进行了一次对数组的排序。由于V8引擎的高性能,即使数组长度为1000000,排序也能在短时间内完成。V8引擎的高性能是Node.js能够高效处理大量并发请求的重要保障。

缓冲区(Buffer):处理二进制数据

Node.js中,Buffer是用来处理二进制数据的机制。由于JavaScript本身没有处理二进制数据的能力,Buffer允许我们在Node.js中高效地操作二进制数据,比如处理文件流或网络数据。

// 创建一个长度为5的Buffer
const buf = Buffer.alloc(5);

// 向Buffer写入数据
buf.write('hello');

// 读取Buffer数据
console.log(buf.toString()); // 输出: hello

在这个示例中,我们使用Buffer.alloc创建了一个长度为5的Buffer。然后,我们使用buf.writeBuffer中写入字符串"hello"。最后,我们通过buf.toString方法读取Buffer中的数据并输出。通过Buffer,我们可以方便地处理和操作二进制数据。

流(Stream):高效处理大量数据

Node.js提供了流的概念,它允许我们在数据尚未完全加载到内存的情况下进行处理。通过流,我们可以降低内存消耗,并且更快地处理大量数据,尤其在处理文件流和网络数据时,流显得格外高效。

const fs = require('fs');

// 创建可读流
const readableStream = fs.createReadStream('largefile.txt');

// 创建可写流
const writableStream = fs.createWriteStream('output.txt');

// 管道连接可读流和可写流
readableStream.pipe(writableStream);

在这个示例中,我们使用fs模块创建了一个可读流readableStream,它从名为largefile.txt的文件中读取数据。同时,我们也创建了一个可写流writableStream,它将数据写入名为output.txt的文件。通过pipe方法,我们将可读流和可写流连接在一起,使得数据能够从可读流流向可写流,实现高效的数据传输和处理。

跨平台:全方位的支持

Node.js是跨平台的,可以运行在WindowsMacOSLinux等多种操作系统上。这使得开发者可以在不同的平台上编写、测试和部署Node.js应用,享受全方位的支持。

Node.js的跨平台特性使得开发者可以在不同操作系统上运行同样的代码,而无需担心平台的差异性。这为开发者提供了更大的灵活性和便利性,让Node.js应用在各个平台上都能得到良好的运行体验。

社区活力:共建开源世界

Node.js社区是一个充满活力和创意的开源社区,有着众多积极参与的开发者。他们不仅共享自己的知识和经验,还开发了大量优秀的Node.js模块和工具,为其他开发者提供了宝贵的资源和帮助。这种积极的社区氛围,极大地促进了Node.js技术的发展和应用。

总结

本文通过代码和文字解释全面介绍了Node.js的特点与魅力。从异步非阻塞I/O到强大的模块系统,再到npm包管理、事件驱动编程以及V8引擎的高性能支持等。Node.js展现出了强大的编程能力和灵活的运行环境。Node.js已经改变了许多开发者的生活,你也可以在Node.js的世界里创造属于自己的奇迹!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/823893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机软件著作权登记申请表-模板

计算机软件著作权登记申请表 软件基本信息 软件全称 Xxxxx软件 软件简称(如无则不填) 分类号 说明:在附件图1-计算机软件分类代码表中提供的分类编号选择填写 计算机软件分类代码(单选) 30104 计算机软件适用的国民经济代…

C++学习day--17 二级指针、数组指针、指针数组

1、二级指针 二级指针的定义: 二级指针也是一个普通的指针变量,只是它里面保存的值是另外一个一级指针的地址 int guizi1 888; int *guizi2 &guizi1; //1 级指针,保存 guizi1 的地址 int **liujian &guizi2; //2 级指针&a…

操作系统使用免密登录

服务器免密登录 背景 在工作中使用密码登录有时候会出现这样或者那样的不方便,一是密码要输入,如果明文输入则不安全,二则一旦修改密码要重新分发到有权限的小伙伴 场景 在之前的工作中有很多场景需要免密等登录,使用免密带来…

Lvs missing port问题实例

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 LVS相关文章链接: LVS 流程 SVS 流程 LVS extract net方法

QMLDay2:圆角按钮,关联键盘左右键,鼠标点击。状态切换控制。

QMLDay2 test1 作用: 圆角按钮,关联键盘左右键,鼠标点击。状态切换控制。 代码: import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truecolor: "wh…

H.265/HEVC 速率控制

文章目录 速率控制视频编码速率控制速率控制的基本原理缓冲机制速率控制技术 H.265/HEVC 速率控制1. 目标比特分配2. 量化参数确定 速率控制 目前实际的视频编码率失真优化过程包括两部分:速率控制部分将视频序列分成编码单元,考虑编码单元的相关性通过…

C#,数值计算——t-分布(Student distribution)的计算方法与源程序

在概率论和统计学中,学生t-分布(Students t-distribution)经常应用在对呈正态分布的总体的均值进行估计。它是对两个样本均值差异进行显著性测试的学生t测定的基础。t检定改进了Z检定(en:Z-test),不论样本数…

【PyQt实现复现框CheckBox】

PyQt实现复现框CheckBox 1 安装环境2 CtrlN,新建Main Window窗口,保存为checkBox.ui文件3 CheckBox的三种状态4 实现通用复选框的选中状态设置用户权限功能 1 安装环境 1)Python环境安装PyQt5、PyQt-sip、PyQt5Designer、PyQt5-tools 2&…

【搜索】BFS中的最短路模型

算法提高课笔记 目录 单源最短路迷宫问题题意思路代码 武士风度的牛题意思路代码 抓住那头牛题意思路代码 多源最短路矩阵距离题意思路代码 双端队列BFS电路维修题意思路代码(加了注释) BFS可以解决边权为1的最短路问题,下面是相关例题 单源…

Mybatis 知识点

Mybatis 知识点 1.1 Mybatis 简介 1.1.1 什么是 Mybatis Mybatis 是一款优秀的持久层框架支持定制化 SQL、存储过程及高级映射Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO…

PyTorch深度学习实战(8)——批归一化

PyTorch深度学习实战(8)——批归一化 0. 前言1. 批归一化原理2. 批归一化优势3. 批归一化对模型训练的影响3.1 未使用批归一化,且输入值较小3.2 使用批归一化,且输入值较小3.3 使用批归一化,且输入值较大 小结系列链接…

Redis—环境搭建

Redis—环境搭建 🔎Centos 安装 Redis5创建符号链接修改配置文件启动 Redis停止 Redis 🔎Centos 安装 Redis5 Centos8 安装 Redis5 yum install -y redisCentos7 安装 Redis5 Centos7 中 yum 源提供的 Redis 版本是 Redis3(有点老), 因此先安装 scl 源 …

算法综合篇专题二:滑动窗口

“在混沌想法中&#xff0c;最不可理喻念头。” 1、长度最小的子数组 (1) 题目解析 (2) 算法原理 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int sum 0;int len INT_MAX;for(int left0,r…

mysql进阶-用户的创建_修改_删除

1. 使用mysql单次查询 [rootVM-4-6-centos /]# mysql -h localhost -P 3306 -p mytest -e "select * from book1"; Enter password: ------------------------------------------- | id | category_id | book_name | num | ----------------------------…

数据结构 | 基本数据结构——队列

目录 一、何谓队列 二、队列抽象数据类型 三、用Python实现队列 四、模拟&#xff1a;传土豆 五、模拟&#xff1a;打印任务 5.1 主要模拟步骤 5.2 Python实现 一、何谓队列 队列是有序集合&#xff0c;添加操作发生在“尾部”&#xff0c;移除操作则发生在“头部”。新…

【Javascript】基础知识

文章目录 01 变量的声明02 数据类型字符串型boolean类型undefined null类型symbol类型超大整数 bigint数组类型普通对象 01 变量的声明 02 数据类型 复习: 声明 ​ 声明变量关键词 ​ let ​ const ​ 变量名 >变量命名规范 ​ 英文 数字 _ $不要以数字开头 ​ 见名知意 ​…

深度学习之tensorboard可视化工具

(1)什么是tensorboard tensorboard是TensorFlow 的一个可视化工具包&#xff0c;提供机器学习实验所需的可视化和工具&#xff0c;该工具的功能如下&#xff1a; 跟踪和可视化指标&#xff0c;例如损失和精度可视化模型图&#xff08;操作和层&#xff09;查看权重、偏差或其…

【Java多线程学习4】volatile关键字及其作用

说说对于volatile关键字的理解&#xff0c;及的作用 概述 1、我们知道要想线程安全&#xff0c;就需要保证三大特性&#xff1a;原子性&#xff0c;有序性&#xff0c;可见性。 2、被volatile关键字修饰的变量&#xff0c;可以保证其可见性和有序性&#xff0c;但是volatile…

uniApp 对接安卓平板刷卡器, 读取串口数据

背景: 设备: 鸿合 电子班牌 刷卡对接 WS-B22CS, 安卓11; 需求: 将刷卡器的数据传递到自己的App中, 作为上下岗信息使用, 以完成业务; 对接方式: 1. 厂家技术首先推荐使用 接收自定义广播的方式来获取, 参考代码如下 对应到uniApp 中的实现如下 <template><view c…

python数据可视化Matplotlib

1.绘制简单的折线图 # -*- coding: utf-8 -*- import matplotlib.pyplot as pltinput_values [1, 2, 3, 4, 5] squares [1, 4, 9, 16, 25] plt.style.use(seaborn) fig, ax plt.subplots() ax.plot(input_values, squares, linewidth3) # 线条粗细# 设置图表标题并给坐标…