品牌設(shè)計(jì)公司簡(jiǎn)介廣東seo網(wǎng)絡(luò)培訓(xùn)
一、簡(jiǎn)介
CommonJS 的出現(xiàn),使 node 環(huán)境下的 JS 代碼可以用模塊更加細(xì)粒度的劃分。一個(gè)類(lèi)、一個(gè)函數(shù)、一個(gè)對(duì)象、一個(gè)配置等等均可以作為模塊,這種細(xì)粒度的劃分,是開(kāi)發(fā)大型應(yīng)用的基石。
為了解決在開(kāi)發(fā)過(guò)程中遇到的常見(jiàn)問(wèn)題,比如加密、提供常見(jiàn)的工具方法、模擬數(shù)據(jù)等等,一時(shí)間,在前端社區(qū)涌現(xiàn)了大量的第三方庫(kù)。這些庫(kù)使用 CommonJS 標(biāo)準(zhǔn)書(shū)寫(xiě)而成,非常容易使用。
這些庫(kù)通常以NPM包的形式提供依賴(lài),而且在使用時(shí)需要進(jìn)行版本管理。因此需要一個(gè)包管理庫(kù)來(lái)統(tǒng)一管理這些依賴(lài)庫(kù),來(lái)避免版本沖突和管理繁瑣。
模塊(module):通常以單個(gè)文件形式存在的功能片段,入口文件通常稱(chēng)之為入口模塊或主模塊。
庫(kù)(library,簡(jiǎn)稱(chēng)lib):以一個(gè)或多個(gè)模塊組成的完整功能塊,為開(kāi)發(fā)中某一方面的問(wèn)題提供完整的解決方案
包(package):包含元數(shù)據(jù)的庫(kù),這些元數(shù)據(jù)包括:名稱(chēng)、描述、git主頁(yè)、許可證協(xié)議、作者、依賴(lài)等等
常用的包管理工具包括:
NPM:NPM(Node Package Manager)是Node.js自帶的包管理工具,也是最常用的包管理工具之一??梢苑奖愕匕惭b、升級(jí)、卸載依賴(lài)包,還可以發(fā)布自己的包到NPM倉(cāng)庫(kù)。
Yarn:Yarn是Facebook推出的包管理工具,具有速度快、緩存機(jī)制好等優(yōu)點(diǎn)。與NPM相比,Yarn可以更快地下載依賴(lài)包,并且支持離線(xiàn)模式。
PNPM:PNPM(Permissive NPM)是一款新興的包管理工具,采用了類(lèi)似于軟連接的方式,將依賴(lài)包安裝到每個(gè)項(xiàng)目的 node_modules 目錄下,從而避免了大量的重復(fù)安裝。
二、NPM
目前所有的包管理器都是基于 npm 的,npm本身就是一個(gè)包管理器。
運(yùn)行在 node 環(huán)境中,讓開(kāi)發(fā)者可以用簡(jiǎn)單的方式完成包的查找、安裝、更新、卸載、上傳等操作。
npm 由三部分組成:
registry:入口
可以把它想象成一個(gè)龐大的數(shù)據(jù)庫(kù)
第三方庫(kù)的開(kāi)發(fā)者,將自己的庫(kù)按照 npm 的規(guī)范,打包上傳到數(shù)據(jù)庫(kù)中
使用者通過(guò)統(tǒng)一的地址下載第三方包
官網(wǎng):https://www.npmjs.com/
查詢(xún)包
注冊(cè)、登錄、管理個(gè)人信息
CLI:command-line interface 命令行接口
安裝好 npm 后,通過(guò) CLI 來(lái)使用 npm 的各種功能
- 本地安裝:使用命令npm install 包名或npm i 包名即可完成本地安裝,本地安裝的包出現(xiàn)在當(dāng)前目錄下的node_modules目錄中。
4.包配置:
(1)配置文件:npm將每個(gè)使用npm的工程本身都看作是一個(gè)包,包的信息通過(guò)一個(gè)名稱(chēng)固定的配置文件來(lái)描述。
該文件為:package.json。
配置文件中可以描述大量的信息,包括:
name:包的名稱(chēng),該名稱(chēng)必須是英文單詞字符,支持連接符
version:版本
版本規(guī)范:主版本號(hào).次版本號(hào).補(bǔ)丁版本號(hào)
主版本號(hào):僅當(dāng)程序發(fā)生了重大變化時(shí)才會(huì)增長(zhǎng),如新增了重要功能、新增了大量的API、技術(shù)架構(gòu)發(fā)生了重大變化
次版本號(hào):僅當(dāng)程序發(fā)生了一些小變化時(shí)才會(huì)增長(zhǎng),如新增了一些小功能、新增了一些輔助型的API
補(bǔ)丁版本號(hào):僅當(dāng)解決了一些 bug 或 進(jìn)行了一些局部?jī)?yōu)化時(shí)更新,如修復(fù)了某個(gè)函數(shù)的 bug、提升了某個(gè)函數(shù)的運(yùn)行效率
description:包的描述
homepage:官網(wǎng)地址
author:包的作者,必須是有效的 npm 賬戶(hù)名,書(shū)寫(xiě)規(guī)范是 account ,例如:zhangsan zhangsan@gmail.com,不正確的賬號(hào)和郵箱可能導(dǎo)致發(fā)布包時(shí)失敗
repository:包的倉(cāng)儲(chǔ)地址,通常指 git 或 svn 的地址,它是一個(gè)對(duì)象
type:倉(cāng)儲(chǔ)類(lèi)型,git 或 svn
url:地址
main:包的入口文件,使用包的人默認(rèn)從該入口文件導(dǎo)入包的內(nèi)容
keywords: 搜索關(guān)鍵字,發(fā)布包后,可以通過(guò)該數(shù)組中的關(guān)鍵字搜索到包
(2)保存依賴(lài)關(guān)系
package.json文件最重要的作用,是記錄當(dāng)前工程的依賴(lài)
dependencies:生產(chǎn)環(huán)境的依賴(lài)包
devDependencies:僅開(kāi)發(fā)環(huán)境的依賴(lài)包
通過(guò)這樣的方式,移植代碼時(shí),只需要移植源代碼和package.json文件,不用移植node_modules目錄,然后在移植之后通過(guò)命令即可重新恢復(fù)安裝
5.語(yǔ)義版本:
當(dāng)x.y.z的情況下:表示是一個(gè)明確的版本號(hào)當(dāng)^x.y.z的情況下:表示是x版本保持不變,y和z永遠(yuǎn)是最新的當(dāng)~x.y.z的情況下:表示的是x和y是保持不變的,z永遠(yuǎn)是最新的
當(dāng)希望使用包的人使用指定包和版本時(shí),需要在配置文件中描述具體的依賴(lài)規(guī)則,通過(guò)語(yǔ)義版本來(lái)實(shí)現(xiàn),規(guī)則如下。
符號(hào) 描述 示例 示例描述
大于某個(gè)版本 >1.2.1 大于1.2.1版本
= 大于等于某個(gè)版本 >=1.2.1 大于等于1.2.1版本
< 小于某個(gè)版本 <1.2.1 小于1.2.1版本
<= 小于等于某個(gè)版本 <=1.2.1 小于等于1.2.1版本
- 介于兩個(gè)版本之間 1.2.1 - 1.4.5 介于1.2.1和1.4.5之間
- x 不固定的版本號(hào) 1.3.x 只要保證主版本號(hào)是1,次版本號(hào)是3即可
- 補(bǔ)丁版本號(hào)可增 ~1.3.4 保證主版本號(hào)是1,次版本號(hào)是3,補(bǔ)丁版本號(hào)大于等于4
^ 此版本和補(bǔ)丁版本可增 ^1.3.4 保證主版本號(hào)是1,次版本號(hào)可以大于等于3,補(bǔ)丁版本號(hào)可以大于等于4
- 最新版本 * 始終安裝最新版本
三、Yarn
1.npm存在的問(wèn)題:
(1)依賴(lài)目錄嵌套層次深
(2)串行下載,無(wú)法完全利用帶寬資源,多個(gè)相同版本的包被重復(fù)下載
(3)控制臺(tái)輸出大量的信息
(4)存在工程移植問(wèn)題,版本依賴(lài)可以是模糊的,可能會(huì)導(dǎo)致工程移植后,依賴(lài)的確切版本不一致
2.如何解決上述問(wèn)題:
(1)使用扁平的目錄結(jié)構(gòu)
(2)并行下載,使用本地緩存
(3)控制臺(tái)僅輸出關(guān)鍵信息
(4)使用yarn-lock文件記錄確切依賴(lài)
3.優(yōu)化:
增加了某些功能強(qiáng)大的命令
讓既有的命令更加語(yǔ)義化
本地安裝的CLI工具可以使用 yarn 直接啟動(dòng)
將全局安裝的目錄當(dāng)作一個(gè)普通的工程,生成package.json文件,便于全局安裝移植
4.新增了 yarn.lock 文件。
它是 yarn 在安裝依賴(lài)包時(shí),自動(dòng)生成的一個(gè)文件,作用是記錄 yarn 安裝的每個(gè) package 的版本,保證"package.json"依賴(lài)安裝的版本和實(shí)際的版本是一致。后來(lái) npm 也新增了作用相同的 package-lock.json
五、pnpm
1.pnpm全稱(chēng):performant npm ,意味“高性能的npm”
優(yōu)勢(shì):
目前,安裝效率高于npm和yarn的最新版
極其簡(jiǎn)潔的node_modules目錄
避免了開(kāi)發(fā)時(shí)使用間接依賴(lài)的問(wèn)題
能極大的降低磁盤(pán)空間的占用
2.原理
(1)使用緩存來(lái)保存已經(jīng)安裝過(guò)的包,以及使用 pnpm-lock.yaml 來(lái)記錄詳細(xì)的依賴(lài)版本
(2)使用符號(hào)鏈接和硬鏈接(類(lèi)似于快捷方式)的做法來(lái)放置依賴(lài),從而規(guī)避了從緩存中拷貝文件的時(shí)間,使得安裝和卸載的速度更快
(3)由于使用了符號(hào)鏈接和硬鏈接,pnpm可以規(guī)避windows操作系統(tǒng)路徑過(guò)長(zhǎng)的問(wèn)題,因此,它選擇使用樹(shù)形的依賴(lài)結(jié)果,有著幾乎完美的依賴(lài)管理。也因?yàn)槿绱?#xff0c;項(xiàng)目中只能使用直接依賴(lài),而不能使用間接依賴(lài)
3.硬鏈接: 硬連接指通過(guò)索引節(jié)點(diǎn)來(lái)進(jìn)行連接。
軟鏈接:另外一種連接稱(chēng)之為符號(hào)連接(Symbolic Link),也叫軟連接。軟鏈接文件有類(lèi)似于Windows的快捷方式。它實(shí)際上是一個(gè)特殊的文件。在符號(hào)連接中,文件實(shí)際上是一個(gè)文本文件,其中包含的有另一文件的位置信息。
參考:
https://zhuanlan.zhihu.com/p/542738352
https://blog.csdn.net/qq_43750501/article/details/107523394
https://blog.csdn.net/weixin_42575028/article/details/127349060
http://www.xbhp.cn/news/63448.html