一尘不染

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

node.js

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

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

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

题:

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


阅读 326

收藏
2020-07-07

共1个答案

一尘不染

这基本上与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

2020-07-07