Hampir semua pengembang Node.js dapat memberi tahu Anda apa yang dibutuhkan oleh fungsi `), tetapi berapa banyak dari kita yang benar -benar tahu cara kerjanya? Kami menggunakannya setiap hari untuk memuat perpustakaan dan modul, tetapi perilakunya merupakan misteri bagi kami.
Karena penasaran, saya menggali kode inti node untuk mencari tahu apa yang terjadi di bawah mesin. Tapi ini bukan fungsi tunggal. Saya menemukan module.js di sistem modul node. File ini berisi modul inti yang sangat kuat dan relatif tidak dikenal yang mengontrol pemuatan, kompilasi, dan caching setiap file. `membutuhkan ()`, kemunculannya hanyalah puncak gunung es.
module.js
Salinan kode adalah sebagai berikut:
Modul Fungsi (id, induk) {
this.id = id;
this.exports = {};
this.parent = Parent;
// ...
Di Module.js, ini terutama memainkan dua peran di dalam Node.js. Pertama, ini menyediakan fondasi untuk semua modul Node.js. Setiap file adalah instance baru dari modul dasar yang baru, dan masih ada bahkan setelah file dijalankan. Inilah sebabnya kami dapat melampirkan properti ke modul. Exports dan mengembalikannya saat dibutuhkan.
Tugas utama kedua dari modul ini adalah untuk menangani mekanisme pemuatan modul node. Operasi independen dari fungsi "membutuhkan" yang kami gunakan sebenarnya adalah modul konsep abstrak. Metode pemuatan ini menangani pemuatan aktual dari setiap file dan memulai perjalanan kami di sana.
Module._load
Salinan kode adalah sebagai berikut:
Module._load = function (permintaan, induk, ismain) {
// 1. Periksa modul._cache untuk modul yang di -cache.
// 2. Buat contoh modul baru jika cache kosong.
// 3. Simpan ke cache.
// 4. Call Module.Load () Dengan nama file Anda yang diberikan.
// Ini akan menghubungi modul.compile () setelah membaca konten file.
// 5. Jika ada kesalahan memuat/parsing file,
// Hapus modul yang buruk dari cache
// 6. Module Return. Exports
};
Module._load bertanggung jawab untuk memuat modul baru dan mengelola cache modul. Cache memuat setiap modul mengurangi jumlah bacaan file yang berlebihan dan dapat secara signifikan mempercepat aplikasi Anda. Selain itu, contoh modul bersama memungkinkan modul dengan karakteristik singleton tetap di negara bagian dalam proyek.
Jika suatu modul tidak ada di cache, module._load akan membuat modul dasar baru untuk file tersebut. Ini kemudian akan memberi tahu modul untuk membaca konten file baru sebelum mengirimnya ke module._compile. [1]
Jika Anda melihat langkah #6 di atas, Anda akan melihat modul itu. Exports telah dikembalikan ke pengguna. Inilah sebabnya ketika Anda mendefinisikan penggunaan antarmuka publik, Anda menggunakan ekspor dan modul. Exports, karena module._load selanjutnya akan mengembalikan konten kebutuhan. Saya terkejut bahwa tidak ada lagi fitur di sini, tetapi akan lebih baik jika ada.
module._compile
Salinan kode adalah sebagai berikut:
Module.prototype._compile = function (konten, fileName) {
// 1. Buat mandiri membutuhkan fungsi yang memanggil modul.
// 2. Pasang metode penolong lainnya untuk dibutuhkan.
// 3. Membungkus kode JS dalam fungsi yang memberikan kebutuhan kami,
// Modul, dll. Variabel secara lokal ke ruang lingkup modul.
// 4. Jalankan fungsi itu
};
・ Di sinilah keajaiban yang sebenarnya terjadi. Pertama, fungsi kebutuhan operasional khusus dan independen dibuat untuk modul. Ini adalah fitur yang kita butuhkan dan semuanya akrab. Fungsi itu sendiri hanyalah sebuah enkapsulasi dalam modul.
・ Membutuhkan (): Muat modul eksternal
・ Membutuhkan.resolve (): Parse nama modul ke jalur absolutnya
・ Membutuhkan.main: modul utama
・ Membutuhkan.cache: semua modul yang di -cache
・ ・ Membutuhkan.Extensions: Metode kompilasi yang dapat digunakan untuk setiap jenis file yang valid sesuai dengan ekstensi
Setelah kebutuhan siap, seluruh kode sumber yang dimuat akan dienkapsulasi dalam fungsi baru, memungkinkannya untuk menerima kebutuhan, modul, ekspor, dan semua variabel terbuka lainnya sebagai parameter. Ini adalah fungsi yang dibuat hanya untuk merangkum modul untuk mencegah konflik dengan lingkungan Node.js.
Salinan kode adalah sebagai berikut:
(fungsi (ekspor, membutuhkan, modul, __filename, __dirname) {
// Kode Anda disuntikkan di sini!
});
Metode module._compile dieksekusi secara sinkron, sehingga panggilan ke module._load hanya dapat menunggu sampai kode dijalankan berakhir dan mengembalikan module.exprts ke pengguna.
sebagai kesimpulan
Jadi kami telah memahami kode penuh kebutuhan dan memiliki pemahaman awal tentang cara kerjanya.
Jika Anda telah melakukannya sepanjang jalan, maka Anda siap untuk rahasia terakhir: membutuhkan ('modul'). Ini benar, sistem modul itu sendiri dapat dimuat melalui sistem modul. Lahirnya. Ini mungkin terdengar aneh, tetapi memungkinkan ruang pengguna untuk berinteraksi dengan sistem pemuatan modul tanpa mempelajari inti node.js. Modul populer semuanya dibangun seperti ini. [2]
Jika Anda ingin tahu lebih banyak, silakan periksa sendiri Kode Sumber Module.js. Masih ada banyak hal yang akan cukup bagi Anda untuk sakit kepala untuk sementara waktu. Yang pertama dapat memberi tahu saya apa node_module_contexts "dan mengapa ditambahkan bisa mendapatkan poin bonus :)
[1] Metode Module._Compile hanya digunakan untuk menjalankan file JavaScript. File JSON perlu diuraikan melalui json.parse () dan dikembalikan
[2] Namun, kedua modul dibangun di atas metode modul pribadi seperti modul._resolvelookuppaths dan module._findpath. Anda bisa berpikir ini tidak jauh lebih baik ...