Импорт дубликатов ES6?

Я пытаюсь сохранить мой код (на стороне сервера и клиента) как можно более модульным, и это требует большого количества импорта и экспорта, однако у меня есть вопрос без ответа.

Я пытался искать отсюда, я читал тематические сообщения в блоге и даже смотрел несколько видео YT, но это все еще не полностью объяснено. Я хотел бы избежать этой ошибки прямо сейчас и избегать переписывания моей логики позже.


File1

import React from 'react';

// do something

File2

import React from 'react';

// do something else

file3

import File1 from './file1';
import File2 from './file2';

// do something with both

  • Это достаточно умно? Могу ли я импортировать то же самое модуль столько, сколько я хочу, и он импортирует его только один раз?
  • Что если мне нужно import React тоже File3? Это все еще достаточно умен, чтобы справиться с этой ситуацией?

Я использую Node, Babel и Webpack.

Ответ 1

Когда вы импортируете модуль через Node (и, соответственно, через Webpack, поскольку он фактически следует тем же правилам, что и при разрешении модуля), код в файле выполняется один раз, затем результирующий экспорт кэшируется. Это означает, что в обоих ваших файлах React будет ссылкой на один и тот же объект. Таким образом, ваше предположение верно: Webpack действительно достаточно умен, чтобы не выполнять React файл с полным исходным кодом каждый раз, когда вы импортируете его.

Вы можете легко проверить это сами - добавьте console.log() к модулю, который импортирован в несколько мест в вашем приложении (убедитесь, что он не входит в функцию или что-либо еще, что может отложить его выполнение). Вы увидите, что журнал создается только один раз, а не один раз за импорт!

Обновление: Также стоит отметить, что спецификация для модулей ES2015 фактически перечисляет это как требование для любой реализации:

Эта операция должна быть идемпотентной, если она завершается нормально. Каждый раз, когда он вызывается с определенной парой referencingModule, specifier в качестве аргументов, он должен возвращать один и тот же экземпляр модульной записи.