目录
首先 什么是Node.js
Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的开源、跨平台的 JavaScript 运行时环境。它允许开发者使用 JavaScript 在服务器端构建高性能的网络应用程序。
Node.js 提供了一组强大的特性和功能,使得开发者能够轻松地构建可扩展的网络服务器和后端应用程序。它采用了事件驱动、非阻塞 I/O 模型,使得可以在单个线程中处理大量并发连接,从而实现高效的异步编程。
Node.js 基于事件驱动的架构,通过回调函数和事件监听器来管理异步操作。这种异步编程模型使得可以不阻塞地处理多个并发请求,而不需要为每个请求创建一个新的线程。这使得 Node.js 能够处理高并发的网络应用程序,并具备良好的可伸缩性和性能。
除了作为服务器端运行时环境,Node.js 还可以用于构建命令行工具、桌面应用程序等各种类型的应用。它具有丰富的生态系统,拥有大量的第三方库和模块,可以轻松扩展功能和开发各种类型的应用。
总结起来,Node.js 是一个基于 JavaScript 的服务器端运行时环境,它提供了高性能、可伸缩和事件驱动的编程模型,使得开发者可以构建高效的网络应用程序。
模块分类
在 Node.js 中模块可以分为 3 类:核心模块、第三方模块和自定义模块。
这篇主要解释核心模块,剩下两种https://blog.csdn.net/kkkys_kkk/article/details/135421749?spm=1001.2014.3001.5501
核心模块
核心模块是 Node.js 内置的模块,它们提供了许多常用的功能和 API,可直接在你的应用程序中使用,无需额外安装。
以下是一些常见的核心模块以及它们的功能:
-
fs
模块:提供文件系统操作功能,包括文件读取、写入、重命名、删除等。 -
path
模块:用于处理文件路径,包括路径拼接、解析、规范化等。 -
http
模块:用于创建 HTTP 服务器和客户端,进行 Web 开发。 -
https
模块:用于创建 HTTPS 服务器和客户端,进行安全的 Web 开发。 -
os
模块:提供与操作系统相关的功能,如获取系统信息、CPU 使用情况、内存使用情况等。 -
util
模块:提供一些实用工具函数,如继承、类型判断、错误处理等。 -
events
模块:用于实现事件驱动的编程,包括创建事件监听器、触发事件等。 -
stream
模块:用于处理流数据,包括读取、写入、转换等。 -
crypto
模块:提供加密和解密功能,包括哈希算法、加密算法等。 -
querystring
模块:用于解析和序列化 URL 查询字符串。 -
url
模块:用于解析 URL 地址。 -
zlib
模块:提供压缩和解压缩功能,支持多种压缩算法。 -
child_process
模块:用于创建子进程,执行外部命令。 -
dns
模块:用于进行 DNS 查询,解析域名。 -
net
模块:用于创建网络服务器和客户端。
要在你的应用程序中使用核心模块,你只需要使用 require 函数导入模块,并调用相应的函数和方法即可。
具体
常用模块示例
fs
模块
要使用 fs
模块,首先需要使用 require
函数导入该模块:
const fs = require('fs');
读取文件
要读取文件的内容,可以使用 fs.readFile
方法。它接受文件路径和一个可选的编码参数,然后通过回调函数返回文件的内容。
以下是一个简单的例子:
const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
上面的例子读取了名为 file.txt
的文件的内容,并将其输出到控制台。如果读取文件时发生错误,错误信息会在回调函数中作为第一个参数传递。
写入文件
要写入数据到文件中,可以使用 fs.writeFile
方法。它接受文件路径、要写入的数据和一个可选的编码参数。写入文件时,如果文件已存在,原有内容会被覆盖。
以下是一个简单的例子:
const fs = require('fs');
const data = 'Hello, World!';
fs.writeFile('file.txt', data, 'utf8', (err) => {
if (err) {
console.error(err);
return;
}
console.log('Data written to file.txt');
});
上面的例子将字符串 'Hello, World!'
写入到名为 file.txt
的文件中。如果写入文件时发生错误,错误信息会在回调函数中作为第一个参数传递。
其他操作
除了读取和写入文件,fs
模块还提供了很多其他的文件系统操作方法,如重命名文件、删除文件、创建文件夹、遍历目录等等。以下是一些常用的方法:
-
fs.rename(oldPath, newPath, callback)
:重命名文件或文件夹。 -
fs.unlink(path, callback)
:删除文件。 -
fs.mkdir(path, options, callback)
:创建文件夹。 -
fs.readdir(path, callback)
:读取文件夹内容。
这只是一小部分 fs
模块提供的功能,实际上还有很多其他的方法可供使用。你可以参考 Node.js 官方文档以获取更多详细信息。
总结来说,fs
模块提供了对文件系统进行操作的功能,可以方便地读取、写入、修改和删除文件,以及进行其他与文件系统相关的操作。
http 模块
要使用 `http` 模块,首先需要使用 `require` 函数导入该模块:
const http = require('http');
创建 HTTP 服务器
要创建一个 HTTP 服务器,可以使用 `http.createServer` 方法。该方法接受一个回调函数作为参数,这个回调函数会在每次收到 HTTP 请求时被调用,并传递一个 `request` 对象和一个 `response` 对象。
以下是一个简单的例子:
const http = require('http');
const server = http.createServer((request, response) => {
response.statusCode = 200;
response.setHeader('Content-Type', 'text/plain');
response.end('Hello, World!\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server is running at http://127.0.0.1:3000/');
});
上面的例子创建了一个简单的 HTTP 服务器,监听在本地的 3000 端口。当有新的请求到达时,回调函数会被调用,并向客户端发送一个带有 "Hello, World!" 文本的响应。
发起 HTTP 请求
除了创建服务器,`http` 模块也可以用于创建 HTTP 客户端,并发送 HTTP 请求。
可以使用 `http.request` 方法来发起一个 HTTP 请求。该方法接受一个 URL 和一些可选的请求选项,并返回一个 `ClientRequest` 实例。
以下是一个简单的例子:
const http = require('http');
const options = {
hostname: 'example.com',
path: '/',
method: 'GET'
};
const req = http.request(options, (res) => {
console.log(`HTTP Response status code: ${res.statusCode}`);
res.on('data', (chunk) => {
console.log(`Received data: ${chunk}`);
});
});
req.on('error', (error) => {
console.error(`An error occurred: ${error}`);
});
req.end();
上面的例子发起了一个 GET 请求到 `example.com` 的根路径。当服务器返回响应时,回调函数会被调用,并将响应数据输出到控制台。
`http` 模块还提供了其他一些方法和属性,如 `http.get` 方法用于发送 GET 请求、`ClientRequest` 类代表一个正在进行的请求、`http.STATUS_CODES` 对象包含了常见的 HTTP 状态码等等。可以参考 Node.js 官方文档以获取更多信息。
总体而言,`http` 模块使得在 Node.js 应用程序中处理 HTTP 请求和响应变得非常简单和灵活,可用于构建各种类型的 Web 服务器和客户端应用程序。
path 模块
要使用 path
模块,首先需要使用 require
函数导入该模块:
const path = require('path');
常用方法
path
模块提供了一系列常用的方法,下面介绍几个常用的方法:
-
path.join([...paths])
:拼接多个路径片段,并返回拼接后的路径。这个方法会根据操作系统的特性自动选择正确的路径分隔符。const path = require('path'); const fullPath = path.join('/home', 'user', 'documents', 'file.txt'); console.log(fullPath); // 输出: /home/user/documents/file.txt
-
path.resolve([...paths])
:将路径片段解析为绝对路径,并返回解析后的路径。如果路径是绝对路径,则直接返回。const path = require('path'); const absolutePath = path.resolve('documents', 'file.txt'); console.log(absolutePath); // 输出: /current/working/directory/documents/file.txt
-
path.basename(path, [ext])
:返回路径的最后一部分(文件名),可以选择性地指定文件扩展名ext
,以去除扩展名。const path = require('path'); const fileName = path.basename('/home/user/documents/file.txt'); console.log(fileName); // 输出: file.txt const fileNameWithoutExt = path.basename('/home/user/documents/file.txt', '.txt'); console.log(fileNameWithoutExt); // 输出: file
-
path.dirname(path)
:返回路径所在的目录名。const path = require('path'); const directory = path.dirname('/home/user/documents/file.txt'); console.log(directory); // 输出: /home/user/documents
-
path.extname(path)
:返回路径的扩展名。const path = require('path'); const ext = path.extname('/home/user/documents/file.txt'); console.log(ext); // 输出: .txt
这只是 path
模块提供的一些常用方法,实际上还有很多其他的方法可供使用。你可以参考 Node.js 官方文档以获取更多详细信息。
总结来说,path
模块提供了一组方法,用于处理文件路径和目录路径。它可以方便地拼接路径、解析路径、获取文件名、目录名和扩展名等信息。
os 模块
要使用 os
模块,首先需要使用 require
函数导入该模块:
const os = require('os');
常用方法和属性
os
模块提供了一些常用的方法和属性,下面介绍几个常用的:
-
os.platform()
:返回当前操作系统的平台标识符。可能的值有:'darwin'
:Mac OS X'win32'
:Windows'linux'
:Linux'aix'
:IBM AIX'freebsd'
:FreeBSD'openbsd'
:OpenBSD'sunos'
:SunOS
const os = require('os'); const platform = os.platform(); console.log(platform); // 输出: darwin (如果当前操作系统是 Mac OS X)
-
os.arch()
:返回当前操作系统的处理器架构。可能的值有:'x64'
:64 位操作系统'arm'
:ARM 架构(如树莓派)'ia32'
:32 位操作系统
const os = require('os'); const arch = os.arch(); console.log(arch); // 输出: x64 (如果当前操作系统是 64 位)
-
os.cpus()
:返回一个对象数组,包含当前计算机的所有 CPU/处理器的信息。const os = require('os'); const cpus = os.cpus(); console.log(cpus); // 输出每个 CPU 的详细信息
-
os.totalmem()
:返回计算机的总内存(以字节为单位)。const os = require('os'); const totalMemory = os.totalmem(); console.log(totalMemory); // 输出计算机的总内存大小(以字节为单位)
-
os.freemem()
:返回计算机的可用内存(以字节为单位)。const os = require('os'); const freeMemory = os.freemem(); console.log(freeMemory); // 输出计算机的可用内存大小(以字节为单位)
这只是 os
模块提供的一些常用方法和属性,实际上还有很多其他的方法和属性可供使用。你可以参考 Node.js 官方文档以获取更多详细信息。
总结来说,os
模块提供了一组方法和属性,用于获取操作系统的信息,如平台、处理器架构、CPU 信息以及内存信息等。
util 模块
要使用 util
模块,首先需要使用 require
函数导入该模块:
const util = require('util');
常用方法和函数
util
模块提供了许多常用的方法和函数,下面介绍几个常用的:
-
util.promisify(original)
:将一个基于回调的异步函数转换为基于 Promise 的异步函数。const util = require('util'); const fs = require('fs'); const readFile = util.promisify(fs.readFile); // 读取文件并返回一个 Promise 对象 readFile('file.txt', 'utf8') .then(data => console.log(data)) .catch(error => console.error(error));
-
util.format(format[, ...args])
:格式化字符串,类似于console.log()
中的使用方法。const util = require('util'); const name = 'John'; const age = 30; const message = util.format('My name is %s and I am %d years old.', name, age); console.log(message); // 输出: My name is John and I am 30 years old.
-
util.inherits(constructor, superConstructor)
:继承。const util = require('util'); const EventEmitter = require('events'); // 自定义构造函数 function MyEmitter() { EventEmitter.call(this); } // 继承 EventEmitter util.inherits(MyEmitter, EventEmitter);
-
util.inspect(object[, options])
:将对象转换为字符串的形式,可用于调试和日志记录。const util = require('util'); const obj = { name: 'John', age: 30 }; console.log(util.inspect(obj)); // 输出: { name: 'John', age: 30 }
-
util.isArray(object)
:判断给定的对象是否为数组。const util = require('util'); console.log(util.isArray([])); // 输出: true console.log(util.isArray({})); // 输出: false
这只是 util
模块提供的一些常用方法和函数,实际上还有很多其他的方法和函数可供使用。你可以参考 Node.js 官方文档以获取更多详细信息。
总结来说,util
模块提供了一组实用工具函数,用于简化常见的 JavaScript 编程任务,如格式化字符串、继承、转换对象为字符串等。
通过使用核心模块,你可以方便地实现各种功能并与外部资源进行交互,从而构建出强大的 Node.js 应用程序。
其他类型分类模块
除了按来源分为核心模块、第三方模块和自定义模块外,还可以按模块的功能划分为以下 3 种类型:
单例模块:单例模块是一种只导出一个对象或函数的模块,每次导入该模块时都会返回同一个实例。这些模块一般用于封装状态和行为,以及共享实例。例如,Node.js 中的 `fs` 模块和 `path` 模块都是单例模块。
工厂模块:工厂模块是一种根据参数或配置项创建新实例的模块,每次导入该模块时都会返回一个新的实例。这些模块一般用于封装复杂的逻辑和处理可重用组件。例如,第三方模块中的 _Lodash_ 就是一个工厂模块,它提供了各种常用函数的实现,并且每次调用函数都会返回一个新的实例。
命名空间模块:命名空间模块是一种将多个相关函数、类或对象组织到一个导出对象中的模块。这些模块一般用于封装相关组件和提供模块级别的 API。例如,一个自定义模块可以导出一个包含多个相关函数的对象,如:
// utils.js
module.exports.string = {
trim: function(str) { return str.trim(); },
capitalize: function(str) { return str[0].toUpperCase() + str.slice(1); }
}
module.exports.array = {
sortBy: function(arr, key) { return arr.sort((a, b) => a[key] - b[key]); },
filter: function(arr, callback) { return arr.filter(callback); }
}
其他模块可以使用该自定义模块并按名称访问组件:
const utils = require('./utils');
console.log(utils.string.trim(' hello ')); // 输出: "hello"
console.log(utils.array.sortBy([{ id: 2 }, { id: 1 }], 'id')); // 输出: [{ id: 1 }, { id: 2 }]
以上 3 种模块类型并不是严格的分类,实际上不同类型的模块可以混合使用,例如一个单例模块中可以包含多个命名空间模块。选择使用哪种模块类型取决于你要解决的问题和设计的需要。