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
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
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
2). Pemasangan global npm install -g
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