Rumah > Artikel > hujung hadapan web > Analisis ringkas tentang prinsip kerja keperluan dalam Node.js_node.js
Hampir mana-mana pembangun Node.js boleh memberitahu anda fungsi require() tetapi berapa ramai daripada kita yang benar-benar tahu cara ia berfungsi? Kami menggunakannya setiap hari untuk memuatkan perpustakaan dan modul, tetapi tingkah lakunya adalah misteri kepada kami.
Oleh kerana ingin tahu, saya menggali kod teras nod untuk mengetahui perkara yang berlaku di bawah hud. Tetapi ini bukan satu fungsi yang saya temui module.js dalam sistem modul nod. Fail ini mengandungi modul teras yang sangat berkuasa dan agak asing yang mengawal pemuatan, penyusunan dan caching setiap fail. `require()`, kemunculannya hanyalah puncak gunung ais.
modul.js
Tugas utama kedua modul ini ialah mengendalikan mekanisme pemuatan modul nod. Fungsi "require" operasi bebas yang kami gunakan sebenarnya adalah konsep abstrak modul.require, yang itu sendiri hanyalah enkapsulasi ringkas bagi fungsi Module._load. Kaedah pemuatan ini mengendalikan pemuatan sebenar setiap fail dan memulakan perjalanan kami di sana.
Modul._load
Module._load bertanggungjawab untuk memuatkan modul baharu dan menguruskan cache modul. Caching setiap modul yang dimuatkan mengurangkan bilangan bacaan fail berlebihan dan boleh mempercepatkan aplikasi anda dengan ketara. Selain itu, kejadian modul yang dikongsi membolehkan ciri tunggal modul kekal dalam keadaan projek.
Jika modul tidak wujud dalam cache, Module._load akan mencipta modul asas baharu bagi fail tersebut. Ia kemudian memberitahu modul untuk membaca kandungan fail baharu sebelum menghantarnya ke module._compile. [1]
Jika anda perasan langkah #6 di atas, anda akan melihat modul.eksport telah dikembalikan kepada pengguna. Inilah sebabnya apabila anda menentukan antara muka awam untuk digunakan, anda menggunakan eksport dan module.exports, kerana Module._load seterusnya akan mengembalikan kandungan yang diperlukan. Saya terkejut tiada lagi ciri di sini, tetapi alangkah baiknya jika ada.
modul._kompilasi
· Di sinilah keajaiban sebenar berlaku. Mula-mula, fungsi memerlukan yang berdiri sendiri khas dicipta untuk modul ini. Ini adalah ciri yang kita semua perlukan dan biasa. Fungsi itu sendiri hanyalah pakej dalam Module.require, dan ia juga mengandungi beberapa kaedah tambahan yang kurang diketahui yang mudah untuk kita gunakan:
· memerlukan(): Muatkan modul luaran
· require.resolve(): Selesaikan nama modul ke laluan mutlaknya
· memerlukan.utama:modul utama
· require.cache: semua modul cache
· ·require.extensions: Kaedah kompilasi yang tersedia untuk setiap jenis fail yang sah mengikut sambungannya
Setelah keperluan sedia, keseluruhan kod sumber yang dimuatkan dirangkumkan dalam fungsi baharu yang boleh menerima keperluan, modul, eksport dan semua pembolehubah terdedah lain sebagai parameter. Ini ialah fungsi yang dicipta semata-mata untuk merangkum modul untuk mengelakkan konflik dengan persekitaran Node.js.
Kesimpulan
Jadi, kami telah memahami keseluruhan kod keperluan dan mempunyai pemahaman awal tentang cara ia berfungsi.
Jika anda telah mengikuti semua ini, maka anda sudah bersedia untuk rahsia terakhir: require('module'). Betul, sistem modul itu sendiri boleh dimuatkan melalui sistem modul. Permulaan. Ini mungkin kedengaran pelik, tetapi ia membenarkan ruang pengguna untuk berinteraksi dengan sistem pemuatan modul tanpa perlu menyelidiki teras Node.js. Modul popular dibina seperti ini. [2]
Jika anda ingin mengetahui lebih lanjut, lihat sendiri kod sumber module.js. Terdapat perkara yang cukup untuk membuat anda sakit kepala seketika. Bolehkah yang pertama memberitahu saya apa itu NODE_MODULE_CONTEXTS" dan sebab ia ditambahkan dan orang yang menambahkannya boleh mendapat mata bonus :)
[1] Kaedah modul._compile hanya digunakan untuk menjalankan fail JavaScript. Fail JSON perlu dihuraikan melalui JSON.parse() dan dikembalikan
[2] Walau bagaimanapun, kedua-dua modul dibina pada kaedah modul peribadi seperti Module._resolveLookupPaths dan Module._findPath. Anda boleh fikir ia tidak lebih baik...