HTML Diff
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>