0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Это перевод статьи Николаса Закаса, создателя ESLint и популярного автора, о дефолтном экспорте в JavaScript. Повествование ведётся от лица автора оригинальной публикации.</p>
1
<p>Это перевод статьи Николаса Закаса, создателя ESLint и популярного автора, о дефолтном экспорте в JavaScript. Повествование ведётся от лица автора оригинальной публикации.</p>
2
<p>В январе 2019 года я написал в "Твиттере" о планах отказаться от экспорта по умолчанию в модулях JavaScript. В ответ получил много неожиданных сообщений. Вот<a>текст поста</a>:</p>
2
<p>В январе 2019 года я написал в "Твиттере" о планах отказаться от экспорта по умолчанию в модулях JavaScript. В ответ получил много неожиданных сообщений. Вот<a>текст поста</a>:</p>
3
<blockquote><p>В 2019 году планирую отказаться от экспорта по умолчанию в модулях CommonJS/ES6. При импорте дефолтных экспортов шанс ошибиться составляет 50 на 50. Что я импортирую? Это класс? Это функция?</p>
3
<blockquote><p>В 2019 году планирую отказаться от экспорта по умолчанию в модулях CommonJS/ES6. При импорте дефолтных экспортов шанс ошибиться составляет 50 на 50. Что я импортирую? Это класс? Это функция?</p>
4
</blockquote><p>Написал этот пост, когда понял, что львиная доля проблем с модулями в JavaScript может быть связана с экспортом по умолчанию. Не имеет значения, идёт ли речь о модулях JavaScript (или ECMAScript, как многие любят говорить) или CommonJS. Я всякий раз спотыкаюсь при импорте дефолтных экспортов. В ответ на твит получил много вопросов, многие из которых касались того, как именно я пришёл к решению отказаться от экспорта по умолчанию. Эта статья - попытка ответить на все вопросы.</p>
4
</blockquote><p>Написал этот пост, когда понял, что львиная доля проблем с модулями в JavaScript может быть связана с экспортом по умолчанию. Не имеет значения, идёт ли речь о модулях JavaScript (или ECMAScript, как многие любят говорить) или CommonJS. Я всякий раз спотыкаюсь при импорте дефолтных экспортов. В ответ на твит получил много вопросов, многие из которых касались того, как именно я пришёл к решению отказаться от экспорта по умолчанию. Эта статья - попытка ответить на все вопросы.</p>
5
<h2>Содержание</h2>
5
<h2>Содержание</h2>
6
<ul><li><a>Несколько уточнений</a></li>
6
<ul><li><a>Несколько уточнений</a></li>
7
<li><a>Экспорт по умолчанию: основы</a></li>
7
<li><a>Экспорт по умолчанию: основы</a></li>
8
<li><a>Альтернатива: именованный экспорт</a></li>
8
<li><a>Альтернатива: именованный экспорт</a></li>
9
<li><a>Личные предпочтения</a></li>
9
<li><a>Личные предпочтения</a></li>
10
<li><a>Проблемы, с которыми я столкнулся</a></li>
10
<li><a>Проблемы, с которыми я столкнулся</a></li>
11
<li><a>Ограниченная поддержка инструментами разработки</a></li>
11
<li><a>Ограниченная поддержка инструментами разработки</a></li>
12
<li><a>Заключение</a></li>
12
<li><a>Заключение</a></li>
13
</ul><h2>Несколько уточнений</h2>
13
</ul><h2>Несколько уточнений</h2>
14
<p>Как и все остальные мои твиты, твит об отказе от дефолтных экспортов был скорее снепшотом или кратким выражением моего мнения, а не публикацией мнения целиком. Нужно прояснить несколько моментов, которые смутили подписчиков в твиттере.</p>
14
<p>Как и все остальные мои твиты, твит об отказе от дефолтных экспортов был скорее снепшотом или кратким выражением моего мнения, а не публикацией мнения целиком. Нужно прояснить несколько моментов, которые смутили подписчиков в твиттере.</p>
15
<ul><li>Упоминание кейса с классами и функциями - только один из примеров проблем, с которыми я сталкиваюсь при использовании экспорта по умолчанию. Это далеко не единственная проблема, которую я решил с помощью именованного экспорта.</li>
15
<ul><li>Упоминание кейса с классами и функциями - только один из примеров проблем, с которыми я сталкиваюсь при использовании экспорта по умолчанию. Это далеко не единственная проблема, которую я решил с помощью именованного экспорта.</li>
16
<li>Проблемы, с которыми я столкнулся, проявляются не только при работе с файлами в моих собственных проектах. Они также возникают при импорте библиотек и служебных модулей, которые не принадлежат мне. Это значит, что соглашения об именовании файлов не решают все проблемы.</li>
16
<li>Проблемы, с которыми я столкнулся, проявляются не только при работе с файлами в моих собственных проектах. Они также возникают при импорте библиотек и служебных модулей, которые не принадлежат мне. Это значит, что соглашения об именовании файлов не решают все проблемы.</li>
17
<li>Я не говорю, что всем нужно уходить от экспорта по умолчанию. Я говорю, что в модулях, которые пишу я, планирую отказаться от дефолтного экспорта. У вас может быть другое мнение и другие планы, и это хорошо.</li>
17
<li>Я не говорю, что всем нужно уходить от экспорта по умолчанию. Я говорю, что в модулях, которые пишу я, планирую отказаться от дефолтного экспорта. У вас может быть другое мнение и другие планы, и это хорошо.</li>
18
</ul><p>Надеюсь, эти уточнения снимут большую часть вопросов, которые возникли у моих подписчиков.</p>
18
</ul><p>Надеюсь, эти уточнения снимут большую часть вопросов, которые возникли у моих подписчиков.</p>
19
<h2>Экспорт по умолчанию: основы</h2>
19
<h2>Экспорт по умолчанию: основы</h2>
20
<p>Насколько я знаю, экспорт по умолчанию впервые стал популярным в CommonJS, где модуль можно экспортировать так:</p>
20
<p>Насколько я знаю, экспорт по умолчанию впервые стал популярным в CommonJS, где модуль можно экспортировать так:</p>
21
<p>Здесь экспортируется класс<em>LinkedList</em>, но при этом не определяется имя класса для пользователей модуля. Если имя файла -<em>linked-list.js</em>, можно импортировать этот дефолтный экспорт в другой модуль CommonJS так:</p>
21
<p>Здесь экспортируется класс<em>LinkedList</em>, но при этом не определяется имя класса для пользователей модуля. Если имя файла -<em>linked-list.js</em>, можно импортировать этот дефолтный экспорт в другой модуль CommonJS так:</p>
22
<p>Функция<em>require()</em>возвращает значение, которое я только что назвал<em>LinkedList</em>, чтобы оно соответствовало содержимому файла<em>linked-list.js</em>. Но я также мог назвать его<em>foo</em>или<em>Mountain</em>или любым другим именем.</p>
22
<p>Функция<em>require()</em>возвращает значение, которое я только что назвал<em>LinkedList</em>, чтобы оно соответствовало содержимому файла<em>linked-list.js</em>. Но я также мог назвать его<em>foo</em>или<em>Mountain</em>или любым другим именем.</p>
23
<p>Популярность экспорта по умолчанию в CommonJS привела к тому, что модули JavaScript разрабатывались с учётом необходимости поддержки этого паттерна:</p>
23
<p>Популярность экспорта по умолчанию в CommonJS привела к тому, что модули JavaScript разрабатывались с учётом необходимости поддержки этого паттерна:</p>
24
<blockquote><p>В ES6 предпочтительно использовать экспорт по умолчанию. Он позволяет использовать приятный синтаксис при импорте экспортированных по умолчанию модулей.</p>
24
<blockquote><p>В ES6 предпочтительно использовать экспорт по умолчанию. Он позволяет использовать приятный синтаксис при импорте экспортированных по умолчанию модулей.</p>
25
</blockquote><p>В JavaScript можно экспортировать по умолчанию так:</p>
25
</blockquote><p>В JavaScript можно экспортировать по умолчанию так:</p>
26
<p>Импорт выглядит так:</p>
26
<p>Импорт выглядит так:</p>
27
<p>Опять же,<em>LinkedList</em>в данном случае - произвольное имя. С таким же успехом можно использовать<em>Dog</em>или<em>symphony</em>.</p>
27
<p>Опять же,<em>LinkedList</em>в данном случае - произвольное имя. С таким же успехом можно использовать<em>Dog</em>или<em>symphony</em>.</p>
28
<h2>Альтернатива: именованный экспорт</h2>
28
<h2>Альтернатива: именованный экспорт</h2>
29
<p>Кроме экспорта по умолчанию, CommonJS и JavaScript поддерживают именованный экспорт. Именованный экспорт позволяет передавать имена функций, классов, переменных в файл, где они будут использоваться.</p>
29
<p>Кроме экспорта по умолчанию, CommonJS и JavaScript поддерживают именованный экспорт. Именованный экспорт позволяет передавать имена функций, классов, переменных в файл, где они будут использоваться.</p>
30
<p>В CommonJS именованный экспорт выполняется путём присоединения соответствующего имени к объекту<em>exports</em>. Пример ниже.</p>
30
<p>В CommonJS именованный экспорт выполняется путём присоединения соответствующего имени к объекту<em>exports</em>. Пример ниже.</p>
31
<p>Импорт выглядит так:</p>
31
<p>Импорт выглядит так:</p>
32
<p>Опять же, константу можно было назвать как угодно, но я решил, что имя должно совпадать с экспортированным -<em>LinkedList</em>.</p>
32
<p>Опять же, константу можно было назвать как угодно, но я решил, что имя должно совпадать с экспортированным -<em>LinkedList</em>.</p>
33
<p>В JavaScript именованный экспорт выглядит так:</p>
33
<p>В JavaScript именованный экспорт выглядит так:</p>
34
<p>Импорт будет таким:</p>
34
<p>Импорт будет таким:</p>
35
<p>В этом примере<em>LinkedList</em>- не случайный идентификатор. Он должен совпадать с именованным экспортом<em>LinkedList</em>. Это единственное важное отличие JavaScript от CommonJS в контексте вопросов, которые рассматриваются в этой статье.</p>
35
<p>В этом примере<em>LinkedList</em>- не случайный идентификатор. Он должен совпадать с именованным экспортом<em>LinkedList</em>. Это единственное важное отличие JavaScript от CommonJS в контексте вопросов, которые рассматриваются в этой статье.</p>
36
<p>Промежуточный итог: в CommonJS и JavaScript поддерживается как экспорт по умолчанию, так и именованный экспорт.</p>
36
<p>Промежуточный итог: в CommonJS и JavaScript поддерживается как экспорт по умолчанию, так и именованный экспорт.</p>
37
<h2>Личные предпочтения</h2>
37
<h2>Личные предпочтения</h2>
38
<p>Прежде чем идти дальше, стоит поделиться личными предпочтениями при работе с кодом. Это общие принципы, которых я придерживаюсь, когда пишу код на любом языке программирования:</p>
38
<p>Прежде чем идти дальше, стоит поделиться личными предпочтениями при работе с кодом. Это общие принципы, которых я придерживаюсь, когда пишу код на любом языке программирования:</p>
39
<ol><li>Явное лучше неявного. Мне не нравится код с секретами. Например, название функции должно явно отражать то, что функция делает.</li>
39
<ol><li>Явное лучше неявного. Мне не нравится код с секретами. Например, название функции должно явно отражать то, что функция делает.</li>
40
<li>Имена должны быть одинаковыми во всех файлах. Если что-то имеет имя<em>Apple</em>в одном файле, оно не должно называться<em>Orange</em>в другом.<em>Apple</em>всегда остаётся<em>Apple</em>.</li>
40
<li>Имена должны быть одинаковыми во всех файлах. Если что-то имеет имя<em>Apple</em>в одном файле, оно не должно называться<em>Orange</em>в другом.<em>Apple</em>всегда остаётся<em>Apple</em>.</li>
41
<li>Бросайте ошибки как можно раньше и как можно чаще. Если есть вероятность где-то ошибиться, лучше проверить как можно раньше и по возможности бросить ошибку, которая предупредит о проблеме. Не хочу ждать, пока код выполнится, чтобы понять, что он работает некорректно, а потом искать проблему.</li>
41
<li>Бросайте ошибки как можно раньше и как можно чаще. Если есть вероятность где-то ошибиться, лучше проверить как можно раньше и по возможности бросить ошибку, которая предупредит о проблеме. Не хочу ждать, пока код выполнится, чтобы понять, что он работает некорректно, а потом искать проблему.</li>
42
<li>Меньше решений - быстрее разработка. Многие из моих предпочтений нужны, чтобы принимать меньше решений. Каждое решение, которое нужно принять, замедляет вас. Поэтому вещи типа общепринятых стандартов помогают писать код быстрее. Я хочу решить всё заранее, а потом просто работать.</li>
42
<li>Меньше решений - быстрее разработка. Многие из моих предпочтений нужны, чтобы принимать меньше решений. Каждое решение, которое нужно принять, замедляет вас. Поэтому вещи типа общепринятых стандартов помогают писать код быстрее. Я хочу решить всё заранее, а потом просто работать.</li>
43
<li>Прогулки по неизвестным тропинкам замедляют разработку. Всякий раз, когда вы вынуждены прерывать написание кода и искать что-то, вы гуляете по неизвестной тропинке. Без таких прогулок не обойтись. Но есть много необязательных прогулок по неизвестным путям, которые замедляют вас. Я стараюсь писать код так, чтобы исключить необходимость таких прогулок.</li>
43
<li>Прогулки по неизвестным тропинкам замедляют разработку. Всякий раз, когда вы вынуждены прерывать написание кода и искать что-то, вы гуляете по неизвестной тропинке. Без таких прогулок не обойтись. Но есть много необязательных прогулок по неизвестным путям, которые замедляют вас. Я стараюсь писать код так, чтобы исключить необходимость таких прогулок.</li>
44
<li>Когнитивные перегрузки замедляют разработку. Здесь всё просто: чем больше деталей вам надо помнить, чтобы продуктивно писать код, тем медленнее вы разрабатываете.</li>
44
<li>Когнитивные перегрузки замедляют разработку. Здесь всё просто: чем больше деталей вам надо помнить, чтобы продуктивно писать код, тем медленнее вы разрабатываете.</li>
45
</ol><p>Важный момент: для меня важен фокус на скорости разработки. Поскольку здоровье с годами ухудшается, энергии на работу с кодом остаётся всё меньше. Всё, что помогает сократить время на написания кода без ущерба для результата, я приветствую.</p>
45
</ol><p>Важный момент: для меня важен фокус на скорости разработки. Поскольку здоровье с годами ухудшается, энергии на работу с кодом остаётся всё меньше. Всё, что помогает сократить время на написания кода без ущерба для результата, я приветствую.</p>
46
<h2>Проблемы, с которыми я столкнулся</h2>
46
<h2>Проблемы, с которыми я столкнулся</h2>
47
<p>С учётом сказанного выше, я сформулировал основные проблемы, с которыми сталкиваюсь при экспорте по умолчанию, и которые можно решить с помощь именованного экспорта.</p>
47
<p>С учётом сказанного выше, я сформулировал основные проблемы, с которыми сталкиваюсь при экспорте по умолчанию, и которые можно решить с помощь именованного экспорта.</p>
48
<h3>Что это я импортировал?</h3>
48
<h3>Что это я импортировал?</h3>
49
<p>Как сказано в моём твите, при использовании экспорта по умолчанию сложно разобраться, что именно я импортирую. Если вы работаете с модулем или файлом, который не знаете, сложно понять, что он возвращает. Пример:</p>
49
<p>Как сказано в моём твите, при использовании экспорта по умолчанию сложно разобраться, что именно я импортирую. Если вы работаете с модулем или файлом, который не знаете, сложно понять, что он возвращает. Пример:</p>
50
<p>В контексте этого примера попробуйте понять, что такое<em>list</em>. Вряд ли это примитивное значение, но это может быть функция, класс или другой тип объекта. Как я могу узнать это наверняка? Понадобится дополнительное исследование или прогулка по неизвестной тропинке. В этом случае могут понадобиться такие действия:</p>
50
<p>В контексте этого примера попробуйте понять, что такое<em>list</em>. Вряд ли это примитивное значение, но это может быть функция, класс или другой тип объекта. Как я могу узнать это наверняка? Понадобится дополнительное исследование или прогулка по неизвестной тропинке. В этом случае могут понадобиться такие действия:</p>
51
<ul><li>Если<em>list.js</em>принадлежит мне, придётся открыть файл и разобраться, что из него экспортируется.</li>
51
<ul><li>Если<em>list.js</em>принадлежит мне, придётся открыть файл и разобраться, что из него экспортируется.</li>
52
<li>Если list.js не принадлежит мне, придётся читать документацию.</li>
52
<li>Если list.js не принадлежит мне, придётся читать документацию.</li>
53
</ul><p>В любом случае, придётся запомнить дополнительную информацию, чтобы не возвращаться к изучению файла или чтению документации, когда понадобится новый импорт из<em>list.js</em>. При импорте экспортированных по умолчанию сущностей увеличивается когнитивная перегрузка, так как вам приходится либо запоминать дополнительную информацию, либо дополнительно изучать что-то. Это неоптимальная стратегия.</p>
53
</ul><p>В любом случае, придётся запомнить дополнительную информацию, чтобы не возвращаться к изучению файла или чтению документации, когда понадобится новый импорт из<em>list.js</em>. При импорте экспортированных по умолчанию сущностей увеличивается когнитивная перегрузка, так как вам приходится либо запоминать дополнительную информацию, либо дополнительно изучать что-то. Это неоптимальная стратегия.</p>
54
<p>Кто-то скажет, что эту проблему решают IDE, так как они достаточно "умные" для того, чтобы подсказывать, что именно вы импортируете. Я поддерживаю использование IDE, так как они действительно помогают разработчикам. Но требовать от IDE эффективного использования функций языка - проблематичный подход.</p>
54
<p>Кто-то скажет, что эту проблему решают IDE, так как они достаточно "умные" для того, чтобы подсказывать, что именно вы импортируете. Я поддерживаю использование IDE, так как они действительно помогают разработчикам. Но требовать от IDE эффективного использования функций языка - проблематичный подход.</p>
55
<h3>Проблема соответствия имён</h3>
55
<h3>Проблема соответствия имён</h3>
56
<p>Использование именованного экспорта требует, чтобы в файлах-пользователях как минимум определялось имя сущности, которая импортируется. Преимущество в том, что я могу легко найти все случаи использования<em>LinkedList</em>в коде и понять, что это один и тот же<em>LinkedList</em>. В отличие от экспорта по умолчанию, где не надо держать в уме имена, при именованном экспорте разработчик прилагает дополнительные когнитивные усилия. Вы должны выработать правильный подход к именованию, а также должны убедиться, что все разработчики, которые работают над приложением, используют одни и те же имена. Конечно, можно разрешить разработчикам использовать разные имена, но это ещё сильнее усилит когнитивную перегрузку.</p>
56
<p>Использование именованного экспорта требует, чтобы в файлах-пользователях как минимум определялось имя сущности, которая импортируется. Преимущество в том, что я могу легко найти все случаи использования<em>LinkedList</em>в коде и понять, что это один и тот же<em>LinkedList</em>. В отличие от экспорта по умолчанию, где не надо держать в уме имена, при именованном экспорте разработчик прилагает дополнительные когнитивные усилия. Вы должны выработать правильный подход к именованию, а также должны убедиться, что все разработчики, которые работают над приложением, используют одни и те же имена. Конечно, можно разрешить разработчикам использовать разные имена, но это ещё сильнее усилит когнитивную перегрузку.</p>
57
<p>Импорт именованного экспорта означает как минимум указание канонического имени сущности везде, где она используется. Даже если вы решите переименовать импорт, это решение будет явным, и его невозможно выполнить без указания канонического имени. Пример в CommonJS:</p>
57
<p>Импорт именованного экспорта означает как минимум указание канонического имени сущности везде, где она используется. Даже если вы решите переименовать импорт, это решение будет явным, и его невозможно выполнить без указания канонического имени. Пример в CommonJS:</p>
58
<p>Пример в JavaScript:</p>
58
<p>Пример в JavaScript:</p>
59
<p>В каждом из этих примеров вы явно указываете, что<em>LinkedList</em>будет использоваться как<em>MyList</em>.</p>
59
<p>В каждом из этих примеров вы явно указываете, что<em>LinkedList</em>будет использоваться как<em>MyList</em>.</p>
60
<p>Когда в коде принято согласованное именование, вы можете:</p>
60
<p>Когда в коде принято согласованное именование, вы можете:</p>
61
<ol><li>Искать в кодовой базе информацию об использовании сущности.</li>
61
<ol><li>Искать в кодовой базе информацию об использовании сущности.</li>
62
<li>Изменять имя сущности во всей кодовой базе.</li>
62
<li>Изменять имя сущности во всей кодовой базе.</li>
63
</ol><p>Возможно ли это при использовании экспорта по умолчанию и именовании по принципу ad hoc? Догадываюсь, что возможно. Но также думаю, что это будет намного сложнее, к тому же, увеличится вероятность ошибок.</p>
63
</ol><p>Возможно ли это при использовании экспорта по умолчанию и именовании по принципу ad hoc? Догадываюсь, что возможно. Но также думаю, что это будет намного сложнее, к тому же, увеличится вероятность ошибок.</p>
64
<blockquote><p>Ad hoc - латинское выражение, которое применяется для обозначения исключительных случаев, специальных процедур, которые не укладываются в общую практику.</p>
64
<blockquote><p>Ad hoc - латинское выражение, которое применяется для обозначения исключительных случаев, специальных процедур, которые не укладываются в общую практику.</p>
65
</blockquote><h3>Импорт неправильной сущности</h3>
65
</blockquote><h3>Импорт неправильной сущности</h3>
66
<p>Именованный экспорт в модулях JavaScript имеет важное преимущество перед экспортом по умолчанию. Если вы попробуете импортировать несуществующую сущность, при использовании именованного экспорта будет выброшена ошибка. Посмотрите на этот код:</p>
66
<p>Именованный экспорт в модулях JavaScript имеет важное преимущество перед экспортом по умолчанию. Если вы попробуете импортировать несуществующую сущность, при использовании именованного экспорта будет выброшена ошибка. Посмотрите на этот код:</p>
67
<p>Если в list.js нету LinkedList, будет выброшена ошибка. Более того, IDE и ESLint определяют недостающие ссылки ещё до выполнения кода.</p>
67
<p>Если в list.js нету LinkedList, будет выброшена ошибка. Более того, IDE и ESLint определяют недостающие ссылки ещё до выполнения кода.</p>
68
<h2>Ограниченная поддержка инструментами разработки</h2>
68
<h2>Ограниченная поддержка инструментами разработки</h2>
69
<p>Если вернуться к IDE, можно напомнить, что WebStorm может помогать разработчику определять импорты. Если вы введёте идентификатор, который не определён в файле, WebStorm автоматически начнёт искать этот идентификатор в именованных экспортах в модулях вашего проекта. В этот момент он может выполнить любое из указанных действий:</p>
69
<p>Если вернуться к IDE, можно напомнить, что WebStorm может помогать разработчику определять импорты. Если вы введёте идентификатор, который не определён в файле, WebStorm автоматически начнёт искать этот идентификатор в именованных экспортах в модулях вашего проекта. В этот момент он может выполнить любое из указанных действий:</p>
70
<ol><li>Подчеркнуть идентификатор, который не определён, и показать импорт.</li>
70
<ol><li>Подчеркнуть идентификатор, который не определён, и показать импорт.</li>
71
<li>Автоматически добавить импорт если вы разрешили автоимпорт.</li>
71
<li>Автоматически добавить импорт если вы разрешили автоимпорт.</li>
72
</ol><p>Как видите, WebStorm действительно помогает вам с именованным импортом. Для Visual Studio Code есть плагин с аналогичной функциональностью. А при использовании экспорта по умолчанию эта функциональность не работает, так как канонического имени для сущности, которую вы импортируете, не существует.</p>
72
</ol><p>Как видите, WebStorm действительно помогает вам с именованным импортом. Для Visual Studio Code есть плагин с аналогичной функциональностью. А при использовании экспорта по умолчанию эта функциональность не работает, так как канонического имени для сущности, которую вы импортируете, не существует.</p>
73
<h2>Заключение</h2>
73
<h2>Заключение</h2>
74
<p>Я сталкивался с несколькими проблемами, которые снижали продуктивность, когда пользовался экспортом по умолчанию. Хотя среди этих проблем нет непреодолимых, использование именованного экспорта и импорта всё-таки больше подходит мне. Моя продуктивность растёт, когда я делаю вещи явно и использую автоматические инструменты. Именованный экспорт помогает мне, поэтому я буду использовать его в обозримой перспективе. Конечно, я не могу влиять на то, какой экспорт используют разработчики внешних модулей, которые я использую. Но я точно контролирую свои модули, и в них я буду использовать именованный экспорт.</p>
74
<p>Я сталкивался с несколькими проблемами, которые снижали продуктивность, когда пользовался экспортом по умолчанию. Хотя среди этих проблем нет непреодолимых, использование именованного экспорта и импорта всё-таки больше подходит мне. Моя продуктивность растёт, когда я делаю вещи явно и использую автоматические инструменты. Именованный экспорт помогает мне, поэтому я буду использовать его в обозримой перспективе. Конечно, я не могу влиять на то, какой экспорт используют разработчики внешних модулей, которые я использую. Но я точно контролирую свои модули, и в них я буду использовать именованный экспорт.</p>
75
<p>Ещё раз напоминаю, что всё вышесказанное - моё личное мнение, и вы можете считать его недостаточно убедительным. Эта статья написана не для того, чтобы убедить кого-то отказаться от экспорта по умолчанию. Это всего лишь объяснение моего решения не использовать экспорт по умолчанию в модулях, которые я пишу.</p>
75
<p>Ещё раз напоминаю, что всё вышесказанное - моё личное мнение, и вы можете считать его недостаточно убедительным. Эта статья написана не для того, чтобы убедить кого-то отказаться от экспорта по умолчанию. Это всего лишь объяснение моего решения не использовать экспорт по умолчанию в модулях, которые я пишу.</p>
76
<p><em>Адаптированный перевод статьи<a>Why I've stopped exporting defaults from my JavaScript modules</a>by Nicholas C. Zakas. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.</em></p>
76
<p><em>Адаптированный перевод статьи<a>Why I've stopped exporting defaults from my JavaScript modules</a>by Nicholas C. Zakas. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.</em></p>