核心模块
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 命令时所在的文件夹的绝对路径
#会将所有给定的 path 片段连接到一起(使用平台特定的分隔符作为定界符),然后规范化生成的路径。
path.join
path.join()方法使用平台特定的分隔符作为定界符将所有给定的path片段连接在一起,然后规范化生成的路径。- 如windows系统的路径是/ (反斜杠),max、linux系统路径是\ (正斜杠)
- 解决避免自己手动拼接路径 ,手动拼接路径很容易出错
- path.join方法可以处理我们的路径,即使多写了斜杠和少写了斜杠也会帮我们处理
path.join()返回的是相对路径
path.resolve()
path.resolve()方法将路径或路径片段的序列解析为绝对路径- 如果在处理完所有给定的
path片段之后还未生成绝对路径,则再加上当前工作目录。 - 使用path.resolve的话,要手动创建一个文件夹,生成的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)每次一行地读取数据的接口
使用场景:
- 可在控制台打印时间、进度条、清空控制台
清空控制台:
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
// 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
const __filename = fileURLToPath(import.meta.url);
// 返回当前文件的目录
const __dirname = dirname(__filename);