Sejak awal, tidak ada yang pernah menganggap JavaScript sebagai bahasa pemrograman. Di era Web 1.0, bahasa skrip ini terutama digunakan untuk verifikasi formulir dan efek khusus halaman web. Baru pada ERA Web 2.0 ERA front-end menggunakannya untuk sangat meningkatkan pengalaman pengguna di halaman web JS dinilai secara luas. Ketika JS menjadi semakin populer, ia secara kasar mengalami perubahan dalam pustaka alat, pustaka komponen, kerangka kerja front-end, dan aplikasi front-end. JavaScript secara inheren tidak memiliki fitur: modul, dan munculnya spesifikasi CommonJS menebus kekurangan ini. Artikel ini akan memperkenalkan spesifikasi CommonJS dan mekanisme modul node.
Dalam bahasa tingkat tinggi lainnya, Java memiliki file kelas, Python memiliki mekanisme impor, dan PHP telah memasukkan dan memerlukan. Cara JS memperkenalkan kode melalui tag <script> tampaknya berantakan. Di masa lalu, orang harus menggunakan ruang nama dan metode lain untuk membatasi kode secara artifisial. Tidak sampai spesifikasi CommonJS muncul bahwa javascript front-end dan back-end mampu mencapai kesatuan besar. Node meminjam spesifikasi modul CommonJS untuk mengimplementasikan sistem modul yang sangat mudah digunakan.
1. Spesifikasi Modul CommonJS
Spesifikasi modul CommonJS dibagi menjadi 3 bagian:
1). Referensi Modul: Memperkenalkan API modul ke dalam konteks saat ini melalui metode Persyaratan () dan lewat dalam pengidentifikasi modul, seperti var matematika = memerlukan ('matematika');
2). Definisi Modul: Ekspor metode atau variabel modul saat ini melalui objek Ekspor. Ada juga objek modul dalam modul, dan ekspor sebenarnya adalah atribut modul. Di Node, file adalah modul, dan "variabel global" dalam modul tidak terlihat oleh dunia luar. Hanya atribut yang dipasang pada ekspor yang publik, seperti exports.add = function () {}; Exports.pi = 3.1415926;
3) .module ID: Sebenarnya parameter yang dilewatkan ke membutuhkan (). Misalnya, 'matematika' yang disebutkan di atas, itu harus berupa string yang sesuai dengan nomenklatur unta, atau jalur relatif atau absolut yang dimulai dengan "." ".." Itu tidak dapat memiliki sufiks nama file ".js"
2. Proses Implementasi Modul Node
Dalam node, modul dibagi menjadi dua kategori: satu adalah modul inti yang disediakan oleh node itu sendiri, dan yang lainnya adalah modul file yang ditulis oleh pengguna itu sendiri. Beberapa modul inti dikompilasi ke dalam file biner selama kompilasi kode sumber simpul. Saat node dimulai, modul inti secara langsung dimuat ke dalam memori, sehingga kecepatan pemuatannya adalah yang tercepat. Modul file dimuat secara dinamis saat runtime dan membutuhkan tiga langkah: analisis jalur, lokasi file, dan kompilasi dan eksekusi. Perhatikan bahwa cache simpul memperkenalkan modul untuk mengurangi overhead selama pengenalan sekunder, dan mengadopsi strategi yang paling disukai untuk pemuatan sekunder dari modul yang sama.
2.1 Analisis jalur
Analisis jalur terutama menganalisis pengidentifikasi modul yang disebutkan di atas, yang terutama dibagi menjadi kategori berikut:
1) Modul inti, seperti HTTP, FS, Path, dll.
2) Modul file jalur relatif dimulai dengan. atau .
3) Modul File Path Absolute dimulai dengan /
4) Modul File Kustom, yang mungkin dalam bentuk file atau paket. Node akan mencoba menemukan file target satu per satu sesuai dengan modul Modul Path Array.
2.2 Lokasi File
Berdasarkan analisis jalur, rincian berikut perlu diperhatikan:
1) Analisis Ekstensi File: Karena spesifikasi CommonJS memungkinkan pengidentifikasi modul untuk tidak diisi, simpul akan mencoba dalam urutan .js, .json, dan .node
2) Analisis dan Paket Direktori: Jika tidak ada file yang sesuai ditemukan setelah analisis ekstensi file di atas, tetapi direktori diperoleh, node akan memperlakukan direktori sebagai paket.
2.3 Kompilasi dan Eksekusi
Setelah menemukan file tertentu, Node akan membuat objek modul baru, memuat dan mengkompilasi sesuai dengan jalur. Untuk ekstensi yang berbeda, metode pemuatan berbeda:
1) .js File: Baca file secara serempak melalui modul FS dan kompilasi dan jalankannya
2) .Node File: Ini adalah file ekstensi yang ditulis dalam C/C ++, dimuat melalui metode DLOPEN ()
3) .Json File: Baca file secara serempak melalui modul FS, dan gunakan json.parse () untuk menguraikan dan mengembalikan hasilnya
4) File ekstensi lainnya: mereka dimuat sebagai file .js
Kita tahu bahwa setiap file modul memiliki tiga variabel: membutuhkan, ekspor, dan modul secara default. Bahkan dalam dokumen Node API, kita tahu bahwa setiap modul juga memiliki dua variabel: nama file dan dirname. Darimana mereka berasal? Bagaimana modul node mencapai bahwa "variabel global" yang dinyatakan tidak akan benar -benar mencemari modul lain? Bahkan, Node akan membungkus konten file di awal dan akhir selama menyusun modul JS. Berikut adalah contoh file JS yang sedang dibungkus oleh kepala dan ekor:
Salinan kode adalah sebagai berikut:
(fungsi (ekspor, membutuhkan, modul, __filename, __dirname) {
/* Tengah adalah konten sebenarnya dari file js*/
var matematika = membutuhkan ('matematika');
exports.area = function (radius) {
return math.pi * radius * radius;
};
/* Konten sebenarnya dari file JS berakhir*/
});
Dengan cara ini, setiap file modul adalah isolasi tertutup, dan variabel seperti kebutuhan, ekspor, modul, dll. Juga disuntikkan ke dalam konteks modul. Ini adalah implementasi spesifikasi modul CommonJS Node. Proses kompilasi modul C/C ++ dan modul inti simpul relatif rumit, jadi saya tidak akan mengulanginya lagi.
3. Stack Panggilan Modul
Penting untuk mengklarifikasi hubungan panggilan dari berbagai modul dalam simpul, seperti yang ditunjukkan pada gambar di bawah ini:
Modul bawaan C/C ++ adalah modul tingkat terendah dan termasuk dalam modul inti. Ini terutama menyediakan API untuk memanggil modul inti JavaScript dan modul file JavaScript pihak ketiga. Bahkan, hampir tidak ada kontak dengan modul seperti itu. Ada dua tanggung jawab utama dari modul inti JavaScript: satu adalah untuk berfungsi sebagai lapisan enkapsulasi dan lapisan bridging dari modul bawaan C/C ++ untuk panggilan modul file, dan yang lainnya adalah modul fungsional murni yang tidak perlu menangani lapisan yang mendasarinya. Modul file biasanya ditulis oleh pihak ketiga, termasuk modul JavaScript biasa dan modul ekstensi C/C ++.
4. Paket dan NPM
4.1 Struktur Paket
Paket pada dasarnya adalah file arsip (biasanya .zip atau .tar.gz), yang didekompresi dan dipulihkan ke direktori setelah instalasi. Spesifikasi Paket CommonJS terdiri dari dua bagian: Struktur paket dan file deskripsi paket. Struktur paket yang sepenuhnya sesuai dengan spesifikasi CommonJS harus berisi file -file berikut:
1) .package.json: file deskripsi paket
2) .Bin: Direktori tempat file biner yang dapat dieksekusi disimpan
3) .lib: Direktori di mana kode JavaScript disimpan
4) .doc: Direktori tempat dokumen disimpan
5). Test: Direktori di mana kasus uji unit disimpan
4.2 File Deskripsi Paket
File Deskripsi Paket adalah file JSON - package.json, yang terletak di direktori root paket, adalah bagian penting dari paket dan digunakan untuk menggambarkan informasi ikhtisar paket. Semua perilaku NPM yang akan disebutkan nanti terkait erat dengan bidang file ini. Di bawah ini, kami akan menggunakan file package.json dari proyek Web Framework Express yang terkenal sebagai contoh untuk menggambarkan arti dari beberapa bidang yang biasa digunakan.
1) .Name: Nama paket
2) .Description: Paket Paket
3) .Version: Nomor Versi harus mematuhi "Kontrol Versi Semantik", lihat http://semver.org/
4). Dependensi: Gunakan daftar paket yang perlu diandalkan paket saat ini. Properti ini sangat penting. NPM akan secara otomatis memuat paket dependen melalui properti ini
5). Repositori: Daftar Lokasi untuk Hosting Kode Sumber
Penggunaan bidang lain dapat dirujuk ke NPM Package.json Deskripsi
4.3 Fungsi umum NPM
NPM (Node Package Manager), umumnya dikenal sebagai Node Package Manager. Fungsi utamanya adalah mengelola paket node, termasuk: instalasi, uninstall, update, view, search, publish, dll.
4.3.1 Instalasi Paket NPM
Ada dua jenis pemasangan paket simpul: instalasi lokal dan instalasi global. Perbedaan antara keduanya adalah sebagai berikut:
1). Instalasi Lokal NPM Instal <packing-name>: Paket akan diunduh ke direktori saat ini dan hanya dapat digunakan dalam direktori saat ini.
2). Instalasi Global NPM Instalasi -g <package-name>: Paket akan diunduh ke direktori sistem tertentu, dan paket yang diinstal dapat digunakan di semua direktori.
4.3.2 Manajemen Paket NPM
Berikut ini adalah daftar perintah manajemen paket yang umum digunakan menggunakan Grunt-Cli (alat baris perintah Grunt) sebagai contoh:
1) .NPM Instal: Instal semua paket yang dideklarasikan oleh bidang dependensi dan ketergantungan devdependensi dari file package.json
2) .npm Instal [email protected]: Instal versi spesifik Grunt-Cli
3) .NPM Instal Grunt-Contrib-Copy --Save: Instal Grunt-Contrib-Copy dan simpan ketergantungan ke file package.json
4) .npm uninstall grunt-cli: Paket uninstall
5) Daftar .NPM: Periksa paket mana yang diinstal
6) .npm Publikasikan <Folder>: Paket Publikasikan