粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • devlearn

    • 开发教程
    • 实践:利用ArrayBuffer实现预览指定目录下的所有文件的内容
    • 在linux-deepin上使用deepin-wine5完美运行腾讯会议/QQ/微信等此类应用
    • eslint插件开发教程
    • ServerLess之云函数实践-天气API
    • 移动端阻止弹窗下层页面被滑动
    • 小技巧:for of中获取index
    • Git常用的一些基本操作
    • 向页面注入js实现为图片和文字元素添加透明蒙层
    • 实践:使用jsencrypt配合axios实现非对称加密传输的数据
    • 封装dotenv库实现类似Vite加载环境变量的行为
    • 30行代码实现合并指定目录下的所有文件的内容
    • 马上中秋了,把鼠标指针变为小玉兔
    • Node中require与fs.readFile读取JSON文件的对比
    • 使用免费的七牛云OSS(10G)搭建个人的在线图床
    • 分享封装的一些七牛云OSS操作方法
    • 本地配置SSH免密远程登录服务器
    • 工具方法汇总
    • 腾讯云Serverless实践-Node.js服务部署
    • 腾讯云Serverless实践-静态网站托管
    • 为什么'\x1B'.length === 1?\x与\u知识延伸
    • Vite插件开发纪实:vite-plugin-monitor(上)
    • Vite插件开发纪实:vite-plugin-monitor(中)
    • Vite插件开发纪实:vite-plugin-monitor(下)
    • 解决Vite-React项目中js使用jsx语法报错的问题
    • webpack 项目接入Vite的通用方案介绍
    • webpack 项目接入Vite的通用方案介绍-草稿
    • 优雅的处理挂载window上的函数可能不存在的情况
    • Mac上抓包秒通关羊了个羊

Node中require与fs.readFile读取JSON文件的对比

vuePress-theme-reco 粥里有勺糖    2018 - 2023

Node中require与fs.readFile读取JSON文件的对比

粥里有勺糖 2021-08-19 技术笔记技术教程

# Node中require与fs.readFile读取JSON文件的对比

# 背景

在做时间管理工具 (opens new window)出现了一个问题

代码 (opens new window)中使用require读取JSON文件,服务端启动后发现当JSON文件发生改动后,返回的仍然是原来的JSON内容

本着打破砂锅问道低的精神,就展开了资料查阅探究,趁机学习一波新知识

# 原因

结论先行,require引入的模块会被Node缓存,下面用一个简单的demo实验一下

# 示例

test-module.js

console.log('1');

module.exports = {
    name:'0'
}
1
2
3
4
5
const m1 = require('./test-module')
m1.name = '2'
const m2 = require('./test-module')
console.log(m2.name);
1
2
3
4

运行后的输出结果输出如下

1
2
1
2

从这就可以得出结论Node会缓存引入的模块,name如何查看已经被缓存的模块

# 查看缓存

通过require.cache (opens new window)即可获取被缓存的模块:

  • 返回一个对象
const m1 = require('./test-module')
console.log(require.cache);
1
2

输出内容如下(这里就贴一张截图) 图片

# 删除缓存

既然require.cache返回内容是一个普普通通的对象,name可以通过delete关键字进行移除

const m1 = require('./test-module')
m1.name = '2'
console.log(m1.name);

delete require.cache[`${__dirname}/test-module.js`]
const m2 = require('./test-module')
console.log(m2.name);
1
2
3
4
5
6
7

内容输出如下

1
2
1
0
1
2
3
4

原因捋完后,咱们就开始进入主题

进行读取JSON文件的对比分析

# 读取JSON对比

  • require可以省略.json后缀
  • fs.readFile读取不能省略后缀 test.json
{
    "name":"xm"
}
1
2
3

测试demo

const d1 = require('./test.json')
console.log(d1); // { name: 'xm' }
const d2 = require('./test')
console.log(d2); // { name: 'xm' }
1
2
3
4

# 其它差异

# 编码

  • require只能按utf-8格式读取
  • fs.readFileSync可以设置编码格式

# 异步同步

  • require是同步读取
  • 通过fs既可以同步读取也可以异步读取

# 小结

  • require支持缓存
  • require只能按UTF-8读取内容
  • require是同步的
  • require读取JSON文件可以省略.json后缀

# 最后

本文内容比较精简,对于兼职学Node的同学可能会漏掉此部分知识

后续将继续更新时间管理工具的实践内容

Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34