首页 > 解决方案 > 单例 ES6 模块被多次调用?

问题描述

我不确定为什么这里有一个 console.log 的模块被多次调用。我以为这是一个单例

因此,如果我将此模块导入其他模块,因为这是一个单例,我没想到每次都会调用 console.log ......只是第一次被模块导入但之后我认为,即使当由后续模块导入时,因为它是一个单例,所以我不应该看到很多这些被记录:

src/graphql/db/InMemory/ InMemoryDB.ts

console.log('inMemoryDB');
const inMemoryDb = newDb();
inMemoryDb.public.none(fs.readFileSync('001-initial.sql', 'utf8'));
export default inMemoryDb;

当我最初运行测试最初启动使用此单例的服务时,我看到的是 6-7inMemoryDB被记录。即使我把它改成这个,同样的交易:

const inMemoryDb = () => {
  console.log('inMemoryDB');
  return newDb();
}
inMemoryDb.public.none(fs.readFileSync('001-initial.sql', 'utf8'));
export default inMemoryDb();

因此,例如,当我启动我的 graphql 服务时,我会在运行时得到 6-7 个 console.logsyarn graphql-dev

"graphql-dev": "yarn compile-graphql && yarn start-graphql-dev",
"compile-graphql": "tsc -b ./src/graphql",
"start-graphql-dev": "node --optimize_for_size --trace-warnings --es-module-specifier-resolution=node --no-warnings dist/graphql/server.js"

在我的graphql代码的深处,它使用这样的内存数据库单例(基于上面的第一个实现):

const inMemoryPgDb = inMemoryDb;

标签: javascriptnode.jsecmascript-6

解决方案


同意你的调用,console.log 被调用,但变量的值没有改变。检查示例以供参考

单例示例

好的,为什么会有多个 console.log ?在上面的代码中,您提供了一个具有返回类型的函数实例,并且无论模块函数被引用到哪里,它都会被调用。因为我们正在执行该功能。

每个模块都是独立的 JavaScript 程序。它在执行时组合成一个程序。


推荐阅读