成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一文帶你了解npm的原理

npm 是 JavaScript世界的包管理工具,并且是 Node.js平臺的默認(rèn)包管理工具。通過 npm可以安裝、共享、分發(fā)代碼,管理項目依賴關(guān)系。本篇文章帶大家了解一下npm的原理,希望對大家有所幫助!

一文帶你了解npm的原理

npm的原理

npm據(jù)稱成為世界最大的包管理器?原因真的只是用戶友好?

一、npm init

用來初始化一個簡單的package.json文件。package.json文件用來定義一個package的描述文件。

1、npm init的執(zhí)行的默認(rèn)行為

執(zhí)行npm init --yes,全部使用默認(rèn)的值。

2、 自定義npm init行為

npm init命令的原理是:調(diào)用腳本,輸出一個初始化的package.json文件。

獲取用戶輸入使用prompt()方法。

二、依賴包安裝

npm的核心功能:依賴管理。執(zhí)行npm i從package.json中dependencies和devDependencies將依賴包安裝到當(dāng)前目錄的node_modules文件夾中。

2.1、package定義

npm i 就可以安裝一個包。通常package就是我們需要安裝的包名,默認(rèn)配置下npm會從默認(rèn)的源(Registry)中查找該包名的對應(yīng)的包地址,并且下載安裝。 還可以是一個指向有效包名的http url/git url/文件夾路徑。

package的準(zhǔn)確定義,符合以下a)到g)其中一個條件,他就是一個package:

一文帶你了解npm的原理

package的準(zhǔn)確定義

2.2、安裝本地包/遠程git倉庫包

共享依賴包,并非非要把包發(fā)布到npm源上才能使用。

1)、場景1:本地模塊引用

開發(fā)中避免不了模塊之間調(diào)用,開發(fā)中,我們把頻繁調(diào)用的配置模塊放在根目錄,然后如果有很多層級目錄,后來引用

const config = require(''../../../../..config)

這樣的路徑引用不利于代碼重構(gòu)。這時候我們需要考慮把這個模塊分離出來供其他模塊共享。比如config.js可以封裝成一個package放到node_modules目錄下。

不需要手動拷貝或者創(chuàng)建軟連接到node_modules目錄,npm 有自己的解決方案:

方案:

1、新增config文件夾,將config.js移入文件夾,名字修改為index.js,創(chuàng)建package.json定義config包

{      "name": "config",      "main": "index.js",      "version": "0.1.0"  }

2、在項目的package.json新增依賴項,然后執(zhí)行npm i。

{    "dependencies": {      "config":"file: ./config"    }  }

查看 node_modules 目錄我們會發(fā)現(xiàn)多出來一個名為 config,指向上層 config/ 文件夾的軟鏈接。這是因為 npm 識別 file: 協(xié)議的url,得知這個包需要直接從文件系統(tǒng)中獲取,會自動創(chuàng)建軟鏈接到 node_modules 中,完成“安裝”過程。

2)、場景2:私有g(shù)it共享package

團隊內(nèi)會有一些代碼/公用庫需要在團隊內(nèi)不同項目間共享,但可能由于包含了敏感內(nèi)容。

我們可以簡單的將被依賴的包托管到私有的git倉庫中,然后將git url保存到dependencies中。npm會直接調(diào)用系統(tǒng)的git命令從git倉庫拉取包的內(nèi)容到node_modules中。

npm支持的git url格式:

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]

git 路徑后可以使用 # 指定特定的 git branch/commit/tag, 也可以 #semver: 指定特定的 semver range.

比如:

git+ssh://git@github.com:npm/npm.git#v1.0.27  git+ssh://git@github.com:npm/npm#semver:^5.0  git+https://isaacs@github.com/npm/npm.git  git://github.com/npm/npm.git#v1.0.27

3)、場景3:開源package問題修復(fù)

此時我們可以手動進入 node_modules 目錄下修改相應(yīng)的包內(nèi)容,也許修改了一行代碼就修復(fù)了問題。但是這種做法非常不明智!

方案:

fork原作者的git庫,在自己的repo修復(fù)問題,然后將dependencies中的相應(yīng)依賴改為自己修復(fù)后版本的git url就可以解決問題。

三、npm install如何工作

npm i執(zhí)行完畢,node_modules中看到所有的依賴包。開發(fā)人員無關(guān)注node_modules文件夾的結(jié)構(gòu)細節(jié),關(guān)注業(yè)務(wù)代碼中引用依賴包。

理解node_modules結(jié)構(gòu)幫助我們更好理解npm如何工作。npm2到npm5變化和改進。

3.1 npm2

npm2在安裝依賴包,采用的是簡單的遞歸安裝方法。每一個包都有自己的依賴包,每一個包的依賴都安裝在自己的node_modules中,依賴關(guān)系層層遞進,構(gòu)成整個依賴樹,這個依賴樹與文件系統(tǒng)中的文件結(jié)構(gòu)樹一一對應(yīng)。

最方便的依賴樹的方式在根目錄下執(zhí)行npm ls

優(yōu)點:

  • 層級結(jié)構(gòu)明顯,便于傻瓜式管理。

缺點:

  • 復(fù)雜工程,目錄結(jié)構(gòu)可能太深,深層的文件路徑過長觸發(fā)window文件系統(tǒng)中文件路徑不能超過260個字符長。

  • 部分被多個包依賴的包在很多地方重復(fù)安裝,造成大量的冗余。

3.2 npm3

npm3的node_modules目錄改成更加扁平狀層級結(jié)構(gòu)。npm3在安裝的時候遍歷整個依賴樹,計算最合理的文件夾安裝方式,所有被重復(fù)依賴的包都可以去重安裝。

npm來說,同名不同版本的包是兩個獨立的包。

npm3的依賴樹結(jié)構(gòu)不再與文件夾層級一一對應(yīng)。

3.3 npm5

沿用npm3的扁平化依賴包安裝方式。最大的變化時增加package-lock.json文件。

package-lock.json作用:鎖定依賴安裝結(jié)構(gòu),發(fā)現(xiàn)node_modules目錄文件層級結(jié)構(gòu)是與json的結(jié)構(gòu)一一對應(yīng)。

npm5默認(rèn)會在執(zhí)行npm i后生成package-lock.json文件,提交到git/svn代碼庫。

要升級,不要使用 5.0版本。

注意:在 npm 5.0 中,如果已有 package-lock 文件存在,若手動在 package.json 文件新增一條依賴,再執(zhí)行 npm install, 新增的依賴并不會被安裝到 node_modules 中, package-lock.json 也不會做相應(yīng)的更新。

四、依賴包版本管理

介紹依賴包升級管理相關(guān)知識。

4.1 語義化版本semver

npm依賴管理的一個重要特性采用語義化版本(semver)規(guī)范,作為版本管理方案。

語義化版本號必須包含三個數(shù)字,格式:major.minor.patch。意思是:主版本號.小版本號.修改版本號。

我們需要在dependencies中使用semver約定的指定所需依賴包的版本號或者范圍。

常用的規(guī)則如下圖:

一文帶你了解npm的原理

semver語義化版本

1、任意兩條規(guī)則,用空格連接起來,表示“與”邏輯,即為兩個規(guī)則的交集。

如 >=2.3.1 <=2.8.0 可以解讀為: >=2.3.1 且 <=2.8.0

  • 可以匹配 2.3.1, 2.4.5, 2.8.0
  • 但不匹配 1.0.0, 2.3.0, 2.8.1, 3.0.0

2、任意兩條規(guī)則,用||連接起來,表示“或”邏輯,即為兩條規(guī)則的并集。

如 ^2 >=2.3.1 || ^3 >3.2

  • 可以匹配 2.3.1, 2,8.1, 3.3.1
  • 但不匹配 1.0.0, 2.2.0, 3.1.0, 4.0.0

3、更直觀的表示版本號范圍的寫法

  • 或 x 匹配所有主版本
  • 1 或 1.x 匹配 主版本號為 1 的所有版本
  • 1.2 或 1.2.x 匹配 版本號為 1.2 開頭的所有版本

4、在 MAJOR.MINOR.PATCH 后追加 – 后跟點號分隔的標(biāo)簽,作為預(yù)發(fā)布版本標(biāo)簽 通常被視為不穩(wěn)定、不建議生產(chǎn)使用的版本。

  • 1.0.0-alpha
  • 1.0.0-beta.1
  • 1.0.0-rc.3

4.2 依賴版本升級

在安裝完一個依賴包之后有新的版本發(fā)布了,如何使用npm進行版本升級呢?

  • npm i或者npm update,但是不同的npm版本,不同的package.json和package-lock.json文件,安裝和升級表現(xiàn)是不同的。

使用npm3的結(jié)論:

  • 如果本地 node_modules 已安裝,再次執(zhí)行 install 不會更新包版本, 執(zhí)行 update 才會更新; 而如果本地 node_modules 為空時,執(zhí)行 install/update 都會直接安裝更新包。
  • npm update 總是會把包更新到符合 package.json 中指定的 semver 的最新版本號——本例中符合 ^1.8.0 的最新版本為 1.15.0
  • 一旦給定 package.json, 無論后面執(zhí)行 npm install 還是 update, package.json 中的 webpack 版本一直頑固地保持 一開始的 ^1.8.0 巋然不動

使用npm5的結(jié)論:

  • 無論何時執(zhí)行 install, npm 都會優(yōu)先按照 package-lock 中指定的版本來安裝 webpack; 避免了 npm 3 表中情形 b) 的狀況;
  • 無論何時完成安裝/更新, package-lock 文件總會跟著 node_modules 更新 —— (因此可以視 package-lock 文件為 node_modules 的 JSON 表述)
  • 已安裝 node_modules 后若執(zhí)行 npm update,package.json 中的版本號也會隨之更改為 ^1.15.0

4.3 最佳實踐

我常用的node是8.11.x,npm是5.6.0。

  • 使用npm >= 5.1 版本,保持package-lock.json文件默認(rèn)開啟配置。
  • 初始化,npm i 安裝依賴包,默認(rèn)保存^X.Y.Z,項目提交package.json和package-lock.json。
  • 不要手動修改package-lock.json

升級依賴包:

  • 升級小版本,執(zhí)行npm update升級到新的小版本。
  • 升級大版本,執(zhí)行npm install @ 升級到新的大版本。
  • 手動修改package.json中的版本號,然后npm i。
  • 本地驗證升級新版本后沒有問題,提交新的package.json和package-lock.json文件。

降級依賴包:

  • 正確:npm i @驗證沒有問題后,提交package.json和package-lock.json文件。
  • 錯誤:修改package.json中的版本號,執(zhí)行npm i不會生效。因為package-lock.json鎖定了版本。

刪除依賴包:

  • A計劃:npm uninstall 。提交package.json和package-lock.json。
  • B計劃:在package.json中刪除對應(yīng)的包,然后執(zhí)行npm i,提交package.json和package-lock.json。

五、npm的sctipts

5.1 基本使用

npm scripts是npm的一個重要的特性。在package.json中scripts字段定義一個腳本。

比如:

{      "scripts": {          "echo": "echo HELLO WORLD"      }  }

我們可以通過npm run echo 命令執(zhí)行這段腳本,就像shell中執(zhí)行echo HELLO WOLRD,終端是可以看到輸出的。

總結(jié)如下:

  • npm run 命令執(zhí)行時,會把./node_modules/.bin目錄添加到執(zhí)行環(huán)境的PATH變量中。全局的沒有安裝的包,在node_modules中安裝了,通過npm run 可以調(diào)用該命令。
  • 執(zhí)行npm 腳本時要傳入?yún)?shù),需要在命令后加 — 表明,比如 npm run test — –grep="pattern" 可以將–grep="pattern"參數(shù)傳給test命令。
  • npm 還提供了pre和post兩種鉤子的機制,可以定義某個腳本前后的執(zhí)行腳本。
  • 運行時變量:npm run 的腳本執(zhí)行環(huán)境內(nèi),可以通過環(huán)境變量的方式獲取
贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
大香伊蕉在人线国产69| 国产精品成人精品久久久| 粉嫩av一区二区三区| 国产AV无码专区亚洲AV麻豆| 国产伦精品一区二区三区免费| 好爽又高潮了毛片| 两根硕大一起挤进小紧H共妻 | 亚洲A级成人无码网站| 亚洲色噜噜噜噜噜噜国产| 20岁小伙GAYGAYXⅩX| 成人亚洲A片Ⅴ一区二区小说| 国产精品久久久影视青草| 激情无码人妻又粗又大中国人| 另类小说激情婷婷久久| 日本大肚子孕妇交XXX| 无码免费无线观看在线视频| 亚洲精品无码专区在线观看| 综合无码成人AⅤ视频在线观看| 不卡AV一区二区| 国产亚洲欧美日韩精品一区二区 | 亚洲无人区码一码二码三码区别 | 亚洲AV无码一区二区少妇| 一区二区三区AV高清免费波多 | 欧美一区二区三区视频在线观看| 天堂岛最新版在线BT天堂| 亚洲精品无码一区二区AⅤ污美国| 42岁女子20天断崖式衰老| 国产SM残忍打屁股调教视频| 精品人妻一区二区三区曰产乱码| 哦┅┅快┅┅用力啊熟妇| 四虎国产成人永久精品免费| 亚洲欧洲成人A∨在线观看| Chinese老女人老熟妇HD| 国产精品自在拍首页视频8| 乱码视频午夜在线观看| 视频一区二区三区免费| 亚洲熟妇丰满美女XXXXX| А√天堂8资源官网在线BT种子| 国产免费AV片在线观看| 免费久久99精品国产自在现| 天天躁日日躁狠狠躁AV| 中国XXXX真实偷拍| 国产成人亚洲精品青草| 久久夜色精品国产噜噜亚洲AV| 日日噜噜夜夜狠狠久久蜜桃| 亚洲人成色7777在线观看不卡| 波多野结衣乳巨码无在线观看| 极品教师动漫在线观看免费完整版| 欧美日韩在线视频一区二区| 亚洲AV无码专区国产乱码电影 | 欧美日韩一区二区三区人妻 | 国产一区二区女内射| 欧美巨大黑人精品一二三| 亚洲AV无码一区二区二三区| TAP TAP下载官方正版| 精品国产V无码大片在线看| 日本打扑克啪啪超爽网站| 亚洲一区无码中文字幕乱码| 国产97色在线 | 欧洲| 老头老太太GMBGMBGM| 无码熟熟妇丰满人妻啪啪| 97久久国产亚洲精品超碰热| 好疼太大了太粗太长了视频| 日韩大片高清播放器| 一二三四影视在线看片免费| 国产精品无码一区二区三区免费| 欧美激情XXXX| 亚洲熟妇人妻系列| 国产精品免费看久久久8| 欧美人与动牲交免费观看视频| 亚洲国产精品成人无码区| 丰满爆乳BBWBBWBBW| 男同GAY片自慰AV网站| 亚洲成色WWW成人网站| 豆奶视频在线观看免费高清版| 蜜桃AV麻豆AV天美AV| 亚洲VA中文字幕无码毛片| 丰满少妇人妻XXXXX| 女被啪到深处喷水GIF动态视频| 亚洲精品国产美女久久久99| 国产成人涩涩涩视频在线观看| 欧美亚洲精品SUV| 又色又爽又黄的视频APP软件下| 国产一区在线观看二区| 色噜噜久久综合伊人一本| 97久人人做人人妻人人玩精品| 精品日产一卡2卡三卡4卡自拍| 无码人妻视频一区二区三区 | 日本熟妇人妻中出| 2021亚洲无码| 久久无码中文字幕免费影院| 亚洲AV午夜成人片动漫番| 国产成人精品日本亚洲语音| 日本ZLJZLJZLJZLJ喷| 97碰碰碰人妻无码视频| 久久久久亚洲AV无码尤物黑人| 亚洲AⅤ天堂无码专区-百度| 公交车伦流澡到高潮HNP| 人妻少妇精品视频三区二区一区| 18禁强伦姧人妻又大又粗| 久久久久久无码AV成人影院| 亚洲VA久久久噜噜噜久久天堂| 国产精品网站在线观看免费传媒 | 内地CHINA高潮VIDEO| 岳把我用嘴含进满足我视频| 精品人妻少妇嫩草AV无码专区| 无码夜色一区二区三区| 国产AV无码专区亚洲AⅤ| 日韩国产欧美亚洲V片| JIZZJIZZ亚洲日本少妇| 欧美XXXxX高潮喷水| 中文字幕无码家庭乱欲| 老司机精品成人无码AV| 一二三四在线视频观看社区| 久久99精品九九九久久婷婷| 亚洲精品无码一区二区AⅤ污美国| 国偷自产AⅤ一区二区三区| 香蕉久久人人爽人人爽人人片AV| 国产精品99久久99久久久动漫| 熟妇人妻不卡中文字幕| 动性配人ⅩXXXX配| 少妇人妻一级AV片| 国产99久60在线视频 | 传| 熟女亚洲综合精品伊人久久| 丰满护士巨好爽好大乳小说| 少妇人妻AV无码专区| 公么的大龟征服了我BD| 少妇高潮XXXⅩ白浆699| 国产AV导航大全精品| 婷婷五月六月激情综合色中文字幕 | 被村长狂躁俩小时玉婷| 日本工口里番全彩色| 大爷你的太大了我| 四川丰满少妇被弄到高潮| 国产福利一区二区精品秒拍| 无码人妻AⅤ一区二区三区用会员| 国产精品呻吟AV久久高潮| 性偷窥TUBE凸凹视频| 黑料社ZZTT.WIN免费观看| 亚洲区色情区激情区小说色情书| 久久精品国产亚洲AV香蕉| 永久免费AV无码不卡在线观看 | 黑人巨大高潮喷水AV| 亚洲精品自产拍在线观看动漫 | 国产精品无码专区在线观看 | 日韩人妻中文无码一区二区七区| 高H闺蜜老公1V1| 西西人体午夜视频无码| 精品高潮呻吟99AV无码| 一面亲上边一面膜下边的免费| 免费观看大片的APP视频| 99久久久国产精品消防器材| 日本无人区码一码二码三码区别| 国产CHINESE男男GAYGAY网站| 性色AV无码久久一区二区三区| 精品人妻一区二区三区视频| 中国老太太X×××XHD| 人妻丰满熟妇岳AV无码区HD| 国产边做边吃奶AⅤ视频免费| 亚洲AV成人无码精品电影在线| 精品综合久久久久久97| 3分19秒砍人手脚血腥场面| 日韩AⅤ无码AV一区二区三区 | 午夜伦情电午夜伦情电影| 精品国产乱码久久久久久浪潮小说 | 撞击到最深处她抽搐喷水| 日韩精品人妻中文字幕有码| 国产精品一区在线观看你懂的| 亚洲日本中文字幕乱码在线 | 天堂AV无码AV一区二区三区| 狠狠人妻久久久久久综合 | 美女自拍高潮流白浆| 成年女人毛片免费观看中文| 亚洲 欧美 叧类人妖| 乱人伦中文视频在线观看| 成人免费观看的A级毛片| 亚洲AV成人精品五区| 久久五月丁香合缴情网| 被男狂揉吃奶胸高潮视频在线观看| 午夜福利AV无码一区二区| 久久亚洲精品国产亚洲老地址| の乳頭を凸起しています| 午夜无码一区二区三区在线观看 | 人妻少妇偷人精品视频| 国产深夜男男口爆Gay| 中国老太卖婬HD播放| 熟女一区二区蜜桃视频| 久久精品99久久香蕉国产色戒| 爱情岛亚洲AV永久入口首页| 亚洲AⅤ男人的天堂在线观看| 免费国产黄网站在线观看视频| 国产成人精品免费午夜APP| 亚洲一区制服无码中字| 日产精品卡1卡2卡三卡区别| 精品国产AV一区二区三区| もんむす くえすと资源网 | 色欲久久九色一区二区三区| 久久精品成人亚洲另类欧美| 粗大黑人巨精大战欧美成人| 亚洲一区在线观看XXX|