Node.js中如何导入动态更新的对象?
问题原因
当你在source.js中直接导出{name: name, age: age}时,CommonJS会导出当前时刻name和age值的拷贝。如果初始时name和age未定义或为空,导出的对象就是空对象{};后续name和age的变化也不会同步到已导出的对象中,因为导出的是静态拷贝,而非动态引用。
解决方案
以下两种方法可以实现获取动态更新的对象:
方法1:导出一个返回最新对象的函数
将source.js改为导出函数,每次调用该函数时都会返回包含最新name和age的对象:
// source.js // 示例:每秒更新name和age的逻辑 let name = ''; let age = 0; setInterval(() => { name = `User${Math.random().toString(36).slice(2, 8)}`; age = Math.floor(Math.random() * 50) + 18; }, 1000); // 导出函数,返回最新的对象 module.exports = () => ({ name, age });
在target.js中,调用函数获取最新值:
// target.js const getPerson = require('./source.js'); // 定时获取并打印最新值 setInterval(() => { console.log(getPerson()); }, 1000);
方法2:导出一个可修改的对象,直接更新其属性
不单独定义name和age变量,而是直接修改导出对象的属性——因为对象是引用类型,target.js中引用的是同一个对象,属性变化会实时同步:
// source.js // 直接导出一个对象 const person = { name: '', age: 0 }; setInterval(() => { // 直接修改导出对象的属性 person.name = `User${Math.random().toString(36).slice(2, 8)}`; person.age = Math.floor(Math.random() * 50) + 18; }, 1000); module.exports = person;
在target.js中,直接引用该对象即可看到动态变化:
// target.js const person = require('./source.js'); setInterval(() => { console.log(person); }, 1000);
注意事项
- 第一种方法适合需要主动获取最新值的场景,每次调用函数都会生成新对象;
- 第二种方法适合需要实时同步属性变化的场景,所有引用该对象的地方都会看到最新属性。
内容的提问来源于stack exchange,提问作者minhbonghot
相关产品推荐
相关产品推荐

