Louis's blog
GitHub
GitHub
  • 瀏覽器運作原理
  • 閉包
  • this
  • arguments 和 array-like
  • apply、call、bind
  • 函式程式設計
  • 物件和原型
  • 原型鏈和繼承
  • ES6 和 Class
  • ES6 中新增的數據類型
  • ES6 語法糖
  • var、let、const
  • ES7~ES12
  • Strict Mode
  • 補充
  • Proxy 和 Reflect
  • Promise
  • Iterator
  • 生成器
  • async、await
  • Event loop
  • 錯誤處理
  • 模塊化
  • 套件管理工具
  • JSON
  • WebStorage
  • IndexDB
  • Cookie
  • BOM
  • DOM
  • 防抖(debounce)和節流(throttle)
  • Deep copy
  • 事件總線

套件管理工具

透過一個專業的套件管理工具,能將開源的庫和框架發布到特定的倉庫,其他工程師能透過該工具安裝、升級、刪除。

現在最主流的 JavaScript 套件管理工具是 npm,全稱 Node Package Manager,只要安裝 Nodejs 就會自動安裝 npm。

初始化

輸入 npm init 初始化項目,將訊息輸入完畢後會建立一個文件 package.json,文件中描述了有關於當前項目訊息:

{
  "name": "npmdemo",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
  • name 項目名稱(必填)

  • version 當前版本號(必填)

  • description 項目描述

  • main 在作為第三庫導入時會將其作為導入的入口文件

  • scripts 啟動腳本

  • author 作者

  • license 開源協議

  • private 項目是否為私有,為 true 無法發布

  • engines 可以對 node 版本進行規範,如:node > 8.0.0

安裝第三方庫

安裝當前項目在生成時需要依賴的包:

npm i <package name>

安裝當前項目在生成時需要依賴的包:

npm i <package name> -D

在安裝第三方庫後,package.json 可能會多出兩個屬性:

{
  "name": "npmdemo",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "aaa": "node ./scripts/aaa.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.25.0"
  },
  "devDependencies": {
    "webpack": "^5.67.0"
  }
}
  • dependencies 描述當前項目對於第三方庫的依賴以及庫的版本號
  • devDependencies 和上面相同,不過是只有在開發時需要安裝的庫,有可能是打包工具或是腳本工具
  • peerDependencies 在使用第三方庫,某些第三方庫會需要當前項目是基於某些庫上面的,該屬性可以描述需要哪些庫。

某些第三庫也會自訂屬性可以放在 package.json 中配置,如:ESLint、browserslist

版本管理

npm 包通常遵循 semver 版本管理規範,semver 要求版本號是三位 X.Y.Z:

  • X 主版本號(major):當做了可能不兼容向下版本的 API 修改;
  • Y 次版本號(minor):當做了向下兼容的功能性增加;
  • Z 修訂號(patch):當做了某些問題修正;

在版本號前面有可能加上^或 ~:

  • ^ X.Y.Z:表示 X 不變,Y 和 Z 安裝最新版本
  • ~ X.Y.Z:表示 X 和 Y 不變,Z 安裝最新版本

不過如果有 package-lock.json 文件,會優先安照該文件紀錄的版本安裝。

全局安裝

如果進行全局安裝,該庫導出的命令會被添加到環境變量中:

npm i -g vue-cli

在命令行中輸入:

vue --version
@vue/cli 4.5.13

npm install 流程

通常如果從 GitHub 上面下載下來程式碼,都要執行 npm install 以下載第三庫的依賴,具體流程如下:

  • 沒有 package-lock.json
    • 分析依賴關係
    • 從倉庫中下載壓縮包
    • 緩存壓縮包
    • 將壓縮包解壓生成 node_modules
  • 有 package-lock.json
    • 檢測 package-lock.json 和 package.json 中版本是否一致,如不一致會重新建構依賴關係
    • 一致的情況下會優先查找緩存

image-20220123163743595

透過一個指令能找到 npm 緩存的存放位置:

npm get cache

npm 其他指令

卸載:

npm uninstall <package>

清除緩存:

npm clean cache

其他見 https://docs.npmjs.com/cli/v8/commands

yarn

yarn 是為了彌補早期 npm 的缺陷,雖然 npm5 開始已經進行了很多升級版改進,依然有很多人使用 yarn,首先要進行全局安裝:

npm i -g yarn

以下為命令的對比:

commandnpmyarn
Install dependenciesnpm installyarn
Install packagenpm install package_name npm install package_name@version_numberyarn add package_name yarn add package_name@version_number
Uninstall packagenpm uninstall package_nameyarn remove package_name
Install dev packagenpm install package_name –save-devyarn add package_name –dev
Update dev packagenpm update package_name npm update package_name@version_numberyarn upgrade package_name yarn upgrade package_name@version_number
View packagenpm view package_nameyarn info package_name
Global install packagenpm install -g package_nameyarn global add package_name

npx

npx 也是 Nodejs 自帶的工具:

  • 透過 npx 能夠優先查找本地的 node_modules 中存在的第三方命令工具
  • npx 在本地沒有安裝的情況下會從線上的 registry 獲取相關的命令工具,如:create-react-app

發布 npm 套件

可以在 package.json 中加入對該套件的描述:

{
  "name": "my_util",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "xxx.github.com/my_util"
  },
  "homepage": "xxx.github.com/my_util",
  "keywords": ["utils"],
  "author": "Louis",
  "license": "ISC"
}
  • repository 倉庫訊息
  • homepage 頁面,可能框架的首頁或是 GitHub 頁面
  • keywords 他人可以透過該關鍵字進行搜索

在註冊一個 npm 帳號之後,在命令行中輸入 npm login 進行登入。

最後使用 npm publish 進行發布。

如果使用組織方式發布,需要使用 npm publish --access=public

更新包,需要更改版本號重新 npm publish 。

刪除包:npm unpublish

讓發布的包過期:npm deprecate

Edit this page
Last Updated:
Contributors: louis, louis61619
Prev
模塊化
Next
JSON