Rumah  >  Artikel  >  hujung hadapan web  >  Analisis ringkas tentang prinsip kerja keperluan dalam Node.js_node.js

Analisis ringkas tentang prinsip kerja keperluan dalam Node.js_node.js

WBOY
WBOYasal
2016-05-16 16:43:121362semak imbas

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

Salin kod Kod adalah seperti berikut:

Fungsi Modul(id, ibu bapa) {
this.id = id;
this.exports = {};
ini.ibu bapa = ibu bapa;
// ...

Module.js memainkan dua peranan terutamanya dalam Node.js. Pertama, ia menyediakan asas untuk semua modul Node.js. Setiap fail ialah contoh baharu modul asas yang berterusan walaupun selepas fail telah dijalankan. Itulah sebabnya kita boleh melampirkan atribut pada module.exports dan mengembalikannya apabila diperlukan.

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

Salin kod Kod adalah seperti berikut:

Modul._load = fungsi(permintaan, induk, isMain) {
// 1. Semak Modul._cache untuk modul yang dicache
// 2. Cipta contoh Modul baharu jika cache kosong.
// 3. Simpan ke cache.
// 4. Panggil module.load() dengan nama fail yang diberikan.
// Ini akan memanggil module.compile() selepas membaca kandungan fail.
// 5. Jika terdapat ralat memuatkan/menghuraikan fail,
// Padam modul buruk daripada cache
// 6. kembalikan modul.eksport
};

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

Salin kod Kod adalah seperti berikut:

Module.prototype._compile = fungsi(kandungan, nama fail) {
// 1. Cipta fungsi memerlukan kendiri yang memanggil modul.require.
// 2. Lampirkan kaedah pembantu lain untuk memerlukan.
// 3. Membungkus kod JS dalam fungsi yang menyediakan keperluan kita,
// modul, dsb. pembolehubah setempat kepada skop modul.
// 4. Jalankan fungsi itu
};

· 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.

Salin kod Kod adalah seperti berikut:

(fungsi (eksport, memerlukan, modul, __nama fail, __nama nama) {
// KOD ANDA SUNTIKAN DI SINI!
});

Kaedah Module._compile dilaksanakan secara serentak, jadi panggilan ke Module._load hanya boleh menunggu sehingga penghujung kod ini dan mengembalikan modul.exprts kepada pengguna.

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...

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn