Pertanyaan Apa tujuan dari Node.js module.exports dan bagaimana Anda menggunakannya?


Apa tujuan dari Node.js module.exports dan bagaimana Anda menggunakannya?

Saya tidak dapat menemukan informasi mengenai hal ini, tetapi tampaknya ini merupakan bagian yang agak penting dari Node.js seperti yang sering saya lihat dalam kode sumber.

Menurut Dokumentasi Node.js:

modul 

Referensi ke arus    module. Khususnya module.exports   sama dengan objek ekspor. Lihat    src/node.js untuk informasi lebih lanjut.

Tetapi ini tidak benar-benar membantu.

Apa sebenarnya yang terjadi module.exports lakukan, dan apa yang akan menjadi contoh sederhana?


1237
2018-03-15 11:56


asal


Jawaban:


module.exports adalah objek yang sebenarnya dikembalikan sebagai hasil dari require panggilan.

Itu exports variabel awalnya ditetapkan ke objek yang sama (yaitu singkatan "alias"), sehingga dalam kode modul Anda biasanya akan menulis sesuatu seperti ini:

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

untuk mengekspor (atau "mengekspos") fungsi scoped internal myFunc1 dan myFunc2.

Dan dalam kode panggilan yang akan Anda gunakan:

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

dimana baris terakhir menunjukkan bagaimana hasil dari require (biasanya) hanyalah objek biasa yang propertinya dapat diakses.

NB: jika Anda menimpa exports maka itu tidak akan lagi merujuk module.exports. Jadi jika Anda ingin menetapkan objek baru (atau referensi fungsi) ke exports maka Anda juga harus menetapkan objek baru itu module.exports


Perlu dicatat bahwa nama ditambahkan ke exports objek tidak harus sama dengan nama internal scoped modul untuk nilai yang Anda tambahkan, sehingga Anda dapat memiliki:

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

diikuti oleh:

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

1452
2018-03-15 12:00



Ini sudah dijawab tapi saya ingin menambahkan beberapa klarifikasi ...

Anda dapat menggunakan keduanya exports dan module.exports untuk mengimpor kode ke aplikasi Anda seperti ini:

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

Contoh penggunaan dasar yang akan Anda lihat (misalnya di kode contoh ExpressJS) adalah Anda mengatur properti di exports objek dalam file .js yang kemudian Anda impor menggunakan require()

Jadi, dalam contoh penghitungan sederhana, Anda dapat memiliki:

(counter.js):

var count = 1;

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

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

... lalu di aplikasi Anda (web.js, atau benar-benar file .js lainnya):

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

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

Dalam istilah sederhana, Anda dapat menganggap file yang diperlukan sebagai fungsi yang mengembalikan satu objek, dan Anda dapat menambahkan properti (string, angka, array, fungsi, apa saja) ke objek yang dikembalikan dengan mengaturnya exports.

Terkadang Anda menginginkan objek kembali dari a require() panggil untuk menjadi fungsi yang dapat Anda hubungi, bukan hanya objek dengan properti. Dalam hal ini Anda juga perlu mengatur module.exports, seperti ini:

(sayhello.js):

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

(app.js):

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

Perbedaan antara ekspor dan modul.ekspor dijelaskan lebih baik di jawaban ini di sini.


194
2017-10-16 05:03



Perhatikan bahwa mekanisme modul NodeJS didasarkan pada CommonJS modul yang didukung di banyak implementasi lain seperti RequireJS, tetapi juga SproutCore, CouchDB, Wakanda, OrientDB, ArangoDB, RingoJS, TeaJS, SilkJS, curl.js, atau bahkan Adobe Photoshop (via PSLib). Anda dapat menemukan daftar lengkap implementasi yang dikenal sini.

Kecuali modul Anda menggunakan fitur atau modul node tertentu, saya sangat menyarankan Anda untuk menggunakannya exports dari pada module.exports  yang bukan bagian dari standar CommonJS, dan kebanyakan tidak didukung oleh implementasi lain.

Fitur khusus NodeJS lainnya adalah ketika Anda menetapkan referensi ke objek baru exports daripada hanya menambahkan properti dan metode seperti pada contoh terakhir yang disediakan oleh Jed Watson di utas ini. Saya pribadi akan mencegah praktik ini seperti ini istirahat dukungan referensi melingkar dari mekanisme modul CommonJS. Kemudian tidak didukung oleh semua implementasi dan contoh Jed harus ditulis dengan cara ini (atau yang serupa) untuk menyediakan modul yang lebih universal:

(sayhello.js):

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

(app.js):

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

Atau menggunakan fitur 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: Sepertinya Appcelerator juga mengimplementasikan modul CommonJS, tetapi tanpa dukungan referensi melingkar (lihat: Modul Appcelerator dan CommonJS (referensi cache dan melingkar))


53
2018-01-20 12:35



Beberapa hal yang Anda harus berhati-hati jika Anda menetapkan referensi ke objek baru exports dan / atau modules.exports:

1. Semua properti / metode yang sebelumnya dilampirkan ke aslinya exports atau module.exports tentu saja hilang karena objek yang diekspor sekarang akan mereferensikan yang baru lagi

Yang ini sudah jelas, tapi jika Anda menambahkan metode yang diekspor di awal modul yang ada, pastikan objek asli yang diekspor tidak merujuk objek lain di bagian akhir

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. Dalam hal salah satu exports atau module.exports referensi nilai baru, mereka tidak mengacu ke objek yang sama lagi

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. Konsekuensi yang rumit. Jika Anda mengubah referensi ke keduanya exports dan module.exports, sulit untuk mengatakan API mana yang diekspos (sepertinya module.exports menang)

// 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
2018-01-25 09:02



properti module.exports atau objek ekspor memungkinkan modul untuk memilih apa yang harus dibagi dengan aplikasi

enter image description here

Saya memiliki video di modul_export yang tersedia sini


23
2017-09-03 19:01



Saat membagi kode program Anda melalui beberapa file, module.exports digunakan untuk mempublikasikan variabel dan fungsi ke konsumen dari suatu modul. Itu require() panggilan dalam file sumber Anda diganti dengan yang sesuai module.exports diambil dari modul.

Ingat saat menulis modul

  • Beban modul disimpan dalam cache, hanya panggilan awal yang mengevaluasi JavaScript.
  • Ini mungkin untuk menggunakan variabel dan fungsi lokal di dalam modul, tidak semuanya perlu diekspor.
  • Itu module.exports objek juga tersedia sebagai exports steno. Tetapi ketika mengembalikan satu-satunya fungsi, selalu gunakan module.exports.

module exports diagram

Menurut: "Modul Bagian 2 - Menulis modul".


17
2017-08-06 21:05



tautan rujukannya seperti ini:

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

sifat-sifat dari exports atau module.exports , seperti fungsi atau variabel, akan diekspos di luar

ada sesuatu yang harus Anda perhatikan: jangan override ekspor.

kenapa?

karena ekspor hanya referensi module.exports, Anda dapat menambahkan properti ke ekspor, tetapi jika Anda mengganti ekspor, tautan referensi akan rusak.

contoh yang baik :

exports.name = 'william';

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

contoh buruk:

exports = 'william';

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

Jika Anda hanya ingin mengekspos hanya satu fungsi atau variabel, seperti ini:

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

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

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

modul ini hanya memaparkan satu fungsi dan properti nama adalah privat untuk luar.


8
2018-04-18 00:53



Ada beberapa modul default atau yang ada di node.js ketika Anda mengunduh dan menginstal node.js suka http, sys dll.

Karena mereka sudah di node.js, ketika kita ingin menggunakan modul-modul ini pada dasarnya kita suka modul impor, tapi kenapa? karena mereka sudah ada di node.js. Mengimpor sama dengan mengambilnya dari node.js dan memasukkannya ke program Anda. Dan kemudian menggunakannya.

Sedangkan Ekspor adalah kebalikannya, Anda membuat modul yang Anda inginkan, misalkan modul addition.js dan menempatkan modul itu ke node.js, Anda melakukannya dengan mengekspornya.

Sebelum saya menulis apa pun di sini, ingatlah, module.exports.additionTwo sama seperti exports.additionTwo


4
2017-07-27 20:49