NodeJs的模組化和包

2023-03-21 21:00:53

模組化的基本概念

什麼是模組化?

模組化是解決一個複雜問題時,自頂向下逐層把系統劃分為若干個模組的過程,程式設計中,就是遵守一定規則,把一個大檔案拆成獨立並相互依賴的多個小模組。

模組化規範

使用什麼樣的語法格式參照模組和向外暴露成員

CommonJS規範

Node.js 遵循了 CommonJS 的模組化規範。其中:

  • 每個模組內部,module變數代表當前模組
  • 匯入其它模組使用require()方法
  • 模組對外共用成員使用 module.exports 物件

ES6 模組化規範

是瀏覽器端與伺服器端通用的模組化開發規範。它的出現極大的降低了前端開發者的模組化學習成本,開發者不需再額外學習 AMD、CMD 或 Commonjs 等模組化規範。
ES6 模組化規範中定義:

  • 每個js檔案都是一個獨立的模組
  • 匯入其它模組成員使用 import 關鍵字
  • 向外共用模組成員使用 export 關鍵字

在Node.js中設定ES6模組化規範:

  1. 安裝v14.15.1或更高版本的node.js
  2. package.js的根節點新增"type:""module"節點

Node.js中的模組化

Node.js中模組的分類

  • 內建模組:官方提供的fs、path、http等
  • 自定義模組:使用者建立的每個.js檔案,都是自定義模組
  • 第三方模組:由第三方開發的,需要下載的模組

載入模組

文章以CommonJS規範為例

//內建模組
const http = require('http')
//自定義模組
const custom = require('./custom.js')//字尾名可以省略
//第三方模組
const moment = require('moment')

注意:當使用require載入時,會執行被載入模組的程式碼

模組作用域

在自定義模組中定義的變數和方法等成員,只能在當前模組被存取,防止全域性變數汙染的問題

//username.js
const username='張三'

function sayHello(){
    console.log("大家好,我是"+username)
}

//test.js
const custom=require('./username')
console.log(custom)//輸出:{} 空物件

向外共用成員

module物件

每個.js自定義模組中都有一個module物件,它裡面儲存了和當前模組有關的資訊

module.exports物件

在自定義模組中,可以使用它將模組內的成員共用出去,當使用require()方法匯入時,得到的就是module.exports所指的物件

//username.js
module.exports.username = '張三'
module.exports.sayHello = function () {
    console.log("大家好,我是" + username)
}

注意:

  • module.exports預設指向空物件
  • 使用require()方法匯入的結果,以module.exports指向的物件為準

exports物件

為了簡化,Node提供了exports物件。預設情況下,exportsmodule.exports指向同一個物件。

exports.username= '張三'
module.exports={
    gender:'男',
    age:22
}
//{gender:'男',age:22}
module.exports.username= '張三'
exports={
    gender:'男',
    age:22
}
//{username:'張三'}
  • 使用require()方法匯入的結果,永遠以module.exports指向的物件為準
  • 防止混亂,不要在同一個模組中同時使用exportsmodule.exports

npm和包

在Node.js中第三方模組叫做,來自於第三方個人或團隊,免費且開源。

包基於內建模組封裝出來,提供了更高階、更方便的API,極大的提高了開發效率。

包的下載

  • https://www.npmis.com/ 網站上搜尋自己所需要的包
  • 從https://registry.npmis.org/ 伺服器上下載自己需要的包

使用npm包管理工具(Node Package Manager)

npm install 包的完整名稱
npm i 包的完整名稱 -g//全域性安裝
npm install [email protected]

npm uninstall 包的完整名稱

node_modules資料夾用來存放所有已安裝到專案中的包

package-lock.json組態檔用來記錄node_modules目錄下每一個包的下載資訊

包的版本號:「點分十進位制」

第一位數位:大版本

第二位數位:功能版本

第三位數位:Bug修復版本

(只要前面的版本號增長,後面歸零)

包管理組態檔

npm規定,專案根目錄中,必須提供一個package.json的包管理組態檔

npm init -y//快速新建package.json

dependencies節點

專門記錄使用npm insatll命令安裝了哪些包

npm install
//執行該命令,npm會讀取package.json中的dependencies節點,一次性下載所有的包

devDependencies節點

如果某些包只在開發中用到,建議安裝在devDependencies節點

npm i 包的完整名稱 -D
npm i 包的完整名稱 --save-dev

包下載慢的問題

切換npm的下包映象源

npm config get registry //檢視當前映象源
npm config set registry=xxxxxxxxxx//切換映象源

nrm工具

npm i nrm -g
nrm ls//檢視所有映象源
nrm use taobao//切換映象源

包的分類

專案包和全域性包、開發依賴包和核心依賴包

規範的包結構

  1. 包必須以單獨的目錄出現
  2. 包的頂級目錄必須包含package.json這個包組態檔
  3. package.json必須包含nameversionmain這三個屬性,分別代表包的名字、版本號、包的入口