Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение
Как бы его не портили от версии к версии, блокировать обновления может быть не безопасно.
Для полноты, добавлю немного важных деталей.

require может принимать пути к модулям как с расширением, так и без расширения. Может быть загружен либо модуль ядра, либо конкретный файл, либо файл с таким же именем и расширением ".js", либо файл в такой директории с именем index.js, либо подобным образом один из файлов внутри mode_modules, либо директория внутри node_modules. К слову, это делает удобным декомпозицию и эволюционное превращение некоторых подключаемых файлов в библиотеки в аккуратных директориях или даже в npm. Подробнее об алгоритме загрузки можно узнать из документации:
Порядок загрузки require
require(X) from module at path Y
1. If X is a core module,
a. return the core module
b. STOP
2. If X begins with './' or '/' or '../'
a. LOAD_AS_FILE(Y + X)
b. LOAD_AS_DIRECTORY(Y + X)
3. LOAD_NODE_MODULES(X, dirname(Y))
4. THROW «not found»

LOAD_AS_FILE(X)
1. If X is a file, load X as JavaScript text. STOP
2. If X.js is a file, load X.js as JavaScript text. STOP
3. If X.node is a file, load X.node as binary addon. STOP

LOAD_AS_DIRECTORY(X)
1. If X/package.json is a file,
a. Parse X/package.json, and look for «main» field.
b. let M = X + (json main field)
c. LOAD_AS_FILE(M)
2. If X/index.js is a file, load X/index.js as JavaScript text. STOP
3. If X/index.node is a file, load X/index.node as binary addon. STOP

LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
a. LOAD_AS_FILE(DIR/X)
b. LOAD_AS_DIRECTORY(DIR/X)

NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let ROOT = index of first instance of «node_modules» in PARTS, or 0
3. let I = count of PARTS — 1
4. let DIRS = []
5. while I > ROOT,
a. if PARTS[I] = «node_modules» CONTINUE
c. DIR = path join(PARTS[0… I] + «node_modules»)
b. DIRS = DIRS + DIR
c. let I = I — 1
6. return DIRS


Далее, путь к файлу, загружаемому через require, является уникальным идентификатором модуля. Это значит, что все переменные модуля будут доступны из всех мест, где этот модуль был загружен через require. Другими словами, если в одном файле загрузить модуль через require и изменить его внутреннее сосояние, то это смогут обнаружить другие файлы, загрузившие этот же модуль. Такое поведение бывает удобно при работе с сервисами, например при использовании модуля в качестве дрвайера кэша или драйвера базы данных.

Тело модуля — это тело функции, вызываемой один раз при инициализации модуля. Внутри этой функции существует переменная module, которая ссылается на этот самый загружаемый модуль. У module есть поле module.exports, именно эта переменная возвращается в качестве значения вызова require(). Помимо module доступна также переменная exports, которая является синонимом module.exports, что позволяет писать укороченные конструкции вида «exports.User = User». Однако переопределение значения переменной exports закономерно отвязывает её от module.exports, поэтому при том, что конструкция «exports.User = User» работать будет, конструкция виде «exports = User» работать уже не будет, и для экспорта целого объекта в качестве модуля следует писать «module.exports = User». Грубо говоря, чтобы понять как это работает, проще всего при написании модуля думать, что где-то в невидимой высоте присутствуют такие строчки:
var module = наш_модуль;
module.exports = {};
var exports = module.exports;

Информация

В рейтинге
Не участвует
Откуда
Одесса, Одесская обл., Украина
Зарегистрирован
Активность