0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Представьте себе поселенцев, строящих свой первый маленький городок. В нем всего несколько зданий: пара домов, почта и вокзал. Он такой маленький, что люди могут указывать любое здание по названию: "давай встретимся у почты" или "я живу во втором доме".</p>
1
<p>Представьте себе поселенцев, строящих свой первый маленький городок. В нем всего несколько зданий: пара домов, почта и вокзал. Он такой маленький, что люди могут указывать любое здание по названию: "давай встретимся у почты" или "я живу во втором доме".</p>
2
<p>С ростом города строилось больше зданий. Вскоре людям пришлось делать выбор:</p>
2
<p>С ростом города строилось больше зданий. Вскоре людям пришлось делать выбор:</p>
3
<ul><li>давать каждому новому зданию уникальный номер или название</li>
3
<ul><li>давать каждому новому зданию уникальный номер или название</li>
4
<li>дробить город на улицы</li>
4
<li>дробить город на улицы</li>
5
</ul><p>Конечно, они могли использовать первый способ и просто давать уникальные номера и названия новым строениям, чтобы никогда не было двух зданий с номером 5. Это подходящее, но не самое гениальное решение, особенно для крупного города. Мой адрес: "Нью-Йорк, здание 654 931". Звучит как ерунда.</p>
5
</ul><p>Конечно, они могли использовать первый способ и просто давать уникальные номера и названия новым строениям, чтобы никогда не было двух зданий с номером 5. Это подходящее, но не самое гениальное решение, особенно для крупного города. Мой адрес: "Нью-Йорк, здание 654 931". Звучит как ерунда.</p>
6
<p>Большинство выбирает второй путь: делить город на улицы, обычно - прямые линии, и идентификаторы домов - названия или цифры - становятся уникальными в пределах улицы. В городе много зданий с номером 5, но они все расположены на разных улицах, поэтому все в порядке.</p>
6
<p>Большинство выбирает второй путь: делить город на улицы, обычно - прямые линии, и идентификаторы домов - названия или цифры - становятся уникальными в пределах улицы. В городе много зданий с номером 5, но они все расположены на разных улицах, поэтому все в порядке.</p>
7
<p>Именно поэтому в вашем компьютере есть директории. Без них все ваши файлы хранились бы в одном месте, где вы не смогли бы хранить два файла с одинаковым названием. Когда есть директории, то создавая новый файл, вам нужно заботиться об именах только в текущей директории.</p>
7
<p>Именно поэтому в вашем компьютере есть директории. Без них все ваши файлы хранились бы в одном месте, где вы не смогли бы хранить два файла с одинаковым названием. Когда есть директории, то создавая новый файл, вам нужно заботиться об именах только в текущей директории.</p>
8
<p>Эта система деления чего угодно на улицы, блоки или директории позволяет нам объединять вещи в значимые модули. Уолл-стрит - это улица банков и финансов. Своеобразный модуль Нью-Йорка с собственной задачей. У вас есть директория "Видео" и вы знаете, что она только для особого типа файлов - видео.</p>
8
<p>Эта система деления чего угодно на улицы, блоки или директории позволяет нам объединять вещи в значимые модули. Уолл-стрит - это улица банков и финансов. Своеобразный модуль Нью-Йорка с собственной задачей. У вас есть директория "Видео" и вы знаете, что она только для особого типа файлов - видео.</p>
9
<p>Первые программисты были поселенцами в новом и странном мире компьютеров. Они столкнулись с подобной проблемой и встали перед выбором.</p>
9
<p>Первые программисты были поселенцами в новом и странном мире компьютеров. Они столкнулись с подобной проблемой и встали перед выбором.</p>
10
<p>Они могли писать весь код в едином файле, и тогда все - численные и строковые константы, переменные и функции должны были бы иметь уникальные имена. А если бы они захотели переиспользовать какой-то код в другом проекте, им бы потребовалось копировать его из этого гигантского файла и вставлять его в другой гигантский файл.</p>
10
<p>Они могли писать весь код в едином файле, и тогда все - численные и строковые константы, переменные и функции должны были бы иметь уникальные имена. А если бы они захотели переиспользовать какой-то код в другом проекте, им бы потребовалось копировать его из этого гигантского файла и вставлять его в другой гигантский файл.</p>
11
<p>Или они могли бы пойти вторым путем: разделить код на небольшие модули. Модули могут храниться в отдельных файлах, а имена функций и констант будут уникальными только в пределах файла, но не во всей программе. И модули можно легко переиспользовать в разных проектах, без копирования и вставки.</p>
11
<p>Или они могли бы пойти вторым путем: разделить код на небольшие модули. Модули могут храниться в отдельных файлах, а имена функций и констант будут уникальными только в пределах файла, но не во всей программе. И модули можно легко переиспользовать в разных проектах, без копирования и вставки.</p>
12
<p>У разных языков программирования разные подходы к этой задаче. В JavaScript он довольно простой: один файл - один модуль. Все упражнения, которые вы выполняете в этом курсе - это написание модулей.</p>
12
<p>У разных языков программирования разные подходы к этой задаче. В JavaScript он довольно простой: один файл - один модуль. Все упражнения, которые вы выполняете в этом курсе - это написание модулей.</p>
13
<p>Иногда нам нужно объединять код из разных файлов. Если вы просто напишете код в разных файлах, интерпретатор JavaScript не поймет, как получить что-то из другого файла.</p>
13
<p>Иногда нам нужно объединять код из разных файлов. Если вы просто напишете код в разных файлах, интерпретатор JavaScript не поймет, как получить что-то из другого файла.</p>
14
<h3>Экспорт и два способа импорта</h3>
14
<h3>Экспорт и два способа импорта</h3>
15
<p>Давайте посмотрим на пример, где у нас есть файл math.js:</p>
15
<p>Давайте посмотрим на пример, где у нас есть файл math.js:</p>
16
<p>Это наша крошечная математическая библиотека.</p>
16
<p>Это наша крошечная математическая библиотека.</p>
17
<p>Создадим другой файл под именем planets.js со следующим содержанием:</p>
17
<p>Создадим другой файл под именем planets.js со следующим содержанием:</p>
18
<p>Код здесь не будет работать, потому что surfaceArea и square здесь не существуют. Они в другом файле, о котором JavaScript пока не знает. Нам нужно сказать ему заглянуть в другой файл. Это называется "импортом" - давайте импортируем именно те функции, что нам нужны, по их имени:</p>
18
<p>Код здесь не будет работать, потому что surfaceArea и square здесь не существуют. Они в другом файле, о котором JavaScript пока не знает. Нам нужно сказать ему заглянуть в другой файл. Это называется "импортом" - давайте импортируем именно те функции, что нам нужны, по их имени:</p>
19
<p>Ключевое слово import, затем список того, что мы хотим, в фигурных скобках, а затем название модуля. Файл в той же директории, что и planets.js, поэтому './math.js' означает "взять из файла math.js, расположенного в той же (текущей) директории".</p>
19
<p>Ключевое слово import, затем список того, что мы хотим, в фигурных скобках, а затем название модуля. Файл в той же директории, что и planets.js, поэтому './math.js' означает "взять из файла math.js, расположенного в той же (текущей) директории".</p>
20
<p>Когда вы импортируете что-то из Китая, что происходит в Китае? Верно, экспорт. Поэтому наша математическая библиотека должна исполнить свою роль - "экспортировать".</p>
20
<p>Когда вы импортируете что-то из Китая, что происходит в Китае? Верно, экспорт. Поэтому наша математическая библиотека должна исполнить свою роль - "экспортировать".</p>
21
<p>Поставьте export перед тем, что вы хотите экспортировать. Такая операция сделает это импортируемым куда угодно:</p>
21
<p>Поставьте export перед тем, что вы хотите экспортировать. Такая операция сделает это импортируемым куда угодно:</p>
22
<p>Просто укажите export перед чем угодно, и это можно будет "импортировать" в другой файл. Тут мы экспортируем все. Еще один способ экспортировать несколько значений:</p>
22
<p>Просто укажите export перед чем угодно, и это можно будет "импортировать" в другой файл. Тут мы экспортируем все. Еще один способ экспортировать несколько значений:</p>
23
<p>Возвратимся к planets.js. Допустим, мы хотим импортировать что-то еще. Мы можем просто добавить названия в список:</p>
23
<p>Возвратимся к planets.js. Допустим, мы хотим импортировать что-то еще. Мы можем просто добавить названия в список:</p>
24
<p>Или импортировать все сразу:</p>
24
<p>Или импортировать все сразу:</p>
25
<p>Это значит: "импортировать весь модуль и назвать его mathematics в этом модуле". Вот почему к импортированным сущностям обращение происходит через mathematics, например, mathematics.surfaceArea:</p>
25
<p>Это значит: "импортировать весь модуль и назвать его mathematics в этом модуле". Вот почему к импортированным сущностям обращение происходит через mathematics, например, mathematics.surfaceArea:</p>
26
<p><em>mathematics</em>+ точка + имя функции.</p>
26
<p><em>mathematics</em>+ точка + имя функции.</p>
27
<p>Теперь, если мы добавим функцию square в этот же файл, никакого конфликта не возникнет:</p>
27
<p>Теперь, если мы добавим функцию square в этот же файл, никакого конфликта не возникнет:</p>
28
<p>В этом примере в первом случае была вызвана функция возведения в квадрат из модуля math, а во втором случае был вызов местной функции неправильного возведения в квадрат.</p>
28
<p>В этом примере в первом случае была вызвана функция возведения в квадрат из модуля math, а во втором случае был вызов местной функции неправильного возведения в квадрат.</p>
29
<h3>Экспорт по умолчанию</h3>
29
<h3>Экспорт по умолчанию</h3>
30
<p>И последнее: часто вам требуется экспортировать из модуля что-то одно. Существует специальный механизм, который называется "экспорт по умолчанию", и вы можете экспортировать с помощью него только что-то одно. Но экспортированную по умолчанию вещь проще импортировать.</p>
30
<p>И последнее: часто вам требуется экспортировать из модуля что-то одно. Существует специальный механизм, который называется "экспорт по умолчанию", и вы можете экспортировать с помощью него только что-то одно. Но экспортированную по умолчанию вещь проще импортировать.</p>
31
<p>Можно также экспортировать функцию или константу без имени:</p>
31
<p>Можно также экспортировать функцию или константу без имени:</p>
32
<p>Просто напишите код, как обычно, без специально указанных экспортов, а в конце выполните export default что-нибудь. В данном случае мы экспортируем функцию surfaceArea.</p>
32
<p>Просто напишите код, как обычно, без специально указанных экспортов, а в конце выполните export default что-нибудь. В данном случае мы экспортируем функцию surfaceArea.</p>
33
<p>Импорт по умолчанию выглядит так:</p>
33
<p>Импорт по умолчанию выглядит так:</p>
34
<p>При экспорте функции без имени, ее имя в модуле будет определяться в момент импорта, т.е. один и тот же экспорт может иметь разные имена в разных модулях:</p>
34
<p>При экспорте функции без имени, ее имя в модуле будет определяться в момент импорта, т.е. один и тот же экспорт может иметь разные имена в разных модулях:</p>
35
<p><strong>math.js</strong></p>
35
<p><strong>math.js</strong></p>
36
<p><strong>import1.js:</strong></p>
36
<p><strong>import1.js:</strong></p>
37
<p><strong>import2.js:</strong></p>
37
<p><strong>import2.js:</strong></p>
38
<p>Экспорт по умолчанию может сочетаться с обычным экспортом, а экспортировать элементы можно по отдельности:</p>
38
<p>Экспорт по умолчанию может сочетаться с обычным экспортом, а экспортировать элементы можно по отдельности:</p>
39
<p>Импорт может выглядеть так:</p>
39
<p>Импорт может выглядеть так:</p>
40
<p>Ключевое слово as позволяет задать псевдоним для импортируемой сущности. Благодаря этому появляется возможность импортировать элементы с одинаковыми именами:</p>
40
<p>Ключевое слово as позволяет задать псевдоним для импортируемой сущности. Благодаря этому появляется возможность импортировать элементы с одинаковыми именами:</p>
41
<h3>Расширение файла при импорте модуля</h3>
41
<h3>Расширение файла при импорте модуля</h3>
42
<p>Указание расширения файла гарантирует, что он будет проанализирован как модуль<a>Node.js</a>и<a>d8</a>и другими средами выполнения, а также<a>Babel</a>и другими инструментами сборки. Если Babel разрешает опустить расширение файла, то<a>официальная документация Node.js</a>устанавливает конкретное требование:</p>
42
<p>Указание расширения файла гарантирует, что он будет проанализирован как модуль<a>Node.js</a>и<a>d8</a>и другими средами выполнения, а также<a>Babel</a>и другими инструментами сборки. Если Babel разрешает опустить расширение файла, то<a>официальная документация Node.js</a>устанавливает конкретное требование:</p>
43
<blockquote><p>При использовании ключевого слова import необходимо указать расширение файла. Пути каталогов (например,<em>'./startup/index.js'</em>) также должны быть полностью указаны.</p>
43
<blockquote><p>При использовании ключевого слова import необходимо указать расширение файла. Пути каталогов (например,<em>'./startup/index.js'</em>) также должны быть полностью указаны.</p>
44
<p>Этот подход обеспечивает идентичное поведение import в среде браузера и на сервере с типовой конфигурацией.</p>
44
<p>Этот подход обеспечивает идентичное поведение import в среде браузера и на сервере с типовой конфигурацией.</p>
45
</blockquote><h4>Резюме</h4>
45
</blockquote><h4>Резюме</h4>
46
<p>Вы можете дробить код на отдельные модули. В JavaScript один модуль - это один файл.</p>
46
<p>Вы можете дробить код на отдельные модули. В JavaScript один модуль - это один файл.</p>
47
<p>Объединение кода, расположенного в разных модулях, происходит через:</p>
47
<p>Объединение кода, расположенного в разных модулях, происходит через:</p>
48
<ol><li>Экспорт чего-то из модуля</li>
48
<ol><li>Экспорт чего-то из модуля</li>
49
<li>Импорт в другой модуль</li>
49
<li>Импорт в другой модуль</li>
50
</ol><p>Почти все уроки этого и других курсов на Хекслете используют модули. Такой подход максимально приближает нас к реальной жизни, когда проекты состоят из сотен, тысяч файлов и библиотек, которые пользуются друг другом.</p>
50
</ol><p>Почти все уроки этого и других курсов на Хекслете используют модули. Такой подход максимально приближает нас к реальной жизни, когда проекты состоят из сотен, тысяч файлов и библиотек, которые пользуются друг другом.</p>
51
<p>При работе с модулями будет полезным сразу наработать некоторые модели поведения, позволяющие вам с легкостью определять, какой код вам доступен на исполнение, откуда пришел этот код и как его увидеть.</p>
51
<p>При работе с модулями будет полезным сразу наработать некоторые модели поведения, позволяющие вам с легкостью определять, какой код вам доступен на исполнение, откуда пришел этот код и как его увидеть.</p>
52
<p>Ниже описан основной алгоритм, по которому нужно анализировать файл с кодом, над которым вы сейчас работаете. Этот алгоритм не является специфичным для работы в среде Хекслета, так нужно делать в принципе:</p>
52
<p>Ниже описан основной алгоритм, по которому нужно анализировать файл с кодом, над которым вы сейчас работаете. Этот алгоритм не является специфичным для работы в среде Хекслета, так нужно делать в принципе:</p>
53
<ol><li>Внимательно изучите все импорты, описанные в начале файла. Так вы узнаете, какие модули и функции доступны внутри вашего файла (не считая глобальных функций и модулей, которые доступны и без импорта, например, Math)</li>
53
<ol><li>Внимательно изучите все импорты, описанные в начале файла. Так вы узнаете, какие модули и функции доступны внутри вашего файла (не считая глобальных функций и модулей, которые доступны и без импорта, например, Math)</li>
54
<li>Попробуйте классифицировать импортируемые функции. Если импорт выглядит так from './...', то есть содержит ./, значит импортируется модуль, содержимое которого находится в текущей файловой системе. Это автоматически означает несколько вещей. Первое: вы всегда можете открыть этот файл и посмотреть, что там написано. Второе: вы не сможете импортировать этот модуль в другой среде (ведь этого файла там нет)</li>
54
<li>Попробуйте классифицировать импортируемые функции. Если импорт выглядит так from './...', то есть содержит ./, значит импортируется модуль, содержимое которого находится в текущей файловой системе. Это автоматически означает несколько вещей. Первое: вы всегда можете открыть этот файл и посмотреть, что там написано. Второе: вы не сможете импортировать этот модуль в другой среде (ведь этого файла там нет)</li>
55
<li>Если from 'name' содержит только имя, без ./ в начале, значит, модуль подгружается либо из стандартной библиотеки nodejs, либо из установленных пакетов. Визуально невозможно отличить одно от другого. Попробуйте загуглить имя таким способом: "nodejs name". Если в выдаче будет ссылка на официальную документацию, значит, это модуль nodejs; если на репозиторий npm - значит, это обычный пакет, который почти наверняка лежит на гитхабе, что можно проверить таким запросом: "github js name", где "name" это имя пакета</li>
55
<li>Если from 'name' содержит только имя, без ./ в начале, значит, модуль подгружается либо из стандартной библиотеки nodejs, либо из установленных пакетов. Визуально невозможно отличить одно от другого. Попробуйте загуглить имя таким способом: "nodejs name". Если в выдаче будет ссылка на официальную документацию, значит, это модуль nodejs; если на репозиторий npm - значит, это обычный пакет, который почти наверняка лежит на гитхабе, что можно проверить таким запросом: "github js name", где "name" это имя пакета</li>
56
</ol>
56
</ol>