Я не уверен, почему модуль здесь, который имеет console.info, вызывается несколько раз. Я думал это синглтон.
Поэтому, если я импортирую этот модуль в другие модули, поскольку это синглтон, я не ожидал, что console.info будет вызываться каждый раз... только в первый раз, когда он импортируется модулем, но после этого я подумал, что даже при импорте последующими модулями, поскольку это синглтон, я не должен видеть, что тонна из них регистрируется:
src/graphql/db/InMemory/InMemoryDB.ts
console.info('inMemoryDB');
const inMemoryDb = newDb();
inMemoryDb.public.none(fs.readFileSync('001-initial.sql', 'utf8'));
export default inMemoryDb;
то, что я вижу, когда я запускаю первоначальные тесты или запускаю свою службу, которая использует этот синглтон, регистрируется 6-7 inMemoryDB. Даже после того, как я изменил его на это, та же сделка:
const inMemoryDb = () => {
console.info('inMemoryDB');
return newDb();
}
inMemoryDb.public.none(fs.readFileSync('001-initial.sql', 'utf8'));
export default inMemoryDb();
Так, например, когда я запускаю свой сервис graphql, я получаю около 6-7 этих console.infos при запуске yarn 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;
нет упаковщика, это сервисы, поэтому просто папка для слабины, папка для graphql. В них package.json и tsconfig. Просто использует tsconfig для вывода файлов на dist.
Согласен с вами, что вызов происходит и консоль вызывается, но значение переменной не меняется. Посмотрите пример codeandbox.io/s/es6-singletons-gwrv3?file=/src/secret.js
Что вы имеете в виду, ваши тесты? Какие тесты и как вы проводите тесты?
неважно, я удалил часть тестов, я написал не в том посте
Мне просто интересно, даже если значение ... экземпляр БД, созданный только один раз, не изменилось, и даже если бы у меня было несколько мест, импортирующих этот модуль, почему console.info вызывался бы каждый раз? Каждый ли импорт перезапускает весь код в этом модуле?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Согласен с вами, что вызов происходит и вызывается console.info, но значение переменной не меняется. Проверьте пример для справки
ОК, почему существует несколько console.info? В приведенном выше коде вы даете экземпляр функции с возвращаемым типом, и везде, где упоминается функция модуля, она вызывается. так как мы выполняем эту функцию.
Каждый модуль представляет собой отдельную программу JavaScript. Объединяет в одну программу во время исполнения.
Я получаю несколько журналов консоли в любом примере, а не только в одном с вызовом функции.
В JS каждый модуль представляет собой программу Js. Поэтому всякий раз, когда модуль упоминается в другом файле, он будет вызываться. Надеюсь, это ответ на ваш вопрос.
Я думаю, что нет, в соответствии со спецификациями es6 модули оцениваются только один раз, даже если они импортируются несколько раз, но есть некоторые исключения, когда речь идет о вложенных проектах, и поэтому модули обрабатываются иначе, чем обычная программа js. Так что приведенный выше случай является исключением @SatishPai
Можете ли вы поделиться более подробной информацией, чтобы воспроизвести проблему, например, используете ли вы какой-либо сборщик, такой как webpack, babel и т. д., и какие плагины вы используете.