【Node.js】Node.js 模块系统

💡 问题 1:为什么是 require('fs').promises,而不是 Promise?

✅ 背景

Node.js 的 fs 模块原本是基于回调函数的设计,比如:

plain 复制代码
fs.readFile('a.txt', (err, data) => {...})

后来 Node.js 官方觉得回调写法太麻烦,于是新增了一个更现代的 Promise 风格 API ,方便配合 async/await 使用。

但为了 兼容旧代码 ,官方没有直接改原来的 fs,而是:

👉 在 fs 模块里额外提供了一个 .promises 子对象。

所以:

plain 复制代码
const fs = require('fs');          // 原始版本:回调风格
const fsP = require('fs').promises; // 新版本:Promise 风格

这两个其实是同一个模块的两种接口风格 。
promises 只是表示「这是 Promise 版本的 fs」。


📘 举例对比:

传统(回调)写法

plain 复制代码
const fs = require('fs');
fs.readFile('data.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

Promise(现代)写法

plain 复制代码
const fs = require('fs').promises;
const data = await fs.readFile('data.txt', 'utf8');
console.log(data);

✅ .promises 没有特殊魔法,只是官方为了区分不同风格的 API 而加的命名。

在本质上,Node.js 的 promises 和浏览器的 Promise 是同一个概念。

💡 问题 2:为什么要 .toString()?

这是很多刚从前端转 Node 的人都会疑惑的点。

✅ 原因是:

fs.readFile() 默认返回的是一个 Buffer 对象,不是字符串!

❓什么是 Buffer?

在浏览器里,我们读写的文件、数据几乎都是字符串(text)。

但 Node.js 是面向服务器的,它必须能高效处理各种二进制数据(图片、视频、文件流、网络数据包等)。

所以 Node.js 引入了一种特殊的数据结构 ------ Buffer(缓冲区):

它存的是二进制数据(0 和 1);

类似前端的 Uint8Array;

可以高效读写、复制、传输。

📘 举例:

const fs = require('fs');

const data = fs.readFileSync('test.txt');

console.log(data);

输出可能是这样:

<Buffer 48 65 6c 6c 6f 20 4e 6f 64 65 2e 6a 73>

这是一堆十六进制数,代表文件内容的二进制形式。

如果你想把它当作字符串看,就要手动转成文本:

console.log(data.toString());

输出:

Hello Node.js

✅ 更优雅的做法:

其实在读取文件时可以直接指定编码格式,让它自动转换为字符串:

const text = fs.readFileSync('test.txt', 'utf8');

console.log(text);

这样 Node.js 会自动帮你 .toString('utf8'),不用手动转了。

相关推荐
1-1=01 小时前
Vue 3 模板语
前端·javascript·vue.js
风卿1 小时前
看着AI写代码太孤独了,来欣赏星云吧:一个DSH 装饰插件
前端·javascript
沉默小管2 小时前
我用 NestJS + Nuxt 3 做了个导航站,聊几个踩过的坑
node.js·seo
牧艺2 小时前
弹层不用再手算坐标了:CSS Anchor Positioning 从原理到可上线
前端·javascript·css
愚坤3 小时前
前端真有意思,JS还能独立做项目?
前端·javascript·github
李纲明4 小时前
微信小程序 getSystemInfo 提示已废弃、屏幕高度算错胶囊还对不齐?getWindowInfo 和 getDeviceInfo 怎么接才稳
javascript·微信小程序·小程序·小程序开发·devdiy
FungLeo5 小时前
成为全栈·Vue 管理后台篇·用 fetch 建一层可控的请求内核
前端·javascript·vue.js·http·fetch·formdata·接口封装
用户84298142418106 小时前
ByteJS,让重要的 JavaScript 以字节码运行。
javascript
FungLeo7 小时前
成为全栈·Vue 管理后台篇·Vue Router如何守住多角色后台边界
前端·javascript·vue.js·rbac·vue router·路由守卫·前端权限
FungLeo8 小时前
成为全栈·Vue管理后台篇·仪表盘不是几张卡片:组合统计接口与角色视图
前端·javascript·vue.js·rbac·仪表盘·管理后台·tanstack query