npm包 安裝原理 及 常見報錯(全局安裝 和 本地安裝有區別)


一、npm包全局安裝:https://blog.csdn.net/wu_xianqiang/article/details/89667543

  需要注意的是,全局模式並不是將一個模塊包安裝為一個全局包的意思,它並不意味着可以從任何地方通過 require() 來引用到它

  事實上,全局的包 在項目中根本 不能引入使用。

  【假設:如果可以使用,在項目的package.json文件中根本沒有這個包,代碼提交后。換個環境下載下來后,全局包不存在就報錯了】

  1、全局模式這個稱謂其實並不精確,存在諸多誤導。實際上, -g 是將一個包安裝為 全局可用的可執行命令。它根據包描述文件中的 bin 字段配置,

     將實際腳本鏈接【win系統的連接,應該是通過.cmd文件實現的】到與Node可執行文件相同的路徑下【即.cmd文件放在node程序同一目錄下】:

"bin": {
"express": "./bin/express"
},

二、npm包 本地 安裝:就是在項目下的 node_module 安裝相應的包。項目中可以直接調用。具體的流程看下面的 介紹。

  1、npm install 包名:下載指定的npm包。

     a、從指定的源上下載這個 包,命令行上指定源,這種方式只是臨時用 從 這個源上下載。https://www.cnblogs.com/ivan0626/p/6668336.html    如下:

    npm install node-sass --registry=http://registry.npm.taobao.org

  2、npm install :下載package.json 中所有的包。

三、npm install 安裝過程分析:https://www.cnblogs.com/everlose/p/12505245.html  或 https://blog.csdn.net/qiwoo_weekly/article/details/103839779(有流程圖,文檔詳細)

  下面寫下 關鍵 流程步驟,細節的先不管

  1、首先檢查 .npmrc 文件。(這個文件就是npm的配置文件)

    優先級為:項目級的 .npmrc 文件 > 用戶級的 .npmrc 文件> 全局級的 .npmrc 文件 > npm 內置的 .npmrc 文件

    說明:檢測 .npmrc配置文件的目的是,應該是 確定從哪里去下載 相應的包。【個人分析的,沒有查到文檔有這個說明。】

  2、檢查項目中有無 lock 文件。

    若無 lock 文件:從遠程獲取 包信息,構建依賴樹。 看 文檔 https://www.cnblogs.com/everlose/p/12505245.html

    若有 lock 文件:和 package.json 不沖突,本身就是一個依賴樹。可以跳過 構建依賴樹的過程,到下一步。

  3、檢測緩存中是否有包:

    a、緩存中有,直接把包解壓 到 當前項目的node_modules目錄。

    b、無緩存:從 npm 遠程 倉庫下載安裝 包

  3、下載安裝 包:https://blog.csdn.net/Alive_tree/article/details/101014999

    a、下載壓縮包,放在~/.npm目錄。【這里下載應該會根據】

    b、將壓縮包放到緩存中,並 解壓壓縮包到當前項目的node_modules目錄。

    注意,一個模塊安裝后,本地其實保存了兩份,一份是~/.npm下的壓縮包,另一份是node_modules目錄下解壓后的代碼。在npm install運行的時候,只會檢查node_modules中的模塊,而不會檢查/.npm.也就是說,如果在/.npm中有壓縮包但是node_modules中沒有模塊,npm install會從遠程倉庫再下載一次壓縮包。

四、.npmrc 配置文件:

  1、.npmrc 文件的作用:https://www.jianshu.com/p/5a1bc7123f31

  2、npm安裝私有倉庫npm包:https://blog.csdn.net/huzhenv5/article/details/107999532(兩種方案) 或 https://segmentfault.com/q/1010000014649247

     說明:實現的功能是 npm install 時,大部分包都是從外網下載,公司內部 的包從內網下載

  3、如果某個包 安裝,只是臨時的配置。可以直接在npm 命令上,通過參數設置,而不需要設置 .npmrc文件。如,源的設置、信息顯示的等級

五、包的組織【包的scope】:https://www.nps.ink/443589.html(為指定組織下的包 配置數據源 .npmrc配置) 或 https://blog.csdn.net/u013727805/article/details/80849329

六、package.json 自定義 包的 下載地址:https://www.cnblogs.com/tzyy/p/5193811.html(package.json屬性詳解)

  1、package.json 中 包 支持自定義 的下載路徑有很多。如:urls、git urls【ssh 或 http】、github、Local Paths【本地路徑也是可以的】。

    • urls:在版本范圍的地方可以寫一個url指向一個壓縮包。注意是壓縮包,而不是遠程npm源的包信息。包信息里面有 對應的 壓縮包地址【一般都是tar包】。
    • git urls:也可以指明 對應的 分支。
    • 其他的看文檔。

  注意:npm倉庫源上,每個包都有對應的包信息 文件(也是是一個json文件)。通過 npm info 也可以看到 包的信息,如:npm info axios。

       在沒有 package-lock.json 時,npm install 時,構建模塊依賴樹。就要通過包信息來實現。

七、package-lock.json 講解:為什么 每次 npm install 時,package-lock.json文件就會改變。

  1、package.json 中 包 的信息是可以手動修改的,比如版本范圍、包的地址等。所以npm install 時,package-lock.json 會 package.json做個比較看是否會沖突。

     在不沖突時,直接使用 package-lock.json 下載定義的包。而 不需要 再去 構建 依賴樹。

  2、package-lock.json 本身的架構就是 一直 依賴樹的 結構。所以可以直接下載對應的包。

八、 npm命令 調整日志等級:https://www.cnblogs.com/k4nz/p/14238164.html 或 https://blog.csdn.net/john987321456/article/details/112183317 或

     https://blog.csdn.net/weixin_40599109/article/details/108005531(里面有說明等級參數的  幾個 快捷方式,如 --verbose)

   如:npm install 安裝時,顯示更多的信息:https://segmentfault.com/q/1010000002726783

npm install --verbose    #debug 級別的,顯示的信息太多。這個--verbose 是參數的快捷方式一般日志等級的參數都是 --loglevel http 這種寫法的
npm i axios --save --loglevel http     #  --loglevel參數,設置當前命令 日志 輸出的等級。

     上面兩個都是在當前命令上設置 這個日志 等級【日志,一般都是當前命令 看下 日志,不會全局去設置】,也可以在全局上設置 日志等級。

npm config set silent true

九、npm 緩存:https://blog.csdn.net/liuyan19891230/article/details/103856130(看緩存那一塊)

  1、清除緩存 好像 不讓用,試過幾次都不成功。但是可以通過 設置 優先使用網絡數據

  2、使用網絡數據:添加參數  --prefer-online


npm 下載包常見的 問題 及 解決

一、node-sass 下載安裝 失敗:node-sass 國內下載報錯的 概率是相當高。基本新環境的電腦,國內100%會出現這個問題。

  參考:https://www.cnblogs.com/Qooo/p/14021354.html(有說明原因)或 https://blog.csdn.net/weixin_44653329/article/details/103827492

  1、node-sass 安裝步驟 分析:

  1. 校驗本地node_modules中是否已安裝node-sass,版本是否一致;
  2. 如未安裝或版本不符,從npm源安裝node-sass本體;
  3. 檢測全局緩存和本地中是否有binding.node,如有即跳過安裝;
  4. 沒有binding.node則從github下載該二進制文件並將其緩存到全局;
  5. 假如binding.node下載失敗,則嘗試本地編譯出該文件;
  6. 將版本信息寫到package-lock.json;

  由此看到,實際上node-sass依賴了一個二進制文件binding.node,從npm源安裝完本體后還會從github下載binding.node。

  2、因此 安裝 失敗原因有以下幾種:

     原因一:npm源速度慢:國外npm源速度慢,可以使用 淘寶鏡像源。改變了npm源,node-sass 包的 下載 快了。但是 binding.node 包 默認是從github下載的,不是

             從npm源上下載的。所以 只是 改變 npm 的源,node-sass包 還是會 出現 安裝失敗的可能。

       原因二:binding.node源無法訪問或速度慢:node-sass除了npm部分的代碼,還會下載二進制文件binding.node,默認源是github,

                          國內訪問較慢,特殊時期甚至無法訪問。我們也可以將其改成國內源。

        解決辦法:把 binding.node 源設置 國內的淘寶鏡像的源。  https://blog.csdn.net/qq_42514643/article/details/107872136

npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/  #安裝時 使用,臨時使用一次

        或【推薦這種方式設置

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/    #npm上全局配置,也可以手動寫到.npmrc文件中。

        或 【不推薦這種,電腦重啟后,設置的環境變量沒有了。不知道是不是告訴電腦沒有管理員權限的問題導致的】

set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ #親測有效,設置環境變量。說明 binding.node的源地址,可以從環境變量上取值。

      注意:國內 基本都是這個原因 導致的 安裝 失敗。 

  3、類似問題的npm包 還有:chromedriver,phantomjs,electron等。    https://blog.csdn.net/weixin_44653329/article/details/103827492

     原因三:由於nodejs版本高導致node-sass安裝不了:解決辦法參考文檔

       原因四:緩存中binding.node版本不一致:   參考文檔

    原因五:安裝失敗后重新安裝:安裝失敗后重新安裝,有可能無權限刪除已安裝內容,此時npm uninstall node-sass或手動刪掉原目錄后再安裝即可。

       原因六:提示沒有安裝python、build失敗:假如拉取binding.node失敗,node-sass會嘗試在本地編譯binding.node,過程就需要python。

            1、node-sass 拉取 binding.node 失敗。就會 嘗試在本地編譯 binding.node。

         本地編譯 binding.node 就需要 python 環境。

 

  1. 下載壓縮包,放在~/.npm目錄
  2. 解壓壓縮包到當前項目的node_modules目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM