久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

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

一文帶你了解npm的原理

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

一文帶你了解npm的原理

npm的原理

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

一、npm init

用來(lái)初始化一個(gè)簡(jiǎn)單的package.json文件。package.json文件用來(lái)定義一個(gè)package的描述文件。

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

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

2、 自定義npm init行為

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

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

二、依賴包安裝

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

2.1、package定義

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

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

一文帶你了解npm的原理

package的準(zhǔn)確定義

2.2、安裝本地包/遠(yuǎn)程git倉(cāng)庫(kù)包

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

1)、場(chǎng)景1:本地模塊引用

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

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

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

不需要手動(dòng)拷貝或者創(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、在項(xiàng)目的package.json新增依賴項(xiàng),然后執(zhí)行npm i。

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

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

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

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

我們可以簡(jiǎn)單的將被依賴的包托管到私有的git倉(cāng)庫(kù)中,然后將git url保存到dependencies中。npm會(huì)直接調(diào)用系統(tǒng)的git命令從git倉(cāng)庫(kù)拉取包的內(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)、場(chǎng)景3:開(kāi)源package問(wèn)題修復(fù)

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

方案:

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

三、npm install如何工作

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

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

3.1 npm2

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

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

優(yōu)點(diǎn):

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

缺點(diǎn):

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

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

3.2 npm3

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

npm來(lái)說(shuō),同名不同版本的包是兩個(gè)獨(dú)立的包。

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

3.3 npm5

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

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

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

要升級(jí),不要使用 5.0版本。

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

四、依賴包版本管理

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

4.1 語(yǔ)義化版本semver

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

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

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

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

一文帶你了解npm的原理

semver語(yǔ)義化版本

1、任意兩條規(guī)則,用空格連接起來(lái),表示“與”邏輯,即為兩個(gè)規(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ī)則,用||連接起來(lái),表示“或”邏輯,即為兩條規(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、更直觀的表示版本號(hào)范圍的寫法

  • 或 x 匹配所有主版本
  • 1 或 1.x 匹配 主版本號(hào)為 1 的所有版本
  • 1.2 或 1.2.x 匹配 版本號(hào)為 1.2 開(kāi)頭的所有版本

4、在 MAJOR.MINOR.PATCH 后追加 – 后跟點(diǎn)號(hào)分隔的標(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 依賴版本升級(jí)

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

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

使用npm3的結(jié)論:

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

使用npm5的結(jié)論:

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

4.3 最佳實(shí)踐

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

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

升級(jí)依賴包:

  • 升級(jí)小版本,執(zhí)行npm update升級(jí)到新的小版本。
  • 升級(jí)大版本,執(zhí)行npm install @ 升級(jí)到新的大版本。
  • 手動(dòng)修改package.json中的版本號(hào),然后npm i。
  • 本地驗(yàn)證升級(jí)新版本后沒(méi)有問(wèn)題,提交新的package.json和package-lock.json文件。

降級(jí)依賴包:

  • 正確:npm i @驗(yàn)證沒(méi)有問(wèn)題后,提交package.json和package-lock.json文件。
  • 錯(cuò)誤:修改package.json中的版本號(hào),執(zhí)行npm i不會(huì)生效。因?yàn)閜ackage-lock.json鎖定了版本。

刪除依賴包:

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

五、npm的sctipts

5.1 基本使用

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

比如:

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

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

總結(jié)如下:

  • npm run 命令執(zhí)行時(shí),會(huì)把./node_modules/.bin目錄添加到執(zhí)行環(huán)境的PATH變量中。全局的沒(méi)有安裝的包,在node_modules中安裝了,通過(guò)npm run 可以調(diào)用該命令。
  • 執(zhí)行npm 腳本時(shí)要傳入?yún)?shù),需要在命令后加 — 表明,比如 npm run test — –grep="pattern" 可以將–grep="pattern"參數(shù)傳給test命令。
  • npm 還提供了pre和post兩種鉤子的機(jī)制,可以定義某個(gè)腳本前后的執(zhí)行腳本。
  • 運(yùn)行時(shí)變量:npm run 的腳本執(zhí)行環(huán)境內(nèi),可以通過(guò)環(huán)境變量的方式獲取
贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
久久男人天堂| 国产综合色区在线观看| 影院欧美亚洲| 亚洲综合二区| 日本在线成人| 国产精品欧美三级在线观看| 狠狠久久伊人| 欧美亚洲在线日韩| 中文字幕一区二区三区日韩精品 | 黑丝一区二区三区| 五月婷婷亚洲| 91精品丝袜国产高跟在线| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 欧美日韩亚洲在线观看| 99精品99| 亚洲1区在线| 精品国产一级| 国产手机视频一区二区| 国产日韩欧美一区在线| 欧美日韩国产v| 日韩影院在线观看| 六月丁香综合在线视频| 久久在线免费| 欧美亚洲国产日韩| 99久久婷婷| 国产亚洲高清在线观看| 欧美不卡在线| 国产麻豆精品| 午夜久久一区| 精品视频一区二区三区四区五区| 欧美中文字幕一区二区| 国产亚洲精品精品国产亚洲综合| 蜜臀久久精品| 国产色99精品9i| 樱桃成人精品视频在线播放| 国产精品亚洲综合久久| 伊人久久婷婷| 国产资源在线观看入口av| 深夜日韩欧美| 久久中文字幕av| 国产精品**亚洲精品| 精品一区毛片| 国产高清亚洲| 中文字幕一区二区三区日韩精品 | 欧美不卡在线| 国产毛片精品| 欧美资源在线| 日韩精品一卡| 国产一区二区精品久| 日韩欧美中文字幕电影| 图片区亚洲欧美小说区| 国产精品二区不卡| 欧美一区影院| 久久国产88| 亚洲v在线看| 红杏一区二区三区| 欧美伊人影院| 日韩综合小视频| 久久视频精品| 成人三级高清视频在线看| 国产精品一线天粉嫩av| 一区二区精彩视频| 夜夜嗨网站十八久久| 久久在线免费| 日韩不卡在线| 国产资源在线观看入口av| 国产精品欧美大片| 88久久精品| 亚洲美女91| 免费视频一区二区| 亚洲一区欧美二区| 婷婷激情图片久久| 香蕉人人精品| 性欧美videohd高精| 欧美羞羞视频| 成人午夜精品| 欧美日韩免费看片| 日韩欧美二区| 成人羞羞视频在线看网址| 色婷婷亚洲mv天堂mv在影片| 国产精品igao视频网网址不卡日韩| 日韩福利视频导航| 日韩av不卡在线观看| 午夜久久av| 欧美一区二区三区久久精品| 久久国内精品自在自线400部| 日本vs亚洲vs韩国一区三区二区| 黄色亚洲免费| 91精品99| 蜜臀精品久久久久久蜜臀| 日韩一区欧美二区| 综合在线一区| 欧美在线91| 久久午夜影院| 精品国产91| 亚洲va中文在线播放免费| 久久精品av| 亚洲自啪免费| 偷拍亚洲精品| 国产日韩一区二区三区在线播放| 国产探花在线精品一区二区| 国产精品一区二区99| 久久的色偷偷| 精品国产精品久久一区免费式| 不卡专区在线| 日韩午夜电影| 老鸭窝亚洲一区二区三区| 日韩亚洲精品在线观看| 国产精品自在| 群体交乱之放荡娇妻一区二区| 国内激情久久| 蜜臀av一区二区在线免费观看| 日韩福利视频导航| 里番精品3d一二三区| 午夜精品成人av| 国产农村妇女精品一二区| 日韩有吗在线观看| 久久97视频| 久久一级电影| 日韩高清在线观看一区二区| 精品91福利视频| 激情婷婷综合| 欧美亚洲一区二区三区| 国产美女高潮在线| 日韩专区一卡二卡| 国产精品日本一区二区三区在线 | 另类激情亚洲| 国产精品红桃| 久久久777| 亚洲精品女人| 国产日韩电影| 蜜桃一区二区三区在线| 免费一级欧美片在线观看网站 | 蜜臀av国产精品久久久久| 欧美日本不卡| 日韩欧美在线中字| 中文字幕一区二区精品区| 另类综合日韩欧美亚洲| 在线一区免费观看| 久久亚洲黄色| 尤物在线精品| 精品一级视频| 日韩一区欧美二区| 亚洲美女久久精品| 日韩黄色免费网站| 99久久99久久精品国产片果冰| 日韩一区二区三区在线看| 欧美sm一区| 国产精品主播| 午夜在线视频一区二区区别| 久久精品伊人| 亚洲欧洲日韩精品在线| 日韩国产在线| 国产情侣一区| 六月婷婷一区| 高清一区二区| 日韩一二三区在线观看| 久久精品青草| 老司机精品视频网| 日本不卡视频在线观看| 亚洲黄色影院| 日本精品影院| 精品国产a一区二区三区v免费| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲天堂免费电影| 精品一区二区三区中文字幕 | 久久精品色播| 亚洲精品在线二区| 欧美va亚洲va日韩∨a综合色| 麻豆国产精品| 欧美亚洲网站| 水蜜桃久久夜色精品一区的特点 | 国产日韩欧美三级| 免费看的黄色欧美网站 | 韩国精品主播一区二区在线观看| 国产亚洲人成a在线v网站| 久久国产精品毛片| 不卡一区2区| 欧美久久天堂| 成人在线视频免费| 国产精品午夜一区二区三区| 蜜臀国产一区二区三区在线播放| 99久久激情| 欧洲一级精品| 日韩啪啪电影网| 国产粉嫩在线观看| 久久久亚洲欧洲日产| 国产乱人伦丫前精品视频 | 国产精品99一区二区| 精品五月天堂| 国产极品嫩模在线观看91精品| 日本成人中文字幕| 日韩三级精品| 日韩精品91亚洲二区在线观看| 每日更新成人在线视频| 国产亚洲综合精品| 欧美日韩激情在线一区二区三区| 久久久久国产精品一区三寸| 日韩精品欧美| 蜜桃tv一区二区三区|