Javascript 单例ES6模块被多次调用?

Javascript 单例ES6模块被多次调用?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我不知道为什么这里有一个console.log的模块被多次调用。我以为这是一个单身汉 因此,如果我将此模块导入其他模块,由于这是一个单例,我不希望每次都调用console.log…这只是第一次由模块导入,但之后我认为,即使由后续模块导入,因为它是单例,所以我也不应该看到有一个单例被记录: src/graphql/db/InMemory/InMemoryDB.ts console.log('inMemoryDB'); const inMemoryDb = newDb(); inMemoryDb.p

我不知道为什么这里有一个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-7个
inMemoryDB
被记录。即使我把它改成这个,同样的交易:

const inMemoryDb = () => {
  console.log('inMemoryDB');
  return newDb();
}
inMemoryDb.public.none(fs.readFileSync('001-initial.sql', 'utf8'));
export default inMemoryDb();
例如,当我启动graphql服务时,当我运行
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代码中,它使用内存中的DB单例,如下所示(基于上面的第一个实现):


同意您的看法,即调用了console.log,但变量的值没有改变。 检查示例以供参考

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

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

您是否可以分享更多详细信息以复制问题,例如您是否使用任何捆绑程序(如webpack、babel等)以及您使用的插件。没有捆绑程序,这些都是服务,所以只需文件夹用于slack,文件夹用于graphql。其中包含一个package.json和一个tsconfig。只需使用tsconfig将文件输出到dist。同意您的看法,即调用会发生,并且会调用console,但变量值不会更改。检查示例您的测试是什么意思?什么样的测试以及你是如何运行测试的?不管怎样,我删除了测试部分,我写错了帖子。我在两个例子中都得到了多个控制台日志,而不仅仅是一个函数调用。在JS中,每个模块都是一个JS程序。因此,每当模块在其他文件中引用时,就会调用它。我希望这能回答你的问题。我不认为,根据es6规范,模块只被评估一次,即使它们被多次导入,但在嵌套项目中也有一些例外,因此模块的处理方式仍然不同于普通的js程序。因此,上述案例是SatishPai的一个例外
const inMemoryPgDb = inMemoryDb;