目录
Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的开源、跨平台的 JavaScript 运行时环境。它允许开发者使用 JavaScript 在服务器端构建高性能的网络应用程序。
Node.js 提供了一组强大的特性和功能,使得开发者能够轻松地构建可扩展的网络服务器和后端应用程序。它采用了事件驱动、非阻塞 I/O 模型,使得可以在单个线程中处理大量并发连接,从而实现高效的异步编程。
Node.js 基于事件驱动的架构,通过回调函数和事件监听器来管理异步操作。这种异步编程模型使得可以不阻塞地处理多个并发请求,而不需要为每个请求创建一个新的线程。这使得 Node.js 能够处理高并发的网络应用程序,并具备良好的可伸缩性和性能。
除了作为服务器端运行时环境,Node.js 还可以用于构建命令行工具、桌面应用程序等各种类型的应用。它具有丰富的生态系统,拥有大量的第三方库和模块,可以轻松扩展功能和开发各种类型的应用。
总结起来,Node.js 是一个基于 JavaScript 的服务器端运行时环境,它提供了高性能、可伸缩和事件驱动的编程模型,使得开发者可以构建高效的网络应用程序。
在 Node.js 中模块可以分为 3 类:核心模块、第三方模块和自定义模块。
这篇主要解释核心模块,剩下两种会在后续相继发出
核心模块是 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` 模块,首先需要使用 `require` 函数导入该模块:
const http = require('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.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
?模块,首先需要使用?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
?模块,首先需要使用?require
?函数导入该模块:
const os = require('os');
os
?模块提供了一些常用的方法和属性,下面介绍几个常用的:
os.platform()
:返回当前操作系统的平台标识符。可能的值有:
'darwin'
:Mac OS X'win32'
:Windows'linux'
:Linux'aix'
:IBM AIX'freebsd'
:FreeBSD'openbsd'
:OpenBSD'sunos'
:SunOSconst 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
?模块,首先需要使用?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 种模块类型并不是严格的分类,实际上不同类型的模块可以混合使用,例如一个单例模块中可以包含多个命名空间模块。选择使用哪种模块类型取决于你要解决的问题和设计的需要。