初識npm

1、npm簡介:node

npm全稱爲Node Package Manager,是一個基於Node.js的包管理器,也是整個Node.js社區最流行、支持的第三方模塊最多的包管理器。git

npm的初衷:JavaScript開發人員更容易分享和重用代碼。github

npm的使用場景:算法

  • 容許用戶獲取第三方包並使用。
  • 容許用戶將本身編寫的包或命令行程序進行發佈分享。

npm版本查詢:npm -v npm

npm安裝:json

  一、安裝nodejs緩存

    因爲新版的nodejs已經集成了npm,因此可直接經過輸入npm -v來測試是否成功安裝。安全

  二、使用npm命令來升級npm: npm install npm -g服務器

2、npm的工做原理:app

  1. 包和模塊:
    1. 什麼是包(package)?

       包是描述一個文件或一個目錄。一個包的配置一般由如下構成:

      • 一個文件夾包含一個package.json配置文件。
      • 包含(含有package.json文件的文件夾)的Gzip壓縮文件。
      • 解析gzip的url
      • 爲註冊表添加<name>@<version>的url 信息

       注意的是即便你歷來沒有在註冊中心發佈你的公共包,你可能仍然能夠獲得不少全部這些package, 使用npm的好處:

      • 若是你只是計劃想寫增長一個節點或/。
      • 若是你安裝它也但願在其餘地方分紅一個tarball後進行包裝

       Git url的形式:

       git:/ /github.com/user/project.git # commit-ish
       git + ssh:/ / user@hostname:project.git # commit-ish
       git +http://user@hostname項目/ blah.git # commit-ish
       git +https://user@hostname項目/ blah.git # commit-ish
       能夠撿出commit-ish的一個git任何標籤和master分支、 安全哈希算法。

      2.什麼是模塊(module)?

       模板是經過配置文件中的一個dom節點進行包含一個或多個包。一般通常由包和配置文件以及相關模塊程序構成完成一個或多個業務功能操做。

       一個模塊能夠在node . js 程序中裝滿任何的require()任何。 如下是全部事物加載模塊的例子 :

      • 一個文件夾package.json文件包含一個main字段。
      • 一個文件夾index.js文件。
      • 一個JavaScript文件。

      3.npm的包和模塊的關係:

      通常來講在js程序中使用require加載它們的模塊在節點中進行配置npm包,一個模塊不必定是一個包。

      例如,一些cli包, js程序節點中只包含一個可執行的 命令行界面,不提供main字段。 那麼這些包不是模塊。

      幾乎全部npm包(至少,那些節點計劃)包含許多模塊在他們(由於每一個文件加載require()是一個模塊)。

      幾乎全部的npm包都關聯着多個模塊,由於每一個文件都使用require()加載一個模塊。

      從module加載文件中的上下文node節點。如:var req = require('request')。咱們可能會說,「request模塊賦值給req這個變量」。

      4.npm的生態系統:

      package.json文件定義的是包。

      node_modules文件夾是存儲模塊的地方。便於js查找模塊。

      例如:

      若是建立一個node_modules/foo.js文件,經過var f=require('foo.js')進行加載模塊。由於它沒有package.json文件因此foo.js不是一個包。

      若是沒有建立index.js包或者package.json文件"main"字段,即便是在安裝node_modules,由於它沒有require()因此它不是一個模塊

  2.npm2的依賴分析:

  如今,咱們建立一個應用程序須要兩個模塊 模塊A和C。

  

  複雜的關係:

  須要一個模塊B的版本,在全部其餘的node.js前運行時,咱們在試想下包管理器中的js會作些什麼?

  

  然而事實不是這樣的,而是以下圖所示:

  

  咱們來看下終端所顯示的結構:

  

  咱們使用npm is命令來查看下它們的依賴關係:

  

  咱們使用npm ls --深度=0命令來看下主要依賴關係:

  

  然而,npm這樣作是不夠的。儘管他們的嵌套的位置容許共存的兩個版本相同的模塊,大多數模塊加載器沒法兩個不一樣版本的相同的模塊加載到內存中。幸運的是,這個節點。js模塊加載程序編寫的正是這種狀況,

並能夠很容易地加載模塊的兩個版本,他們不會互相沖突。

  如NPM和Node.js模塊加載器相同部分使得Node.js惟一適合運行時依賴關係管理。

  3.npm3的依賴分析:

  npm2和npm3的不一樣點:

  關鍵的主要區別是:

  • 在目錄結構中的位置再也不預測類型 (主要的,次要的等)的依賴
  • 依賴分析取決於安裝順序將會改變node_modules目錄樹狀結構

  npm2:按照一個嵌套方式進行安裝全部依賴項。

  npm3:試圖減輕樹的深度和冗餘的嵌套。 嘗試經過安裝一些次要的依賴關係在一個平面,須要它做爲主要的相同的目錄中依賴。

  假設:咱們須要一個模塊A依賴模塊B。

  

  如今,讓咱們建立一個應用程序,該應用程序依賴模塊A。

  npm v2這將發生在一個嵌套的方式。

  

  假設咱們想依賴另外一個模塊C . C依賴B另外一個版本。

  

  然而,因爲模塊B v1.0已是頂級dep,咱們不能安裝模塊B v2.0頂級依賴。 npm v3經過違約處理 npm v2行爲和嵌套新的,不一樣的,模塊B版本 依賴的模塊,須要它——在這種狀況下,模塊C。

  

  在終端,這看起來是這樣的:

  

  你列表的依賴關係,還能看到他們的關係npm ls:

  

  若是你想看看你的主要依賴關係,可使用: npm ls -深度= 0

  

  4.npm3的複製和刪除重複數據:

  目前咱們有一個應用程序 這依賴於兩個模塊:

  • 模塊A依賴於模塊Bv1.0
  • 模塊C依賴於模塊Bv2.0

  

  

  如今咱們問本身,若是咱們安裝另外一種依靠模塊B V1.0模塊時會發生什麼?或模塊B V2.0?

  例如:

  假設咱們要依賴另外一個包,模塊D 依賴於模塊B v2.0,就像模塊C.

  

  由於B v1.0已是一個頂級的依賴,做爲一個頂級的依賴,咱們不能安裝版本v2.0 。 所以安裝模塊B v2.0嵌套 依賴的模塊D,即便咱們已經安裝了一個副本,嵌套 在模塊C。

  

  若是須要二次依賴經過2 +模塊,但沒有安裝做爲一個頂級目錄層次結構中的依賴關係,它將被複制和嵌套在主要依賴。

  然而,若是第二個依賴要求2 +模塊,但安裝做爲一個頂級目錄層次結構中的依賴性,它不會被複制,並將由主要依賴共享要求。

  舉個例子,假設咱們如今想依賴模塊E,像模塊A依賴於模塊B v1.0。

  

  由於B v1.0已是一個頂級的依賴,咱們不須要重複的操做。咱們只是安裝模塊E,它與模塊A共享模塊B v1.0。

  

  這樣出如今終端:

  

  如今,若是咱們更新模塊版本,它取決於模塊B v2.0,不是模塊v1.0嗎?

  

  關鍵是要記住,安裝順序很重要。

  即便模塊A是安裝第一個經過咱們的package(v1.0).json(按字母順序),由於它是有序的,使用交互式npm意味着模塊A安裝命令v2.0是最後包安裝。

  所以,npm3作下面的工做當咱們運行npm安裝mod-a@2——保存:

  • 它刪除模塊v1.0
  • 它安裝模塊版本
  • 它葉子模塊Bv1.0由於模塊E v1.0仍然依賴於它
  • 它安裝模塊Bv2.0做爲v2.0下嵌套依賴模塊, 模塊B v1.0已經佔領的頂級目錄層次結構

  

  

  這在終端看起來像這樣:

  tree3

  最後,讓咱們也更新模塊E v2.0,也取決於模塊B v2.0代替模塊B v1.0,就像模塊A更新。

    

  npm3執行如下事情:

  • 它刪除模塊E v1.0
  • 它安裝模塊版本
  • 它刪除模塊B v1.0由於什麼依賴於它
  • 由於沒有模塊B其餘版本,因此它安裝模塊B v2.0的頂級目錄

now we have Bv2.0 everywhere

  這在終端看起來像這樣:

  

  如今,這顯然不是理想。 咱們在幾乎每個模塊B v2.0目錄。 去掉重複,咱們能夠運行: npm dedupe

  這個命令解析全部的包依賴模塊B版本 重定向到頂層模塊B v2.0並刪除全部副本 嵌套的副本。

  

  這在終端看起來像這樣:

  

  5.npm3的不肯定依賴關係:

   例如:

   

  在這個例子中,咱們的應用程序有如下package.json: 

  {
    "name": "example3",                         //名稱
    "version": "1.0.0",                          //版本
    "description": "",                          //描述
    "main": "index.js",                       //主要入口
    "scripts": {                          //腳本
      "test": "echo \"Error: no test specified\" && exit 1"     //測試路徑
    },
    "keywords": [],                        //關鍵字
    "author": "",                          //做者
    "license": "ISC",                       //許可證
    "dependencies": {                      //依賴模塊
       "mod-a": "^1.0.0",
       "mod-c": "^1.0.0",
       "mod-d": "^1.0.0",
       "mod-e": "^1.0.0"
    }
  }
  使用npm install命令查看依賴關係:
  

  假設咱們有一個模塊A須要更新到2.0版本依賴模塊Bv2.0,而不是依賴模塊Bv1.0.

  

  咱們如今使用交互模式的安裝模塊A的新版本:npm install mod-a@2 --save

  如今咱們使用命令行來查看它們的依賴關係:

  

  它們的關係結構爲:

  

  咱們按功能要求的更新模塊版本進行配置新的package.json使用應用程序測試服務器運行npm安裝:  

  {
    "name": "example3",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
          "scripts": {
              "test": "echo \"Error: no test specified\" && exit 1"
          },
          "keywords": [],
          "author": "",
      "license": "ISC",
      "dependencies": {
        "mod-a": "^2.0.0",
        "mod-c": "^1.0.0",
        "mod-d": "^1.0.0",
        "mod-e": "^1.0.0"
     }
  }

  測試服務器的日誌顯示:

  

  咱們看下它們的依賴結構關係:

  

  這棵樹比那棵樹徹底不一樣,它們的內部發生了什麼事?

  記住:安裝順序很重要。

  咱們的安裝順序:

  npm安裝時首先開始着手項目,全部模塊中列出的包。json已經安裝在node_modules文件夾。

  而後模塊版本更新安裝。

  它們的變化:

  由於此前,模塊A v1.0,模塊B v1.0,模塊E v1.0,模塊C v1.0,模塊D v1.0和模塊E v1.0是頂級依賴,

  隨後根據模塊的版本更新,模塊B沒有其餘版本能夠繼續佔據頂級依賴的位置就成爲模塊A新版本的新依賴。

  因爲沒有創建node_modules目錄,咱們經過package.json腳本的配置進行安裝依賴關係運行後這個項目會創建一個新目錄。

  經過package.json的配置更新模塊A v2.0,按照字母的前後順序進行npm的安裝命令執行,

  因此不是最後一次執行。

  而後,

  由於此前已有node_modules目錄,在更新模塊,首先安裝的是模塊A v2.0,其次是模塊B v2.0,模塊B v2.0迭代模塊B v1.0成爲頂級依賴。最後執行模塊E v1.0時因爲模塊B v1.0不存在頂級依賴,但有模塊B v1.0這個模塊因此模塊B v1.0無耐地嵌套在模塊E v1.0下。

  不一樣的依賴關係樹結構不會影響咱們的應用

  即便依賴關係樹的不一樣,咱們都能知足全部依賴項指向對應的被依賴項進行安裝對應的模塊版本,它們都有各自的配置。

  咱們應怎麼作才能保證node_modules目錄是同樣的?

  咱們使用npm安裝命令進行安裝,使用package.json,老是會創建相同的樹。這是由於按照package.json的配置進行按字母順序進行安裝。相同的安裝順序意味着你會獲得相同的樹。

   你能夠在移除node_modules目錄並運行npm package.json進行配置你所須要的互相依賴關係樹。

3、npm相關常識:

  package.json文件配置目錄:

  

3、npm的經常使用命令:

NPM提供了不少命令,例如install和publish,使用npm help可查看全部命令。

  • NPM提供了不少命令,例如installpublish,使用npm help可查看全部命令。

  • 使用npm help <command>可查看某條命令的詳細幫助,例如npm help install

  • package.json所在目錄下使用npm install . -g可先在本地安裝當前命令行程序,可用於發佈前的本地測試。

  • 使用npm update <package>能夠把當前目錄下node_modules子目錄裏邊的對應模塊更新至最新版本。

  • 使用npm update <package> -g能夠把全局安裝的對應命令行程序更新至最新版。

  • 使用npm cache clear能夠清空NPM本地緩存,用於對付使用相同版本號發佈新版本代碼的人。

  • 使用npm unpublish <package>@<version>能夠撤銷發佈本身發佈過的某個版本代碼。

使用淘寶 NPM 鏡像: npm install -g cnpm --registry=https://registry.npm.taobao.org  詳情見:http://npm.taobao.org/。

使用cnpm來安裝模塊 cnpm install [name]

 

——

相關文章
相關標籤/搜索