首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >node.js中的延迟加载

node.js中的延迟加载
EN

Stack Overflow用户
提问于 2012-02-04 01:25:21
回答 2查看 24.2K关注 0票数 45

我想知道在node.js中使用require()是否等同于延迟加载?

例如,如果我有一个函数需要一个特定的node.js包,而我的代码中其他任何地方都不需要这个包,那么我最好在该函数内部使用require(),以便只有在调用该函数时才包含所需的包。

考虑到我对node.js架构缺乏了解,我也不确定这是否会提供任何性能改进?我假设它每次连接到我的服务器都会使用更少的内存。然而,当它必须读取包时,它会增加磁盘的I/O吗,或者这将是一次性的,以便将其放入内存中?

如果是这样,我应该走多远,我是否应该尝试为尽可能多的代码编写node.js包?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-04 16:06:43

require()是按需加载的。加载模块后,如果再次运行require()调用,则不会重新加载该模块。通过将它放在函数中而不是顶级模块代码中,您可以延迟它的加载,或者如果您从未实际调用过该函数,则可以避免它。但是,require()是同步的,并且从磁盘加载模块,因此最佳实践是在应用程序开始服务请求之前加载应用程序启动时所需的任何模块,从而确保在应用程序正常运行时只发生异步IO。

节点是单线程的,因此加载模块的内存占用不是针对每个连接,而是针对每个进程。加载模块是一次性将其放入内存中。

只需遵循这里的约定,在开始处理请求之前,需要在应用程序的顶级范围内使用所需的模块。我认为这是一个例子,如果你必须问你是否需要以一种不寻常的方式编写代码,你不需要以一种不寻常的方式来编写代码。

票数 65
EN

Stack Overflow用户

发布于 2016-05-07 09:15:09

如果您想延迟加载模块,现在可以使用ES6 (Node v6)

编辑:如果您需要访问require的属性(如require.cache),这将不起作用。

module.js

代码语言:javascript
运行
复制
console.log('Module was loaded')
exports.d=3

main.js

代码语言:javascript
运行
复制
var _require = require;
var require = function (moduleName) {
    var module;
    return new Proxy(function () {
        if (!module) {
            module = _require(moduleName)
        }
        return module.apply(this, arguments)
    }, {
        get: function (target, name) {
            if (!module) {
                module = _require(moduleName)
            }
            return module[name];
        }
    })
};

console.log('Before require');
var a = require('./module')
console.log('After require');
console.log(a.d)
console.log('After log module');

输出

代码语言:javascript
运行
复制
Before require
After require
Module was loaded
3
After log module
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9132772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档