require出来的值如何监听到原模块中值的变化

发布时间 2023-04-18 17:23:15作者: 风行者夜色

前言

众所周知,esmodule导出的值是对应模块导出值的引用,一旦模块内部使该值发生了变化,获得的值也会变化。而commonjs种的require函数,是获取了该模块导出值的拷贝,如果原模块中的值发生了变化,是拿不到最新的值的,那么有没有办法可以获取到最新的值呢。

解决思路

  • 既然正常方法是拿不到对应的值,那么通过闭包是不是可以呢,说试就试。

test.js

let obj = { a: 1 };

setTimeout(() => {
    obj.a = 2;
}, 2000)

const getFn = () => {
    return () => {
        return obj;
    }
};

const fn = getFn();

exports.getA = fn;

index.js

const a = require('./test').getA();

setTimeout(() => {
    console.log(a); // { a: 2 }
}, 3000);
  • 结果就是可以,将一个闭包函数抛出来,利用闭包的特性是可以达到这样的效果的。