跳到主要内容

核心模块

Node为JavaScript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了,例如文件操作的fs核心模块,http服务器构建的http模块,path路径操作模块,os操作系统信息模块,等等

path​

方便我们可以动态获取路径,就不用写死路径了

node 中的路径大致分 5 类,dirname,filename,process.cwd(),./,../,其中dirname,filename,process.cwd()绝对路径

__dirname: 总是返回被执行的 js文件 所在文件夹的绝对路径 【返回当前文件目录路径 、目录绝对路径】

__filename: 总是返回被执行的 js 的绝对路径 【返回当前文件绝对路径】

process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径

./: 跟 process.cwd() 一样,返回 node 命令时所在的文件夹的绝对路径

js
#会将所有给定的 path 片段连接到一起(使用平台特定的分隔符作为定界符),然后规范化生成的路径。

path.join​

  • path.join() 方法使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。
  • 如windows系统的路径是/ (反斜杠),max、linux系统路径是\ (正斜杠)
  • 解决避免自己手动拼接路径 ,手动拼接路径很容易出错
  • path.join方法可以处理我们的路径,即使多写了斜杠和少写了斜杠也会帮我们处理
  • path.join() 返回的是相对路径

path.resolve()​

  • path.resolve() 方法将路径或路径片段的序列解析为绝对路径
  • 如果在处理完所有给定的 path 片段之后还未生成绝对路径,则再加上当前工作目录。
  • 使用path.resolve的话,要手动创建一个文件夹,生成的js文件会在这个路径下
js
path.resolve() //如果没传参数,则返回当前工作目录
path.resolve('template') //会把当前参数拼接到当前工作目录,解析为绝对路径

path.resolve和 path.join区别​

  • path.resolve() 返回的是绝对路径,而 path.join() 返回的是相对路径。
  • path.resolve() 会解析路径片段并构建出一个绝对路径,适用于需要使用绝对路径的场景,比如在配置文件中指定路径。
  • path.join() 仅仅将路径片段连接起来,适用于构建相对路径,比如在文件操作中拼接路径。

fs​

  • Node.js内置的fs模块就是文件系统模块,负责读写文件。

    和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法。

  • fs.mkdirSync(path,[options]) 同步地创建目录

  • fs.mkdir(path,[options],callback) 异步地创建目录。 除了可能的异常,完成回调没有其他参数

  • fs.readFile(path,[options],callback) :异步读文件

  • fs.writeFIle(filename, data, [options], callback) :文件写入

stream​

  • stream表示流,是一个数据传输的手段

  • node.js 中很多对象都是Stream,例如HTTP 的请求,进程日志输出,文件的读写

使用场景

  • 处理IO操作,就是输入输出的操作,比如涉及到文件操作都属于IO操作

buffer​

child_process​

  • 使用child_process创建子进程的方式主要有以下四种: exec、execFile、spawn、fork
  • 创建一个shell,然后在shell里执行命令。执行完成后,将stdout、stderr作为参数传入回调方法。

使用场景

  • 文件压缩、增量部署

常用方法:

  • exec: 衍生出一个shell命令
  • fork: 衍生出新的node进程,可以在父进程和子进程之间发送消息

readline​

readline 模块提供了用于从可读流(例如 process.stdin)每次一行地读取数据的接口

使用场景:

  • 可在控制台打印时间、进度条、清空控制台

清空控制台:

js
const readline = require('readline')
// 清空控制台
module.exports = function clearConsole(title) {
if (process.stdout.isTTY) {
const blank = '\n'.repeat(process.stdout.rows)
console.log(blank)
readline.cursorTo(process.stdout, 0, 0)
readline.clearScreenDown(process.stdout)
if (title) {
console.log(title)
}
}
}

具有Promise模块​

使用fs.promises模块时,你可以使用一些异步的文件系统方法,如读取文件(readFile)、写入文件(writeFile)、追加文件(appendFile)、删除文件(unlink)等,它们返回的是Promise对象

  • fs.promises
  • util.promisify
js
// fs.promises使文件操作具有promise
const fs = require('fs')
const utils = require('util')
const content = await fs.promises.stat(filePath)

// 使模块转换为promise
const readFileAsync = util.promisify(fs.readFile);

遇到问题​

在ESM模块出现__dirname is not defined​

__dirname 或 __filename 全局变量在 ECMAScript 模块文件中不可用

解决方式:

  • import.meta.url : 一个模块元信息对象,它包含有关当前模块的信息,包括模块的 URL
    • 得到当前模块的 URL, 如返回: file:///usr/local/bin/node
  • fileURLToPath : 将一个文件 URL 转换为文件路径:将 file:///usr/local/bin/node 转换为 /usr/local/bin/node
js
const __filename = fileURLToPath(import.meta.url);
// 返回当前文件的目录
const __dirname = dirname(__filename);