当前位置: 首页 > 面试题库 >

Node.js中的Singleton模式-是否需要?

祁修诚
2023-03-14
问题内容

最近,我碰上了这篇文章如何写在Node.js的一个单 我知道以下require
状态的文档:

第一次加载模块后将对其进行缓存。多次调用require('foo')可能不会导致模块代码多次执行。

因此,似乎每个需要的模块都可以轻松地用作单例,而无需单例样板代码。

题:

上面的文章是否提供了有关创建单例的解决方案?


问题答案:

这基本上与nodejs缓存有关。干净利落。

https://nodejs.org/api/modules.html#modules_caching

(v 6.3.1)

快取

第一次加载模块后将对其进行缓存。这意味着(除其他事项外)每次对require(’foo’)的调用都将获得与返回的对象完全相同的对象(如果它将解析为相同的文件)。

多次调用require(’foo’)可能不会导致模块代码多次执行。这是一个重要功能。使用它,可以返回“部分完成”的对象,从而即使在可能导致循环的情况下也可以加载传递性依赖项。

如果要让一个模块多次执行代码,则导出一个函数,然后调用该函数。

模块缓存警告

根据解析的文件名缓存模块。由于模块可以根据调用模块的位置(从node_modules文件夹加载)而解析为不同的文件名,因此,不能保证require(’foo’)始终返回完全相同的对象(如果它将解析为不同的文件)

此外,在不区分大小写的文件系统或操作系统上,不同的已解析文件名可以指向同一文件,但是高速缓存仍会将它们视为不同的模块,并将多次重载该文件。例如,require(’./
foo’)和require(’./ FOO’)返回两个不同的对象,而不管./foo和./FOO是否是同一文件。

简单来说。

如果要单身人士; 导出对象

如果您不想要单身人士; 导出函数 (并在该函数中执行填充/返回填充/任何操作)。

Luce的回答)。它在代码中解释了由于解析的文件名不同而导致缓存失败时会发生什么。但是,如果您始终解析为相同的文件名,则应该可以使用。_

更新2016

使用es6符号在node.js中创建一个真正的单例 另一个解决方案
:在此链接中

更新2020

此答案涉及 CommonJS (Node.js自己导入/导出模块的方式)。Node.js很可能会切换到 ECMAScript模块
:https : //nodejs.org/api/esm.html
(如果您不知道,ECMAScript是JavaScript的真实名称)

迁移到ECMAScript时,请先阅读以下内容:https
:
//nodejs.org/api/esm.html#esm_writing_dual_packages_while_avoiding_or_minimizing_hazards



 类似资料:
  • 问题内容: 我想在我的JavaScript代码中包含几个JSON文件,这些文件与JavaScript源文件位于同一目录中。 如果我想包含另一个JavaScript文件,可以直接使用。现在,我正在使用和获取JSON,我认为这是执行此操作的丑陋方法。 是否有类似的要求,使我能够加载JSON文件? 问题答案: 从节点v0.5.x开始,是的,您可以像需要js文件一样要求JSON。 在ES6中:

  • 问题内容: 编辑:回答-错误是方法不是静态的 我使用了Singleton设计模式 我的问题是如何在 另一个 类中创建Singleton 类的对象? 我试过了: 什么是正确的代码? 谢谢,斯宾塞 问题答案: 是正确的方法。确保您的方法确实正确。 由于您的实现远非安全- 您的对象可以通过反射实例化,因此您可能想基于

  • 我有一个DAO类,它在内部查询Oracle序列的next_val。 由于此序列不绑定到任何实体,只是查询内部逻辑的值,因此每次在DAO上调用方法时,我都会创建本机查询,如下所示: 由于每次调用该方法时都要创建查询,因此我想重构该方法,以便在定义为Springbean的单例中创建本机查询,以便只在第一次调用我的时创建查询。 这样做有什么缺点吗?Hibernate会话会给这种方法带来问题吗?

  • 问题内容: 默认情况下,我们在Spring容器中将bean作为单例,如果我们有一个基于Spring框架的Web应用程序,那么在这种情况下,我们真的需要实现Singleton设计模式来保存全局数据,而不仅仅是通过spring创建bean 。 问题答案: Spring中的单例豆和单例模式有很大不同。Singleton模式表示,每个类加载器将只创建一个特定类的一个实例。 Spring单例的范围描述为“每

  • 问题内容: 众所周知,Windows使用带反斜杠的路径,而Unix使用带反斜杠的路径。node.js提供了始终使用正确的斜杠。因此,例如,您不必编写Unix,而只编写Unix 。 但是,似乎存在这种差异,但是如果您不对路径进行规范化(例如,使用path.join),而仅编写诸如node.js之类的路径,则在Windows上运行脚本没有问题。 那么,有没有写上任何好处了?无论平台如何,两者似乎都可以

  • 单例模式确保每个指定的类只存在一个实例对象,并且可以全局访问那个实例。一般情况下会使用延时加载的策略,只在第一次需要使用的时候初始化。 注意:在 iOS 中单例模式很常见,NSUserDefaults.standardUserDefaults() 、 UIApplication.sharedApplication() 、 UIScreen.mainScreen() 、 NSFileManager.