为何Node.js中修改require引入的数组后原文件未同步更新?
为什么修改require导入的数组后,原文件内容没有变化?
问题场景
我有两个文件:data.js:
var idToExport = ["123", "456"] module.exports = idToExport;
app.js:
var data = require("./data.js") data.push("789"); console.log(data[2]) // 输出789
运行app.js后能正常输出789,但打开data.js文件一看,里面还是原来的["123", "456"],添加的789根本没保存下来,这是为啥?
问题原因
咱们得先搞清楚Node.js加载模块的底层逻辑:
- 当你调用
require("./data.js")时,Node.js会读取磁盘上的data.js文件内容,执行里面的代码,然后把module.exports指向的结果加载到内存中并缓存起来。后续再require这个模块,直接用内存里的缓存,不会再重新读磁盘文件。 - 你在
app.js里做的data.push("789"),只是修改了内存中那个数组对象的内容,完全没涉及到磁盘上的原文件。Node.js不会自动把内存里的变量变化同步回磁盘文件——这不是它的默认行为。
如果要把修改保存到文件怎么办?
如果想让修改持久化到data.js,你得手动用Node.js的文件系统模块(fs)来写入文件。比如在app.js里加一段代码:
var fs = require('fs'); var data = require("./data.js") data.push("789"); // 把数组转换成符合文件格式的字符串,再写入文件 fs.writeFileSync('./data.js', `var idToExport = ${JSON.stringify(data)}; module.exports = idToExport;`); console.log(data[2]) // 输出789
这样运行后,再打开data.js就能看到更新后的数组了。
内容的提问来源于stack exchange,提问作者métier
相关产品推荐
相关产品推荐

