Rumah  >  Artikel  >  hujung hadapan web  >  Nota Kajian tentang Mekanisme Modul dalam Node.js_node.js

Nota Kajian tentang Mekanisme Modul dalam Node.js_node.js

WBOY
WBOYasal
2016-05-16 16:32:041292semak imbas

Sejak kelahiran Javascript, tiada siapa yang pernah menganggapnya sebagai bahasa pengaturcaraan. Dalam era Web 1.0, bahasa skrip ini digunakan terutamanya untuk pengesahan borang dan kesan khas halaman web. Sehinggalah era Web 2.0, apabila jurutera hadapan menggunakannya untuk meningkatkan pengalaman pengguna pada halaman web, JS dinilai secara meluas. Apabila JS menjadi semakin popular, ia secara kasarnya telah melalui perubahan dalam perpustakaan alat, perpustakaan komponen, rangka kerja bahagian hadapan dan aplikasi bahagian hadapan. Javascript sememangnya kekurangan satu ciri: modul, dan kemunculan spesifikasi CommonJS menggantikan kelemahan ini. Artikel ini akan memperkenalkan spesifikasi CommonJS dan mekanisme modul Node.

Antara bahasa peringkat tinggi yang lain, Java mempunyai fail kelas, Python mempunyai mekanisme import dan PHP mempunyai sertakan dan memerlukan. Cara JS memperkenalkan kod melalui teg Pada masa lalu, orang ramai terpaksa menggunakan ruang nama dan kaedah lain untuk menyekat kod secara buatan. Ia tidaklah sehingga kemunculan spesifikasi CommonJS barulah Javascript bahagian hadapan dan bahagian belakang boleh disatukan. Node menggunakan spesifikasi Modul CommonJS untuk melaksanakan sistem modul yang sangat mudah digunakan.

1. Spesifikasi modul CommonJS

Spesifikasi modul CommonJS dibahagikan kepada 3 bahagian:

1). Rujukan modul: memperkenalkan API modul ke dalam konteks semasa melalui kaedah require() dan lulus dalam pengecam modul, seperti var math = require('math'); 2).Definasi modul: Eksport kaedah atau pembolehubah modul semasa melalui objek eksport. Terdapat juga objek modul dalam modul, dan eksport sebenarnya adalah atribut modul. Dalam Node, fail ialah modul dan "pembolehubah global" dalam modul tidak kelihatan kepada dunia luar Hanya atribut yang dipasang pada eksport adalah awam, seperti exports.add = function() {}; = 3.1415926;
3). Pengenalpastian modul: Ia sebenarnya adalah parameter yang diluluskan untuk memerlukan(), seperti 'matematik' di atas, yang mestilah rentetan yang mematuhi tatanama unta, atau laluan relatif bermula dengan ".." atau Laluan mutlak, ia tidak boleh mempunyai akhiran nama fail ".js"

2. Proses pelaksanaan modul nod

Dalam Node, modul dibahagikan kepada dua kategori: satu ialah modul teras yang disediakan oleh Node itu sendiri, dan satu lagi ialah modul fail yang ditulis oleh pengguna. Sebahagian daripada modul teras disusun ke dalam fail binari semasa proses penyusunan kod sumber Node Modul teras dimuatkan terus ke dalam memori apabila Node bermula, jadi kelajuan pemuatannya adalah yang paling pantas. Modul fail dimuatkan secara dinamik pada masa jalan dan memerlukan tiga langkah: analisis laluan, lokasi fail dan penyusunan serta pelaksanaan. Ambil perhatian bahawa Node cache modul yang diimport untuk mengurangkan kos pengenalan sekunder, dan menggunakan strategi pemuatan daripada cache dengan keutamaan tertinggi untuk pemuatan sekunder modul yang sama.

Analisis Laluan 2.1

Analisis laluan terutamanya menganalisis pengecam modul yang dinyatakan di atas, yang kebanyakannya dibahagikan kepada kategori berikut:

1), modul teras, seperti http, fs, laluan, dll.

2) Modul fail laluan relatif bermula dengan, ..
3). Modul fail laluan mutlak bermula dengan /
4). Modul fail tersuai, yang mungkin dalam bentuk fail atau pakej. Node akan cuba mencari fail sasaran satu demi satu mengikut modul tatasusunan laluan modul.paths Ia biasanya mencari direktori bernama node_modules di sepanjang direktori semasa langkah demi langkah sehingga direktori akar, jadi ini adalah cara yang paling memakan masa. untuk mencarinya.

2.2 Kedudukan Fail

Berdasarkan analisis laluan, lokasi fail perlu memberi perhatian kepada butiran berikut:

1) Analisis sambungan fail: Memandangkan spesifikasi CommonJS membenarkan pengecam modul untuk tidak mengisi sambungan, Node akan mengisi sambungan dalam susunan .js, .json dan .node, dan mencuba mengikut urutan

2) Analisis dan pakej direktori: Jika fail yang sepadan tidak ditemui selepas analisis sambungan fail di atas, tetapi direktori diperoleh, Node akan menganggap direktori sebagai pakej

2.3 Penyusunan dan pelaksanaan

Selepas mencari fail tertentu, Node akan mencipta objek modul baharu, memuatkan dan menyusunnya mengikut laluan. Untuk sambungan yang berbeza, kaedah pemuatan adalah berbeza:

1), fail .js: baca fail serentak melalui modul fs dan susun serta laksanakan

2). Fail .node: Ini ialah fail sambungan yang ditulis dalam C/C dan dimuatkan melalui kaedah dlopen()
Fail 3).json: Baca fail secara serentak melalui modul fs dan gunakan JSON.parse() untuk menghuraikan dan mengembalikan hasil
4). Fail sambungan lain: dimuatkan sebagai fail .js

Kami tahu bahawa setiap fail modul mempunyai tiga pembolehubah: memerlukan, eksport dan modul secara lalai Malah dalam dokumentasi API Node, kami tahu bahawa setiap modul juga mempunyai dua pembolehubah: nama fail dan nama mereka. Bagaimanakah modul Node memastikan bahawa "pembolehubah global" yang diisytiharkan tidak benar-benar mencemarkan modul lain? Malah, Node akan membungkus kepala dan ekor kandungan fail semasa penyusunan modul JS. Berikut ialah contoh fail JS dengan pembungkusan kepala dan ekor:

Salin kod Kod adalah seperti berikut:

(fungsi(eksport, memerlukan, modul, __nama fail, __nama nama) {
/* Bahagian tengah ialah kandungan sebenar fail JS */
var math = memerlukan('math');
eksport.kawasan = fungsi(jejari) {
          kembalikan Math.PI * jejari * jejari;
};
/* Kandungan sebenar fail JS berakhir */
});

Dengan cara ini, setiap fail modul diasingkan skop dan pembolehubah seperti keperluan, eksport dan modul juga disuntik ke dalam konteks modul. Ini ialah pelaksanaan spesifikasi modul CommonJS Node. Proses penyusunan modul C/C dan modul teras Nod agak rumit dan tidak akan diterangkan secara terperinci.

3. Timbunan panggilan modul

Perlu untuk menjelaskan hubungan panggilan pelbagai modul dalam Node, seperti yang ditunjukkan dalam rajah di bawah:

Modul terbina dalam C/C ialah modul paling rendah dan merupakan modul teras Ia terutamanya menyediakan API untuk modul teras Javascript dan modul fail Javascript pihak ketiga untuk dipanggil. Modul teras Javascript mempunyai dua tanggungjawab utama: satu adalah untuk berfungsi sebagai lapisan enkapsulasi dan lapisan penyambung bagi modul terbina dalam C/C untuk panggilan modul fail, dan satu lagi adalah modul berfungsi semata-mata yang tidak perlu berurusan dengan lapisan bawah. Modul fail biasanya ditulis oleh pihak ketiga, termasuk modul Javascript biasa dan modul sambungan C/C.

4. Pakej dan NPM

Struktur Pakej 4.1

Pakej pada asasnya ialah fail arkib (biasanya .zip atau .tar.gz), yang boleh dinyahmampat dan dipulihkan ke direktori selepas pemasangan. Spesifikasi pakej CommonJS terdiri daripada dua bahagian: struktur pakej dan fail penerangan pakej. Struktur pakej yang mematuhi sepenuhnya spesifikasi CommonJS harus mengandungi fail berikut:

1).package.json: fail penerangan pakej
2).bin: direktori tempat fail binari boleh laku disimpan
3).lib: Direktori untuk menyimpan kod Javascript
4).doc: Direktori untuk menyimpan dokumen
5).ujian: Direktori untuk menyimpan kes ujian unit

4.2 Fail Penerangan Pakej

Fail perihalan pakej ialah fail JSON - package.json, terletak dalam direktori akar pakej. Ia adalah bahagian penting dalam pakej dan digunakan untuk menerangkan maklumat umum pakej. Semua tingkah laku NPM yang akan disebut kemudian berkait rapat dengan medan fail ini. Yang berikut menggunakan fail package.json bagi projek ekspres rangka kerja Web yang terkenal sebagai contoh untuk menggambarkan maksud beberapa medan biasa.

1).nama: nama pakej
2).penerangan: pengenalan pakej
3).versi: nombor versi, yang mesti mematuhi "kawalan versi semantik", rujuk http://semver.org/
4).bergantungan: Senarai pakej yang diperlukan untuk menggunakan pakej semasa. Atribut ini sangat penting. NPM akan memuatkan pakej bergantung secara automatik melalui atribut ini
5).repositori: Senarai lokasi di mana kod sumber dihoskan

Untuk penggunaan medan lain, sila rujuk pada keterangan NPM package.json

4.3 NPM fungsi biasa

NPM (pengurus pakej nod), biasanya dipanggil pengurus pakej nod. Fungsi utamanya ialah untuk menguruskan pakej nod, termasuk: pemasangan, nyahpasang, kemas kini, lihat, carian, keluarkan, dll.

4.3.1 Pemasangan pakej NPM

Terdapat dua jenis pemasangan pakej Node: pemasangan tempatan dan pemasangan global. Perbezaan antara keduanya adalah seperti berikut:

1). Pemasangan tempatan npm install : Pakej akan dimuat turun ke direktori semasa dan hanya boleh digunakan dalam direktori semasa.
2). Pemasangan global npm install -g : Pakej akan dimuat turun ke direktori sistem tertentu dan pakej yang dipasang boleh digunakan dalam semua direktori.

4.3.2 Pengurusan pakej NPM

Berikut mengambil grunt-cli (alat baris arahan grunt) sebagai contoh untuk menyenaraikan arahan pengurusan pakej yang biasa digunakan:

1).npm install: Pasang semua pakej yang diisytiharkan dalam medan dependencies dan devDependencies fail package.json
2).npm install grunt-cli@0.1.9: Pasang versi khusus grunt-cli
3).npm install grunt-contrib-copy --save: Pasang grunt-contrib-copy dan simpan kebergantungan pada fail package.json
4).npm nyahpasang grunt-cli: Nyahpasang pakej
5).senarai npm: Semak pakej yang dipasang
6).npm terbitkan :Terbitkan pakej

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