Вопрос: Какова цель Node.js module.exports и как вы ее используете?


Какова цель Node.js module.exports и как вы ее используете?

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

Согласно Документация Node.js :

модуль

Ссылка на текущий module, В частности module.exportsсовпадает с объектом экспорта. Видеть src/node.jsЧтобы получить больше информации.

Но это не очень помогает.

Что именно делает module.exportsи что может быть простым примером?


1225


источник


Ответы:


module.exportsэто объект, который фактически возвращается в результате requireвызов.

exportsпеременная изначально устанавливается на тот же объект (т. е. это сокращенный псевдоним), поэтому в коде модуля вы обычно пишете что-то вроде этого:

var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

для экспорта (или «раскрытия») функций внутри страны myFunc1а также myFunc2,

И в коде вызова вы будете использовать:

var m = require('mymodule');
m.myFunc1();

где последняя строка показывает, как результат require(обычно) - это простой объект, свойства которого могут быть доступны.

NB: если вы перезаписываете exportsто он больше не будет ссылаться на module.exports, Поэтому, если вы хотите назначить новый объект (или ссылку на функцию) на exportsто вы также должны назначить этот новый объект module.exports


Стоит отметить, что имя добавлено в exportsобъект не должен совпадать с именем внутренней области модуля для значения, которое вы добавляете, чтобы вы могли:

var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required

с последующим:

var m = require('mymodule');
m.shortName(); // invokes module.myVeryLongInternalName

1442



На это уже был дан ответ, но я хотел добавить некоторые пояснения ...

Вы можете использовать оба exportsа также module.exportsдля импорта кода в ваше приложение:

var mycode = require('./path/to/mycode');

Основной пример использования, который вы увидите (например, в примере кода ExpressJS), заключается в том, что вы устанавливаете свойства на exportsобъект в файле .js, который затем импортируется с помощью require()

Поэтому в простом примере подсчета вы можете:

(counter.js):

var count = 1;

exports.increment = function() {
    count++;
};

exports.getCount = function() {
    return count;
};

... затем в вашем приложении (web.js или действительно любой другой .js-файл):

var counting = require('./counter.js');

console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

Проще говоря, вы можете думать о требуемых файлах как о функциях, возвращающих один объект, и вы можете добавлять свойства (строки, числа, массивы, функции, что угодно) к объекту, который возвращается, устанавливая их exports,

Иногда вам нужен объект, возвращенный с require()call, чтобы быть функцией, которую вы можете вызывать, а не просто объектом со свойствами. В этом случае вам также необходимо установить module.exports, как это:

(sayhello.js):

module.exports = exports = function() {
    console.log("Hello World!");
};

(app.js):

var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"

Разница между экспортом и module.exports объясняется лучше в этот ответ здесь ,


193



Обратите внимание, что модуль модуля 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):

exports.run = function() {
    console.log("Hello World!");
}

(app.js):

var sayHello = require('./sayhello');
sayHello.run(); // "Hello World!"

Или используя функции ES6

(sayhello.js):

Object.assign(exports, {
    // Put all your public API here
    sayhello() {
        console.log("Hello World!");
    }
});

(app.js):

const { sayHello } = require('./sayhello');
sayHello(); // "Hello World!"

PS: Похоже, что Appcelerator также реализует модули CommonJS, но без круглой справочной поддержки (см. Модули Appcelerator и CommonJS (кеширование и циклические ссылки) )


53



Несколько вещей, которые вы должны позаботиться, если назначить ссылку на новый объект на exportsи / или modules.exports:

1. Все свойства / методы, ранее прикрепленные к оригиналу exportsили module.exportsконечно, потеряны, потому что экспортируемый объект теперь будет ссылаться на другой новый

Это очевидно, но если вы добавите экспортированный метод в начале существующего модуля, убедитесь, что собственный экспортированный объект не ссылается на другой объект в конце

exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object

module.exports.method3 = function () {}; // exposed with method1 & method2

var otherAPI = {
    // some properties and/or methods
}

exports = otherAPI; // replace the original API (works also with module.exports)

2. В случае, если один из exportsили module.exportsссылаются на новое значение, они больше не ссылаются на один и тот же объект

exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object

// method added to the original exports object which not exposed any more
module.exports.method3 = function () {}; 

3. Трудные последствия. Если вы измените ссылку на оба exportsа также module.exports, трудно сказать, какой API открыт (похоже module.exportsвыигрывает)

// override the original exported object
module.exports = function AConstructor() {};

// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {}; 

31



свойство module.exports или объект экспорта позволяет модулю выбирать, что должно быть передано приложению

enter image description here

У меня есть видео на доступном module_export Вот


23



When dividing your program code over multiple files, module.exports is used to publish variables and functions to the consumer of a module. The require() call in your source file is replaced with corresponding module.exports loaded from the module.

Remember when writing modules

  • Module loads are cached, only initial call evaluates JavaScript.
  • It's possible to use local variables and functions inside a module, not everything needs to be exported.
  • The module.exports object is also available as exports shorthand. But when returning a sole function, always use module.exports.

module exports diagram

According to: "Modules Part 2 - Writing modules".


17



the refer link is like this:

exports = module.exports = function(){
    //....
}

the properties of exports or module.exports ,such as functions or variables , will be exposed outside

there is something you must pay more attention : don't override exports .

why ?

because exports just the reference of module.exports , you can add the properties onto the exports ,but if you override the exports , the reference link will be broken .

good example :

exports.name = 'william';

exports.getName = function(){
   console.log(this.name);
}

bad example :

exports = 'william';

exports = function(){
     //...
}

If you just want to exposed only one function or variable , like this:

// test.js
var name = 'william';

module.exports = function(){
    console.log(name);
}   

// index.js
var test = require('./test');
test();

this module only exposed one function and the property of name is private for the outside .


8



There are some default or existing modules in node.js when you download and install node.js like http, sys etc.

Since they are already in node.js, when we want to use these modules we basically do like import modules, but why? because they are already present in the node.js. Importing is like taking them from node.js and putting them into your program. And then using them.

Whereas Exports is exactly the opposite, you are creating the module you want, let's say the module addition.js and putting that module into the node.js, you do it by exporting it.

Before I write anything here, remember, module.exports.additionTwo is same as exports.additionTwo


4



A module encapsulates related code into a single unit of code. When creating a module, this can be interpreted as moving all related functions into a file.

Suppose there is a file Hello.js which include two functions

sayHelloInEnglish = function() {
  return "Hello";
};
sayHelloInSpanish = function() {
  return "Hola";
};

We write a function only when utility of the code is more than one call.

Suppose we want to increase utility of the function to a different file say World.js,in this case exporting a file comes into picture which can be obtained by module.exports.

You can just export both the function by the code given below

var anyVariable={
 sayHelloInEnglish = function() {
      return "Hello";
    };
  sayHelloInSpanish = function() {
      return "Hola";
    }; 
}
module.export=anyVariable;

Now you just need to require the file name into World.js inorder to use those functions

var world= require("./hello.js");

1



The intent is:

Modular programming is a software design technique that emphasizes separating the functionality of a program into independent, interchangeable modules, such that each contains everything necessary to execute only one aspect of the desired functionality.

Wikipedia

I imagine it becomes difficult to write a large programs without modular / reusable code. In nodejs we can create modular programs utilising module.exports defining what we expose and compose our program with require.

Try this example:

fileLog.js

function log(string) {
  require('fs').appendFileSync('log.txt',string);
}

module.exports = log;

stdoutLog.js

function log(string) {
  console.log(string);
}

module.exports = log;

program.js

const log = require('./stdoutLog.js')

log('hello world!');

execute

$ node program.js

hello world!

Now try swapping ./stdoutLog.js for ./fileLog.js.


0