В курсе "Введение в программирование" использовался только один вид импортов — импорт из локальных файлов. Подобные импорты отличает указание относительного пути (./) в секции from.

import { length } from './strings';
import factorial from './factorial';

Все подобные импорты объединяет то, что в них мы обращаемся к конкретному файлу, лежащему где-то рядом. Его всегда можно открыть и посмотреть содержимое. Но в реальных проектах и дальше в курсах, вам будут встречаться нелокальные импорты:

import path from 'path';
import fs from 'fs';
import lodash from 'lodash';

Как видите, в импортах выше, нет начального ./. Некоторые из них, по сути, тоже локальные — это импорты из стандартной библиотеки. В указанном примере к ним относятся первые два импорта из модулей path и fs. Эти модули лежат где-то в системных директориях — там, куда они были помещены во время установки Node.js. Посмотреть список всех модулей стандартной библиотеки можно в официальной документации https://nodejs.org/api/modules.html

Самое интересное происходит при импорте сторонних npm-пакетов: import lodash from 'lodash';. Дело в том, что пакет — не то же самое что и модуль. Модуль — один файл, а пакет — набор файлов, в которые входят модули и package.json. Посмотрите содержимое репозитория lodash. В корне проекта находится, наверное, сотня файлов.

lodash
files

Возникает закономерный вопрос. Если внутри одного пакета множество модулей, то что же импортируется если мы пишем import lodash from 'lodash'?

В npm принято соглашение, что по умолчанию всегда импортируется файл index.js, находящийся в корне проекта. Этот файл является точкой входа в пакет. Все остальные модули, как правило, собираются внутри index.js. Но это поведение можно изменить. За это отвечает свойство main (главный) в файле package.json. Посмотрите его значение в пакете lodash. В нашем эталонном пакете nodejs-package эта строчка выглядит так:

{
  "main": "dist/index.js"
}

Сам файл dist/index.js в репозитории отсутствует, как впрочем и папка dist. Как вы помните из урока про babel, эта директория формируется только в момент публикации пакета и заливается в npm, но в репозиторий ее не добавляют.

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →