【问题标题】:node require.cache delete does not result in reload of modulenode require.cache delete 不会导致重新加载模块
【发布时间】:2016-10-12 05:00:35
【问题描述】:

我正在为我的 npm 模块编写测试。 这些测试需要安装一个 npm 模块的多个版本,以检查该模块是否会验证它们是兼容的还是不兼容的。

不知何故,我在 stackoverflow 或 npm 数据库上找到的所有未缓存库或函数都不起作用..

我使用辅助函数安装/卸载 npm 模块:

function _run_cmd(cmd, args) {
    return new Promise((res, rej) => {
        const child = spawn(cmd, args)
        let resp = ''
        child.stdout.on('data', function (buffer) {
            resp += buffer.toString()
        })
        child.stdout.on('end', function() {
            res(resp)
        })
        child.stdout.on('error', (err) => rej(err))
    })
}

global.helper = {
    npm: {
        install: function (module) {
            return _run_cmd('npm', ['install', module])
        },
        uninstall: function (module) {
            decacheModule(module)
            return _run_cmd('npm', ['uninstall', module])
        }
    }
}

这是我当前的 decache 函数,它应该清除所有模块缓存(我尝试了其他的,包括 npm 模块,它们都不起作用)

function decacheModules() {
    Object.keys(require.cache).forEach(function(key) {
        delete require.cache[key]
    })
}

我正在安装多个版本的 less 模块 (https://www.npmjs.com/package/less)

在我的第一次测试中,我安装了一个不推荐使用的版本,它没有render-function。

在其他一些测试中,我正在安装具有render-function 的最新版本。不知何故,如果我测试那个测试确实失败了。 如果我跳过第一个测试,另一个测试会成功。 (render-函数存在)。

这让我相信删除 require.cache 没有影响...

我正在使用节点 v4.2.4。

【问题讨论】:

    标签: node.js caching npm require


    【解决方案1】:

    如果有对旧模块的引用:

    var less = require('less');
    

    清除模块缓存不会导致该引用被清除并重新加载模块。 为此,至少您不要将模块存储到变量中,请在任何地方使用“require('less')”。

    【讨论】:

    • 我需要带有自定义编写解析器的模块,该解析器会检查包版本是否匹配、包是否已安装等。我试图删除每个可能包含对该模块的引用的单个要求。但是它仍然不起作用......我不知道该怎么办了。我可以发布测试代码和被测模块(大约 150 行代码)
    猜你喜欢
    • 2012-07-26
    • 2014-03-17
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多