公司網(wǎng)站建設(shè)后期維護下載微信
代碼共享方案
在我們通過模塊化的方式將代碼劃分成一個個小的結(jié)構(gòu)后,在以后的開發(fā)中我們就可以通過模塊化的方式來封裝自己的代碼,并且封裝成一個工具,這個工具我們可以讓同事通過導入的方式來使用,甚至你可以分享給世界各地的程序員來使用。
這時候,有的人會考慮一個問題,如果我們分享給世界上所有的程序員使用,有哪些方式呢?
方式一:上傳到GitHub上、其他程序員通過GitHub下載我們的代碼手動的引用;
- 缺點是大家必須知道你的代碼GitHub的地址,并且從GitHub上手動下載;
- 需要在自己的項目中手動的引用,并且管理相關(guān)的依賴;
- 不需要使用的時候,需要手動來刪除相關(guān)的依賴;
- 當遇到版本升級或者切換時,需要重復上面的操作;
顯然,上面的方式是有效的,但是這種傳統(tǒng)的方式非常麻煩,并且容易出錯;
方式二:使用一個專業(yè)的工具來管理我們的代碼
- 我們通過工具將代碼發(fā)布到特定的位置;
- 其他程序員直接通過工具來安裝、升級、刪除我們的工具代碼;
顯然,通過第二種方式我們可以更好的管理自己的工具包,其他人也可以更好的使用我們的工具包。
包管理工具npm
這個我們都不陌生,用得最多的也就是這個:
- Node Package Manager,也就是Node包管理器;
- 但是目前已經(jīng)不僅僅是Node包管理器了,在前端項目中我們也在使用它來管理依賴的包;
- 比如vue、vue-router、vuex、express、koa、react、react-dom、axios、babel、webpack等等;
如何下載npm工具呢?
- npm屬于node的一個管理工具,所以我們需要先安裝Node;
- node管理工具:https://nodejs.org/en/
npm管理的包可以在哪里查看、搜索呢?
- https://www.npmjs.org/
- 這是我們安裝相關(guān)的npm包的官網(wǎng);
npm管理的包存放在哪里呢?
- 我們發(fā)布自己的包其實是發(fā)布到registry上面的;
- 當我們安裝一個包時其實是從registry上面下載的包;
npm的配置文件
那么對于一個項目來說,我們?nèi)绾问褂胣pm來管理這么多包呢?
- 事實上,我們每一個項目都會有一個對應的配置文件,無論是前端項目(Vue、React)還是后端項Node;
- 這個配置文件會記錄著你項目的名稱、版本號、項目描述等;
- 也會記錄著你項目所依賴的其他庫的信息和依賴庫的版本號;
這個配置文件就是package.json
那么這個配置文件如何得到呢?
- 方式一:手動從零創(chuàng)建項目,npm init –y
- 方式二:通過腳手架創(chuàng)建項目,腳手架會幫助我們生成package.json,并且里面有相關(guān)的配置
常見的配置文件
- npm init #創(chuàng)建時填寫信息
- npm init -y # 所有信息使用默認的
- Vue CLI4創(chuàng)建的Vue3項目
- create-react-app創(chuàng)建的react17項目
常見的屬性
必須填寫的屬性:name、version
- name是項目的名稱;
- version是當前項目的版本號;
- description是描述信息,很多時候是作為項目的基本描述;
- author是作者相關(guān)信息(發(fā)布時用到);
- license是開源協(xié)議(發(fā)布時用到);
private屬性:
- private屬性記錄當前的項目是否是私有的;
- 當值為true時,npm是不能發(fā)布它的,這是防止私有項目或模塊發(fā)布出去的方式;
main屬性:
- 設(shè)置程序的入口。
- 很多人會有疑惑,webpack不是會自動找到程序的入口嗎?
- 這個入口和webpack打包的入口并不沖突;
- 它是在你發(fā)布一個模塊的時候會用到的;
- 比如我們使用axios模塊 const axios = require(‘a(chǎn)xios’);
- 實際上是找到對應的main屬性查找文件的;
scripts屬性
- scripts屬性用于配置一些腳本命令,以鍵值對的形式存在;
- 配置后我們可以通過 npm run 命令的key來執(zhí)行這個命令;
- npm start和npm run start的區(qū)別是什么?
- 它們是等價的;
- 對于常用的 start、 test、stop、restart可以省略掉run直接通過 npm start等方式運行;
dependencies屬性
- dependencies屬性是指定無論開發(fā)環(huán)境還是生成環(huán)境都需要依賴的包;
- 通常是我們項目實際開發(fā)用到的一些庫模塊vue、vuex、vue-router、react、react-dom、axios等等;
- 與之對應的是devDependencies;
devDependencies屬性
- 一些包在生成環(huán)境是不需要的,比如webpack、babel等;
- 這個時候我們會通過 npm install webpack --save-dev,將它安裝到devDependencies屬性中;
peerDependencies屬性
- 還有一種項目依賴關(guān)系是對等依賴,也就是你依賴的一個包,它必須是以另外一個宿主包為前提的;
- 比如element-plus是依賴于vue3的,ant design是依賴于react、react-dom;
engines屬性
- engines屬性用于指定Node和NPM的版本號;
- 在安裝的過程中,會先檢查對應的引擎版本,如果不符合就會報錯;
- 事實上也可以指定所在的操作系統(tǒng) “os” : [ “darwin”, “l(fā)inux” ],只是很少用到;
browserslist屬性
- 用于配置打包后的JavaScript瀏覽器的兼容情況,參考;
- 否則我們需要手動的添加polyfills來讓支持某些語法;
- 也就是說它是為webpack等打包工具服務的一個屬性;
依賴的版本管理
我們會發(fā)現(xiàn)安裝的依賴版本出現(xiàn):^2.0.3或~2.0.3,這是什么意思呢?
npm的包通常需要遵從semver版本規(guī)范:
- semver:https://semver.org/lang/zh-CN/
- npm semver:https://docs.npmjs.com/misc/semver
semver版本規(guī)范是X.Y.Z:
- X主版本號(major):當你做了不兼容的 API 修改(可能不兼容之前的版本);
- Y次版本號(minor):當你做了向下兼容的功能性新增(新功能增加,但是兼容之前的版本);
- Z修訂號(patch):當你做了向下兼容的問題修正(沒有新功能,修復了之前版本的bug);
我們這里解釋一下 ^和~的區(qū)別:
- ^x.y.z:表示x是保持不變的,y和z永遠安裝最新的版本;
- ~x.y.z:表示x和y保持不變的,z永遠安裝最新的版本;
npm install 命令
安裝npm包分兩種情況:
- 全局安裝(global install): npm install webpack -g;
- 項目(局部)安裝(local install): npm install webpack
全局安裝
- 全局安裝是直接將某個包安裝到全局
- 比如yarn的全局安裝
npm install webpack -g
但是很多人對全局安裝有一些誤會:
- 通常使用npm全局安裝的包都是一些工具包:yarn、webpack等;
- 并不是類似于 axios、express、koa等庫文件;
- 所以全局安裝了之后并不能讓我們在所有的項目中使用 axios等庫;
項目安裝
項目安裝會在當前目錄下生產(chǎn)一個 node_modules 文件夾,我們之前講解require查找順序時有講解過這個包在什么情況下被查找;
局部安裝分為開發(fā)時依賴和生產(chǎn)時依賴:
# 安裝開發(fā)和生產(chǎn)依賴
npm install axios
npm i axios
# 開發(fā)依賴
npm install webpack --save-dev
npm install webpack -D
npm i webpack –D # 根據(jù)package.json中的依賴包
npm install
npm install 原理
大家之前應該已經(jīng)會了 npm install ,但是你是否思考過它的內(nèi)部原理呢?
執(zhí)行 npm install它背后幫助我們完成了什么操作?
我們會發(fā)現(xiàn)還有一個成為package-lock.json的文件,它的作用是什么?
從npm5開始,npm支持緩存策略(來自yarn的壓力),緩存有什么作用呢?
這是一幅畫出的根據(jù) npm install 的原理圖:
npm install 原理圖解析
npm install會檢測是有package-lock.json文件:
沒有l(wèi)ock文件
分析依賴關(guān)系,這是因為我們可能包會依賴其他的包,并且多個包之間會產(chǎn)生相同依賴的情況;
從registry倉庫中下載壓縮包(如果我們設(shè)置了鏡像,那么會從鏡像服務器下載壓縮包);
獲取到壓縮包后會對壓縮包進行緩存(從npm5開始有的);
將壓縮包解壓到項目的node_modules文件夾中(前面我們講過,require的查找順序會在該包下面查找)
有l(wèi)ock文件
檢測lock中包的版本是否和package.json中一致(會按照semver版本規(guī)范檢測);
不一致,那么會重新構(gòu)建依賴關(guān)系,直接會走頂層的流程;
一致的情況下,會去優(yōu)先查找緩存
沒有找到,會從registry倉庫下載,直接走頂層流程;
查找到,會獲取緩存中的壓縮文件,并且將壓縮文件解壓到node_modules文件夾中;
package-lock.json
package-lock.json文件解析:
- name:項目的名稱;
- version:項目的版本;
- lockfileVersion:lock文件的版本;
- requires:使用requires來跟蹤模塊的依賴關(guān)系;
- dependencies:項目的依賴
- 當前項目依賴axios,但是axios依賴follow-redireacts;
- axios中的屬性如下:
- version表示實際安裝的axios的版本;
- resolved用來記錄下載的地址,registry倉庫中的位置;
- requires記錄當前模塊的依賴;
- integrity用來從緩存中獲取索引,再通過索引去獲取壓縮包文件;
yarn工具
另一個node包管理工具yarn:
- yarn是由Facebook、Google、Exponent 和 Tilde 聯(lián)合推出了一個新的 JS 包管理工具;
- yarn 是為了彌補 npm 的一些缺陷而出現(xiàn)的;
- 早期的npm存在很多的缺陷,比如安裝依賴速度很慢、版本依賴混亂等等一系列的問題;
- 雖然從npm5版本開始,進行了很多的升級和改進,但是依然很多人喜歡使用yarn;
cnpm工具
由于一些特殊的原因,某些情況下我們沒辦法很好的從 https://registry.npmjs.org下載下來一些需要的包。
查看npm鏡像:npm config get registry
我們可以直接設(shè)置npm的鏡像:npm config set registry
但是對于大多數(shù)人來說(比如我),并不希望將npm鏡像修改了:
- 第一,不太希望隨意修改npm原本從官方下來包的渠道;
- 第二,擔心某天淘寶的鏡像掛了或者不維護了,又要改來改去;
這個時候,我們可以使用cnpm,并且將cnpm設(shè)置為淘寶的鏡像:
- npm install -g cnpm --registry=https://registry.npm.taobao.org
- cnpm config get registry # https://r.npm.taobao.org/
npx工具
npx是npm5.2之后自帶的一個命令。
npx的作用非常多,但是比較常見的是使用它來調(diào)用項目中的某個模塊的指令。
我們以webpack為例:
全局安裝的是webpack5.1.3
項目安裝的是webpack3.6.0
如果我在終端執(zhí)行 webpack --version使用的是哪一個命令呢?
顯示結(jié)果會是 webpack 5.1.3,事實上使用的是全局的,為什么呢?
原因非常簡單,在當前目錄下找不到webpack時,就會去全局找,并且執(zhí)行命令;
如何解決這個問題呢?
那么如何使用項目(局部)的webpack,常見的是一下幾種方式:
- 方式一:明確查找到node_module下面的webpack—./node_modules/.bin/webpack --version
- 方式二:在 scripts定義腳本,來執(zhí)行webpack; “scripts”: {“webpack”: “webpack --version”}
- 方式三:使用npx---->>>npx webpack --version
npm發(fā)布自己的包
注冊npm賬號:
- https://www.npmjs.com/
- 選擇sign up
在命令行登錄:npm login
修改package.json
發(fā)布到npm registry上
更新倉庫:
- 1.修改版本號(最好符合semver規(guī)范)
- 2.重新發(fā)布