Pada halaman ini ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ), ini menyatakan bahwa "Jika Anda ingin mengatur objek ekspor ke fungsi atau objek baru, Anda harus gunakan objek module.exports. "
Pertanyaan saya adalah mengapa.
// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
Saya console.logged hasilnya ( result=require(example.js)
) dan yang pertama adalah [Function]
yang kedua {}
.
Bisakah Anda jelaskan alasan di baliknya? Saya membaca posting di sini: module.exports vs ekspor di Node.js . Ini membantu, tetapi tidak menjelaskan alasan mengapa itu dirancang sedemikian rupa. Apakah akan ada masalah jika referensi ekspor dikembalikan secara langsung?
javascript
node.js
commonjs
Xiao Peng - ZenUML.com
sumber
sumber
module.exports
.exports
, misalnya github.com/tj/consolidate.js/blob/master/lib/consolidate.js ?module.exports
, Anda tidak akan pernah salah, namun Anda dapat menggunakanexports
jika Anda tidak mengganti default diekspor objek, yaitu, jika Anda hanya melampirkan sifat seperti ini:var foo = require('foo').foo
.foo
Properti ini dapat diekspor seperti ini:exports.foo = ...
dan tentu saja denganmodule.exports
. Ini pilihan pribadi, tetapi saya saat ini menggunakanmodule.exports
danexports
tepat.Jawaban:
module
adalah objek JavaScript biasa denganexports
properti.exports
adalah variabel JavaScript biasa yang akan diatur kemodule.exports
. Di akhir file Anda, node.js pada dasarnya akan 'kembali'module.exports
kerequire
fungsi. Cara yang disederhanakan untuk melihat file JS di Node bisa jadi ini:Jika Anda menetapkan properti pada
exports
, sepertiexports.a = 9;
, yang akan mengaturmodule.exports.a
juga karena benda-benda yang diedarkan sebagai referensi dalam JavaScript, yang berarti bahwa jika Anda menetapkan beberapa variabel ke objek yang sama, mereka adalah semua objek yang sama; jadiexports
dan itumodule.exports
adalah objek yang sama.Tetapi jika Anda mengatur
exports
ke sesuatu yang baru, itu tidak akan lagi diatur kemodule.exports
, jadiexports
danmodule.exports
tidak lagi menjadi objek yang sama.sumber
module.exports
menjelaskannya juga: nodejs.org/api/modules.html#modules_module_exportsJawaban Renee dijelaskan dengan baik. Penambahan jawaban dengan contoh:
Node melakukan banyak hal pada file Anda dan salah satu yang penting adalah MEMBUNGKUS file Anda. Di dalam kode sumber nodejs "module.exports" dikembalikan. Mari kita mundur selangkah dan memahami bungkusnya. Misalkan Anda punya
salam.js
kode di atas dibungkus sebagai IIFE (Ekspresi Fungsi Segera Dibatalkan) di dalam kode sumber nodejs sebagai berikut:
dan fungsi di atas dipanggil (.apply ()) dan mengembalikan module.exports. Pada saat ini module.export dan ekspor menunjuk ke referensi yang sama.
Sekarang, bayangkan Anda menulis ulang greet.js sebagai
hasilnya akan
alasannya adalah: module.exports adalah objek kosong. Kami tidak menetapkan apa pun ke module.exports melainkan kami menetapkan ekspor = fungsi () ..... di greet.js baru. Jadi, module.exports kosong.
Ekspor dan module.exports secara teknis harus menunjuk ke referensi yang sama (itu benar !!). Tapi kami menggunakan "=" saat menetapkan function () .... ke ekspor, yang membuat objek lain di memori. Jadi, module.exports dan ekspor menghasilkan hasil yang berbeda. Dalam hal ekspor, kami tidak bisa menimpanya.
Sekarang, bayangkan Anda menulis ulang (ini disebut Mutation) greet.js (merujuk pada jawaban Renee) sebagai
hasilnya akan
Seperti yang Anda lihat module.exports dan ekspor menunjuk ke referensi yang sama yang merupakan fungsi. Jika Anda menyetel properti pada ekspor maka akan ditetapkan pada module.exports karena di JS, objek dilewatkan dengan referensi.
Kesimpulan selalu menggunakan module.exports untuk menghindari kebingungan. Semoga ini membantu. Selamat coding :)
sumber
Juga, satu hal yang dapat membantu untuk memahami:
math.js
client.js
Hebat, dalam hal ini:
Jadi, secara default, "ini" sebenarnya sama dengan module.exports.
Namun, jika Anda mengubah implementasi Anda menjadi:
math.js
Dalam hal ini, ini akan berfungsi dengan baik, "this" tidak sama dengan module.exports lagi, karena objek baru telah dibuat.
Dan sekarang, apa yang akan dikembalikan oleh yang diperlukan adalah apa yang didefinisikan di dalam module.exports, bukan ini atau ekspor, lagi.
Cara lain untuk melakukannya adalah:
math.js
Atau:
math.js
sumber
Jawaban Rene tentang hubungan antara
exports
danmodule.exports
cukup jelas, itu semua tentang referensi javascript. Hanya ingin menambahkan itu:Kami melihat ini di banyak modul simpul:
var app = exports = module.exports = {};
Ini akan memastikan bahwa meskipun kita mengubah module.exports, kita masih dapat menggunakan ekspor dengan membuat kedua variabel tersebut menunjuk ke objek yang sama.
sumber
module.exports
danexports
hanya variabel yang terpisah, diinisialisasi untuk referensi objek yang sama. Jika Anda mengubah referensi satu variabel apa, kedua variabel tidak lagi merujuk hal yang sama. Baris kode di atas memastikan kedua variabel diinisialisasi ke objek baru yang sama.myTest.js
exports
danmodule.exports
sama dan referensi ke objek yang sama. Anda dapat menambahkan properti dengan kedua cara sesuai kenyamanan Anda.sumber