npm包管理器那些事


npm包管理器那些事!

今天和朋友針對npm包全局安裝和本地項目安裝這個梗展開的激烈的討論,故此做一個總結!

什么是包管理器?

我最早接觸這個概念的時候是在linux上(redhat小紅帽),記得當時要編譯安裝一個apache,安裝的過程坎坷到了極點,不是缺少這個包就是這個包依賴那個包,更有甚是你明明所有的包都有,唯獨安裝順序顛倒了也會報錯,所以當時接觸了yum包管理器(神器啊)一條命令yum install apache 完活。(后續有時間詳細介紹)

從此時我對linux產生了濃厚的興趣,后來慢慢接觸了ubuntu不管是從界面還是操作上比redhat上升了不是一個台階啊(個人見解),故此我接觸了第二個包管理器 apt-get(后續有時間詳細介紹)

自從開始做前端開發之后學習node接觸了node的包管理器npm,淘寶的cnpm以及FaceBook開發的yarn

說了這么多它們能干什么有什么用呢它們有什么區別呢?

所有的包管理器都有一個共同的目標,安裝、管理、解決你的安裝包依賴

它們的特點

yum和apt-get這里不做介紹,主要針對npm、cnpm、yarn

yarn

yarn是FaceBook開發的包管理器-- 解決npm歷史遺留的痛點
特點

  • 極速,Yarn 會緩存它下載的每個包,所以不需要重復下載
  • 安全,Yarn 在每個安裝包的代碼執行前使用校驗碼驗證包的完整性。
    具體的使用請移駕Yarn官網手冊

npm

npm全稱Node Package Manager,他是node包管理和分發工具
由於npm的軟件源地址在國外,所以會出現速度慢很多包安裝不上時候

解決方案一

//通過config命令:先運行以下命令,再安裝node包即可
npm config set registry http://registry.cnpmjs.org
npm install webpack

通過上面的命令實際的意識是告訴npm你下載包的時候給我從這個地址下載

解決方案二 cnpm

cnpm只不過是npm在國內的鏡像

//cnpm方式安裝:先安裝cnpm,再利用cnpm安裝,例如webpack等
npm install -g cnpm
cnpm install -g webpack

npm和cnpm的區別

npm install 本地安裝與全局安裝的區別

npm的包安裝分為本地安裝(local)、全局安裝(global)兩種,比如:

//安裝在本地
npm install webpack 
//安裝在本地並添加進package.json版本依賴中
npm install webpack --save-dev
//全局安裝
npm install -g webpack
  • 本地安裝

    • 將安裝包放在./node_modules/
    • 可以通過require()來引入本地安裝的包

    例如:

    npm install karma --save-dev
    

    安裝成功之后會在你當前目錄中的node_modules/karma
    我們使用的時候直接require('karma')就可以使用
    此時全局沒有安裝karma那么命令行怎么辦?

    //搞定
    node_modules/karma/bin/karma init
    
  • 全局安裝

    • 將安裝包放在/usr/local下
    • 可以直接在命令行中直接使用
      例如:
    //安裝全局的karma
    npm install -g karma
    //全局安裝之后記得在本地安裝下並添加進版本依賴中
    npm install katma --save-dev
    //全局安裝完成之后就可以在命令行中直接執行
    karma init
    

ok到這里問題都出來了

全局安裝報錯

如果您是linux或者Mac Os 系統並且非root用戶會出現如下報錯


這是因為全局安裝的模塊是安裝在了/usr/local/下,您當前的用戶沒有對/usr/local目錄的寫入權限導致的,解決辦法:

//意思就是要用管理員的身份去執行
//super user do npm install -g karma
sudo npm install -g karma
//此時輸入您的登陸密碼就可以了

使用npm腳本

首先先說一下何為全局?又何為本地安裝?
拋開package.json的版本依賴先不說,這兩種安裝方式只不過是安裝的位置不同罷了!咱們翻譯下全局安裝和本地安裝這兩條命令

//上面說了全局安裝的是/usr/local/其實全局安裝只不過是給你添加了一個環境變而已
//karma="/usr/loacl/bin/node_modules/karma/bin/karma"

karma init --> /usr/loacl/bin/node_modules/karma/bin/karma init

//翻譯下本地安裝,就是安裝在你的當前項目中的node_modules
./node_modules/karma/bin/karma init

什么是npm腳本?
npm 允許在package.json文件里面,使用scripts字段定義腳本命令。

"scripts": {
    "start": "node server.js",
	"karma":"karma start"
}

執行的時候npm run karma
這些定義在package.json里面的腳本,就稱為 npm 腳本。
npm run在執行的時候會將當前目錄的node_modules/.bin子目錄加入PATH變量,執行結束后,再將PATH變量恢復原樣。
所以咱們沒有必要寫成下面這樣

"scripts": {
	"karma":"node_modules/karma/bin/karma start"
}

npm腳本的鈎子

npm 腳本有pre和post兩個鈎子,比如:

"scripts": {
    "pretest":"karma start",
	"test":"karma start",
	"posttest":"opener http://localhost:9090"
}

當執行npm run test的時候它們會一次執行

npm run pretest && npm run test && posttest

如何利用npm腳本去優雅的裝逼

咱們可以利用npm腳本鈎子的特性可以這么玩

{
  "name": "karmademo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "karma start",//提供一個單獨的單元測試腳本
    "prestart": "npm install && karma start",//start開始前先下載所有的依賴包並且跑一邊單元測試
    "start": "pm2 serve ",//用pm2去啟動一個簡單的服務器
    "poststart": "opener http://localhost:8080",//用opener打開瀏覽器並打開項目網址
    "stop": "pm2 stop all",//提供一個停止服務的腳本
    "restart": "pm2 stop all && npm start"//提供一個重啟服務器的腳本
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "jasmine-core": "^2.8.0",
    "jquery": "^3.2.1",
    "karma": "^1.7.1",
    "karma-jasmine": "^1.1.0",
    "karma-phantomjs-launcher": "^1.0.4",
    "opener": "^1.4.3",
    "pm2": "^2.7.2",
    "serve": "^6.4.0",
    "systemjs": "^0.20.19",
    "systemjs-plugin-babel": "0.0.25"
  }
}

在命令行中的執行結果是這個樣子的

npm start

npm stop

npm restart

github項目地址:https://github.com/zhaoshuoer/praiseButton

本文參考地址:https://www.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/


免責聲明!

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



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