PENDAHULUAN DAN INFORMASI
Melalui API resmi Node.js, kita dapat melihat bahwa Node.js sendiri menyediakan banyak modul inti http://nodejs.org/api/. Modul inti ini dikompilasi ke dalam file biner dan dapat diperoleh dengan membutuhkan ('nama modul'); Modul inti memiliki prioritas pemuatan tertinggi (akan tercermin ketika ada modul dan modul inti dengan nama yang sama)
(Kali ini kami terutama berbicara tentang modul khusus)
Node.js juga memiliki jenis modul yang merupakan modul file, yang dapat berupa file kode JavaScript (.js sebagai sufiks file), file teks format JSON (.json sebagai sufiks file), atau file c/c ++ yang diedit (.node sebagai suffix file);
Metode akses modul file diakses melalui kebutuhan ('/filename.suffix') memerlukan ('./ filename.suffix') requrie ('../ filename.suffix') dan sufiks file dapat dihilangkan; Dimulai dengan "/" dimuat dengan jalur absolut, dimulai dengan "./" dan dimulai dengan "../" berarti memuat dengan jalur relatif, dan dimulai dengan "./" berarti memuat dengan file dalam direktori level yang sama,
File sufiks yang disebutkan sebelumnya dapat dihilangkan, file js prioritas yang mencoba memuat> file json> file node
Buat Modul Kustom
Ambil penghitung sebagai contoh
Salinan kode adalah sebagai berikut:
var outputVal = 0; // nilai output
var increment = 1; //Kenaikan
/* Tetapkan nilai output*/
fungsi seoutputval (val) {
outputVal = val;
}
/* Atur Increment*/
Function SetIncrement (IncrementVal) {
Increment = IncrementVal;
}
/* Output*/
function printNextCount ()
{
outputVal += kenaikan;
console.log (outputVal);
}
function printoutputVal () {
console.log (outputVal);
}
Exports.seoutputVal = SeoutputVal;
Exports.setIncrement = setIncrement;
module.exports.printnextcount = printNextCount;
Kode Sumber Sampel Modul Kustom
Fokus contohnya adalah Ekspor dan Modul. Exports; Ini menyediakan antarmuka akses eksternal. Sebut saja untuk melihat efeknya.
Memanggil Modul Kustom
Salinan kode adalah sebagai berikut:
/*
File Node.js adalah modul, yang mungkin merupakan kode JavaScript, JSON, atau ekstensi C/C ++ yang dikompilasi.
Dua objek penting:
Perlu mendapatkan modul dari luar
Ekspor memperlihatkan antarmuka modul
*/
var counter = membutuhkan ('./ 1_modules_custom_counter');
console.log ('Panggilan pertama ke modul [1_modules_custom_counter]');
counter.seoutputVal (10); // atur penghitungan mulai dari 10
counter.setincrement (10); // atur kenaikan menjadi 10
counter.printnextcount ();
counter.printnextcount ();
counter.printnextcount ();
counter.printnextcount ();
/*
Membutuhkan panggilan ke modul yang sama beberapa kali tidak akan dimuat berulang kali
*/
var counter = membutuhkan ('./ 1_modules_custom_counter');
console.log ('modul panggilan kedua [1_modules_custom_counter]');
counter.printnextcount ();
Kode Sumber Panggilan Mode Kustom
Jalankan dan temukan bahwa kedua metode yang terpapar kepada publik melalui ekspor dan modul. Ekspor dapat diakses!
Seperti yang dapat Anda lihat dalam contoh, saya mendapatkan modul dua kali dengan membutuhkan ('./ 1_modules_custom_counter'), tetapi setelah referensi kedua, saya memanggil metode printNextCount () memang dimulai dari 60 ~~~
Alasannya adalah bahwa Node.js memanggil modul yang sama beberapa kali melalui kebutuhan Persyaratan dan tidak akan memuat berulang kali. Node.js akan menemui semua modul file yang dimuat sesuai dengan nama file, sehingga tidak akan dimuat ulang.
Catatan: Caching melalui nama file mengacu pada nama file yang sebenarnya, dan itu tidak akan dianggap sebagai file yang berbeda karena jalur yang masuk berbeda.
Ada metode printoutputVal () dalam file 1_modules_custom_counter yang saya buat, yang tidak menyediakan metode akses publik melalui ekspor atau modul. Exports,
Apa yang terjadi jika Anda secara langsung mengakses file 1_modules_load?
Jawabannya adalah: TypeError: Object #<Peject> tidak memiliki metode 'printoutputVal'
Perbedaan antara ekspor dan modul. Exports
Melalui contoh di atas, baik ekspor maupun modul. Exports tersedia untuk akses! Karena keduanya dapat mencapai efeknya, harus ada sedikit perbedaan ~~~ mari kita ambil contoh!
Salinan kode adalah sebagai berikut:
var counter = 0;
Exports.PrintNextCount = function () {
penghitung += 2;
console.log (counter);
}
var iseq = (ekspor === module.Exports);
Console.log (Iseq);
2_modules_diff_exports.js kode sumber file
Mari Buat file 2_Modules_DIFF_EXPORTS_LOAD.js baru dan sebut saja
Salinan kode adalah sebagai berikut:
var counter = membutuhkan ('./ 2_modules_diff_exports');
Counter.printnextcount ();
Setelah menelepon, hasil eksekusi seperti yang ditunjukkan pada gambar di atas
I output Nilai iseq di file 2_modules_diff_exports_load.js (var iseq = (ekspor === module.exports);), true yang dikembalikan yang dikembalikan
PS: Perhatikan bahwa ada tiga tanda yang sama. Jika Anda tidak tahu apa yang Anda cari sendiri informasi itu!
Jangan terburu -buru untuk menarik kesimpulan, ubah dua file JS ini ke kode modul yang sesuai
Salinan kode adalah sebagai berikut:
// Kode sumber 2_modules_diff_exports.js yang dimodifikasi adalah sebagai berikut
var counter = 0;
module.exports = function () {
penghitung += 10;
this.printNextCount = function ()
{
console.log (counter);
}
}
var iseq = (ekspor === module.Exports);
Console.log (Iseq);
Salinan kode adalah sebagai berikut:
// Kode sumber file 2_modules_diff_exports_load.js yang dimodifikasi adalah sebagai berikut
var counter = membutuhkan ('./ 2_modules_diff_exports');
var counteroBj = counter baru ();
counterobj.printnextcount ();
Setelah menelepon, hasil eksekusi seperti yang ditunjukkan pada gambar di atas
I output Nilai ISEQ di file 2_modules_diff_exports_load.js (var iseq = (ekspor === module.exports);), dan yang dikembalikan false, yang tidak konsisten dengan hasil yang diperoleh sebelumnya!
PS: Jangan gunakan counter.printnextcount (); Untuk mengakses, Anda hanya akan mendapatkan prompt kesalahan
API memberikan penjelasan
http://nodejs.org/api/modules.html
Perhatikan bahwa ekspor adalah referensi ke modul. Eksport sehingga cocok untuk augmentasi saja. Jika Anda mengekspor satu item seperti konstruktor, Anda ingin menggunakan modul.
Ekspor hanyalah referensi alamat ke modul. Exports. NodeJs hanya akan mengekspor pointer Module.Exports. Jika pointer ekspor telah berubah, hanya saja ekspor tidak menunjuk ke modul. Eksportasi, sehingga mereka tidak akan diekspor lagi.
Lihat pemahaman lain:
http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
http://zihua.li/2012/03/use-module-exports-or-exports-in-node/
Module.Exports adalah antarmuka nyata, ekspor hanyalah alat tambahan untuk itu. Pengembalian akhir ke panggilan adalah Module.Exports bukan ekspor.
Semua properti dan metode yang dikumpulkan oleh ekspor ditugaskan ke Module.Exports. Tentu saja, ada prasyarat untuk ini, yaitu, modul. Exports sendiri tidak memiliki atribut atau metode.
Jika Module.Exports sudah memiliki beberapa properti dan metode, informasi yang dikumpulkan oleh ekspor akan diabaikan.
Ekspor dan Modul. Exports override
Di atas juga pada dasarnya memahami hubungan dan perbedaan antara ekspor dan modul. Exports, tetapi jika ekspor dan modul. Exports ada untuk metode printNextCount (), apa hasilnya?
Hasil panggilan
Seperti yang dapat dilihat dari hasil, tidak ada kesalahan, yang berarti dapat didefinisikan seperti ini, tetapi di modul akhir. Eksportasi menimpa ekspor
Meskipun hasilnya tidak akan diproduksi kesalahan, jika Anda menggunakannya seperti ini, pasti akan ada beberapa masalah dalam pengembangan.
1. Yang terbaik adalah tidak mendefinisikan modul. Eksportasi dan ekspor secara terpisah
2.NodeJS Developers merekomendasikan Module.Exports untuk mengekspor objek, dan ekspor untuk mengekspor beberapa metode dan variabel.
lainnya...
Ada metode lain yang disediakan di API, jadi saya tidak akan membahas detailnya. Berdasarkan contoh di atas, Anda akan mengetahuinya sendiri segera setelah Anda mengeluarkannya.
module.id
Mengembalikan pengidentifikasi modul string tipe, yang umumnya nama file yang diuraikan sepenuhnya
module.filename
Mengembalikan nama file yang sepenuhnya diuraikan dari jenis string
Module.Loaded
Mengembalikan jenis bool, menunjukkan apakah pemuatan selesai
module.parent
Mengembalikan modul yang merujuk pada modul
Module.Children
Mengembalikan array semua objek modul yang dirujuk oleh modul ini