module.exports
является объектом, который фактически возвращается в результате require
вызова.
exports
Переменная первоначально устанавливается на тот же объект (т.е. это сокращенные «псевдоним»), так что в коде модуля, обычно пишут что - то вроде этого:
let myFunc1 = function() { ... };
let myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
экспортировать (или «выставлять») функции внутренней области видимости myFunc1
и myFunc2
.
И в коде вызова вы будете использовать:
const m = require('./mymodule');
m.myFunc1();
где последняя строка показывает, как результат require
(обычно) просто простой объект, свойства которого могут быть доступны.
NB: если вы перезаписываете, exports
это больше не будет ссылаться на module.exports
. Поэтому, если вы хотите назначить новый объект (или ссылку на функцию), exports
вам также следует назначить этот новый объектmodule.exports
Стоит отметить, что имя, добавляемое к exports
объекту, не обязательно должно совпадать с именем внутренней области действия модуля для добавляемого значения, поэтому вы можете иметь:
let myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
с последующим:
const m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
На это уже ответили, но я хотел бы добавить некоторые разъяснения ...
Вы можете использовать оба
exports
иmodule.exports
для импорта кода в ваше приложение, как это:var mycode = require('./path/to/mycode');
Основной вариант использования, который вы увидите (например, в примере кода ExpressJS), заключается в том, что вы устанавливаете свойства
exports
объекта в файле .js, который затем импортируете с помощьюrequire()
Таким образом, в простом примере подсчета вы могли бы иметь:
(counter.js):
... затем в вашем приложении (web.js или действительно любой другой файл .js):
Проще говоря, вы можете рассматривать требуемые файлы как функции, которые возвращают один объект, и вы можете добавлять свойства (строки, числа, массивы, функции, что угодно) к объекту, который возвращается, устанавливая их
exports
.Иногда вы хотите, чтобы объект, возвращаемый из
require()
вызова, был функцией, которую вы можете вызвать, а не просто объектом со свойствами. В этом случае вам также нужно установитьmodule.exports
, как это:(sayhello.js):
(App.js):
Разница между export и module.exports объяснена лучше в этом ответе здесь .
источник
require
начинается относительно папки, в которой вы выполняетеnode app.js
. Я рекомендую опубликовать новый вопрос с явными примерами кода + структуры папок, чтобы получить более четкий ответ.var sayHello = require('./ex6_module.js'); console.log(sayHello());
и модуль:module.exports = exports = function() { return "Hello World!"; }
module.exports = exports = function(){...}
2-йexports
это просто переменная, верно? Другими словами, это может бытьmodule.exports = abc = function()
Обратите внимание, что механизм модуля NodeJS основан на модулях CommonJS, которые поддерживаются во многих других реализациях, таких как RequireJS , но также SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js или даже Adobe Photoshop (через PSLib). ). Вы можете найти полный список известных реализаций здесь .
Если ваш модуль не использует специфичные для узла функции или модуль, я настоятельно рекомендую вам использовать
exports
вместо того,module.exports
который не является частью стандарта CommonJS , и в большинстве случаев не поддерживается другими реализациями.Еще одна особенность NodeJS - это когда вы назначаете ссылку на новый объект,
exports
а не просто добавляете к нему свойства и методы, как в последнем примере, представленном Джедом Уотсоном в этом потоке. Я бы лично не одобрял эту практику, так как это нарушает круговую ссылочную поддержку механизма модулей CommonJS. Это тогда не поддерживается всеми реализациями, и пример Jed должен быть написан таким образом (или подобным), чтобы обеспечить более универсальный модуль:(sayhello.js):
(App.js):
Или используя функции ES6
(sayhello.js):
(App.js):
PS: Похоже, что Appcelerator также реализует модули CommonJS, но без поддержки циклических ссылок (см .: модули Appcelerator и CommonJS (кэширование и циклические ссылки) )
источник
Несколько вещей, о которых вы должны позаботиться, если назначаете ссылку на новый объект
exports
и / илиmodules.exports
:1. Все свойства / методы, ранее прикрепленные к оригиналу
exports
илиmodule.exports
, конечно, утерянные, потому что экспортированный объект теперь будет ссылаться на другой новыйЭто очевидно, но если вы добавляете экспортируемый метод в начале существующего модуля, убедитесь, что собственный экспортируемый объект не ссылается на другой объект в конце
2. В случае если одно из
exports
илиmodule.exports
ссылается на новое значение, они больше не ссылаются на один и тот же объект3. Хитрое следствие. Если вы измените ссылку на оба
exports
иmodule.exports
, трудно сказать, какой API выставлен (похоже,module.exports
выигрывает)источник
свойство module.exports или объект экспорта позволяет модулю выбирать, что должно быть передано приложению
У меня есть видео на module_export, доступное здесь
источник
При разделении кода вашей программы на несколько файлов
module.exports
используется для публикации переменных и функций для потребителя модуля.require()
Вызов в исходном файле заменяется соответствующимmodule.exports
загружен из модуля.Помните при написании модулей
module.exports
Объект также доступен в качествеexports
стенографии. Но при возврате единственной функции всегда используйтеmodule.exports
.Согласно: «Модули Часть 2 - Написание модулей» .
источник
Ссылочная ссылка выглядит так:
свойства
exports
илиmodule.exports
, такие как функции или переменные, будут представлены внеесть что-то, на что вы должны обратить больше внимания: не
override
экспортируйте.Почему ?
поскольку экспортирует только ссылку на module.exports, вы можете добавить свойства к экспорту, но если вы переопределите экспорт, ссылка на ссылку будет разорвана.
хороший пример :
плохой пример:
Если вы просто хотите выставить только одну функцию или переменную, например:
этот модуль предоставляет только одну функцию, а свойство name является приватным для внешних пользователей.
источник
При загрузке и установке node.js есть несколько модулей по умолчанию или существующих в файле node.js, таких как http, sys и т. Д.
Поскольку они уже находятся в файле node.js, когда мы хотим использовать эти модули, нам, в основном, нравятся модули импорта , но почему? потому что они уже присутствуют в node.js. Импортировать все равно, что брать их из node.js и помещать в свою программу. И затем, используя их.
В то время как Exports с точностью до наоборот, вы создаете нужный модуль, скажем, модуль extension.js и помещаете этот модуль в node.js, вы делаете это путем его экспорта.
Прежде чем я что-то напишу здесь, помните, что module.exports.additionTwo такой же, как export.additionTwo
Да, так вот почему нам нравится
Будьте осторожны с путем
Допустим, вы создали модуль дополнения.js,
Когда вы запускаете это в командной строке NODE.JS:
Это будет ошибка, говоря
Это связано с тем, что процесс node.js не может добавить дополнение.js, поскольку мы не упомянули путь. Итак, мы можем установить путь с помощью NODE_PATH
Теперь это должно работать успешно без каких-либо ошибок!
Еще одна вещь, вы также можете запустить файл дополнения.js, не устанавливая NODE_PATH, обратно в командную строку nodejs:
Поскольку мы указываем здесь путь, говоря, что он находится в текущем каталоге,
./
он также должен успешно работать.источник
Модуль инкапсулирует связанный код в одну единицу кода. При создании модуля это можно интерпретировать как перемещение всех связанных функций в файл.
Предположим, есть файл Hello.js, который включает две функции
Мы пишем функцию только тогда, когда утилита кода является более чем одним вызовом.
Предположим, мы хотим увеличить полезность функции для другого файла, скажем, World.js, в этом случае экспорт файла начинается с изображения, которое можно получить с помощью module.exports.
Вы можете просто экспортировать обе функции по приведенному ниже коду
Теперь вам просто нужно указать имя файла в порядке World.js, чтобы использовать эти функции.
источник
Намерение:
Википедия
Я предполагаю, что становится трудно писать большие программы без модульного / многократно используемого кода. В nodejs мы можем создавать модульные программы, использующие
module.exports
определение того, что мы представляем и с помощью которой создаем нашу программуrequire
.fileLog.js
stdoutLog.js
program.js
выполнять
Теперь попробуйте заменить ./stdoutLog.js на ./fileLog.js .
источник
Это выполняет следующие вещи:
Наличие модулей облегчает поиск определенных частей кода, что делает наш код более понятным.
NodejS
использует модульную систему CommomJS, которая работает следующим образом:module.export
синтаксисаrequire('file')
синтаксисаПример:
test1.js
test2.js
Другие полезные вещи, которые нужно знать:
require()
вызывается для того же модуля, который извлекается из кэша.require()
сразу.источник
источник
return "Hello world"
без разницы), но без каких-либо объяснений. Прежде чем ответить, убедитесь, что ваш ответ что-то добавит к теме.