Когда требуется, вы действительно понимаете разницу между экспортом и модулем.экспорт?

внешний интерфейс JavaScript

интервью будет спрашивать

Вы понимаете механизм работы и стратегию кэширования require?

Требуется загружать модули синхронно или асинхронно? говорить о своем понимании

В чем разница между экспортом и модулем.экспорт?

Что именно загружается, когда require загружает модуль?

Об авторе: koala, сосредоточив внимание на совместном использовании полного стека технологий Node.js, от JavaScript до Node.js, до серверной базы данных, я желаю вам стать отличным старшим инженером Node.js. [Руководство по развитию программиста] Автор, блог Github с открытым исходным кодомGitHub.com/koala-co Nth…

require

Когда дело доходит до экспорта и module.exports, мы должны упомянуть ключевое слово require. Всем известно, что Node.js следует спецификации CommonJS и использует ключевое слово require для загрузки модулей.

требуют дубликатов введения проблемы

Вопрос: я не знаю, актуально ли это, когда вы используете require для импорта модулей. Будут ли одни и те же модули импортироваться несколько раз в несколько файлов кода? Не приведет ли это к дублированию?

Поскольку ключевые слова, такие как #IFNDEF, обычно используются в C++, чтобы избежать повторного введения файлов, но в Node.js вам не нужно заботиться об этом, потому что Node.js по умолчанию загружает модули из кеша. один раз копия сохраняется в кеше.Если встречается дубликат загруженного модуля, копия в кеше будет извлечена напрямую, то есть каждый модуль имеет только один экземпляр в кеше в любой момент времени.

Требуется загружать модули синхронно или асинхронно?

Ответь на вопрос первым, синхронный! Но что, если интервьюер спросит вас, почему это синхронно или асинхронно? На самом деле этот ответ не является фиксированным, но друзья могут объяснить интервьюеру через эти аспекты.

  1. Модуль, который используется как публичная зависимость, естественно, хочет загружаться за один раз, и синхронизация лучше
  2. Количество модулей часто ограничено, и Node.js автоматически кэширует загруженные модули, когда это требуется, плюс доступ к локальным файлам, генерируемые накладные расходы ввода-вывода практически незначительны.

Стратегия кэширования для require()

Node.js будет автоматически кэшировать файлы, импортированные через require, так что при следующем импорте не нужно будет проходить через файловую систему, а будет считываться непосредственно из кеша. Однако этот метод кэширования находится через путь к файлу, даже если два одинаковых файла расположены по разным путям, в кэше будут поддерживаться две копии. в состоянии пройти

console.log(require.cache)

Получить все файлы, которые в настоящее время находятся в кеше.

Разница между экспортом и модулем.экспорт

js файл при запуске

Когда узел выполняет файл, он генерирует объекты экспорта и модуля в файле, И у модуля есть свойство экспорта. Связь между ними показана на рисунке ниже, и все они указывают на область памяти {}.

exports = module.exports = {};

Смотрите картинку, чтобы понять здесь более четко:

require() для загрузки модулей

Когда require() загружает модуль, давайте посмотрим на пример кода

//koala.js
let a = '程序员成长指北';

console.log(module.exports); //能打印出结果为:{}
console.log(exports); //能打印出结果为:{}

exports.a = '程序员成长指北哦哦'; //这里辛苦劳作帮 module.exports 的内容给改成 {a : '程序员成长指北哦哦'}

exports = '指向其他内存区'; //这里把exports的指向指走

//test.js

const a = require('/koala');
console.log(a) // 打印为 {a : '程序员成长指北哦哦'}

Глядя на результаты печати приведенного выше кода, вы сможете сделать следующие выводы:

Содержимое, экспортируемое функцией require, является содержимым блока памяти, на который указывает module.exports, а не содержимым экспорта.

Короче говоря, разница между ними в том, что экспорт — это просто ссылка на module.exports, которая используется, чтобы помочь последнему добавить контент. Это лучше понять с точки зрения указателей памяти.

Пример с официального сайта

Взгляните на применение экспорта в официальной документации

Мы часто видим, что это написано так:

exports = module.exports = somethings

Приведенный выше код эквивалентен:

module.exports = somethings
exports = module.exports

Принцип очень простой, то есть, когда module.exports указывает на новый объект, exports отключает ссылку на module.exports, затем пусть exports снова указывает на module.exports через exports = module.exports.

Небольшой совет по использованию

Предложение: при его использовании рекомендуется использовать module.exports (его также можно получить из следующего примера)

Node.js считает каждый файл отдельным модулем. Если в вашем пакете два файла, скажем, "a.js" и "b.js", то "b.js" для использования функциональности "a.js", "a.js" должен быть передан в объект экспорта Добавить свойства чтобы выставить эти функции:

// a.js
exports.verifyPassword = function(user, password, done) { ... }

После этого все, что нужно "a.js", получит объект со свойством функции "verifyPassword":

// b.js
require(‘a.js’) // { verifyPassword: function(user, password, done) { ... } } 

Однако что, если мы хотим предоставить эту функцию напрямую, а не использовать ее как свойство какого-либо объекта? Мы можем переопределить экспорт для достижения нашей цели, но мы не должны рассматривать его как глобальную переменную:

// a.js
module.exports = function(user, password, done) { ... }

Обратите внимание, что мы рассматриваем «экспорт» как атрибут объекта модуля. Различие между «module.exports» и «exports» является важным, и это часто является ловушкой для новичков в Node.js.

Присоединяйтесь к нам, чтобы учиться вместе!группа обмена обучением узлов

Если группа обмена заполнена 100 людьми, она не может автоматически присоединиться к группе.Пожалуйста, добавьте учетную запись WeChat помощника группы: узел [coder_qi] Note, и он автоматически втянет вас в группу.