NodeJS包管理工具——npm入門

2021-02-20 尚學堂

文/ 風虎

Node.js讓開發者可以用JavaScript編寫服務端程序,它基於用C++編寫的JavaScript的V8引擎構建,所以它很快(你是否想說C更快?但要知道比起那些用Java編寫的中間件來說,C++已經很快了)。

起初,NodeJS主要是設計為做服務端程序開發的,但慢慢的,開發者們把它應用於構建本地自動化工具鏈。自此開放出了一片新的NodeJS生態環境(例如Grunt和Gulp),讓新一代的前端開發者們逐漸形成了工程化的思想。

為了利用好這些工具(或者包),我們需要以一種良好的方式去安裝和管理它們(就像Windows的添加刪除程序一樣)。於是npm就誕生了,npm以你希望的方式安裝這些工具,並且提供了一個易用的接口組織這些工具。在我介紹之前,首先要在你的額系統中安裝Node.js。


安裝Node.js

去官網的下載頁可以獲取你需要的版本。Windows和Mac都有現成的安裝包。

而對於Linux平臺來說也準備了預編譯好的二進位文件和原始碼。另外,你也可以用對應Linux發行版的包管理工具來安裝。


下面讓我們看看如何查看Node的安裝路徑以及版本:

$ which node/usr/local/bin/node$ node --versionv5.7.0

我們通過來嘗試Node的REPL(交互式解釋器)來驗證一下是否安裝成功。

$ node> console.log('Node is running');Node is running> .help.break Sometimes you get stuck, this gets you out.clear Alias for .break.exit  Exit the repl.help  Show repl options.load  Load JS from a file into the REPL session.save  Save all evaluated commands in this REPL session to a file> .exit

好了,現在Node.js已經安裝好了,接下來我們試試npm。npm已經隨Node一起裝好了,無需額外安裝。

$ which npm/usr/local/bin/npm$ npm --version3.6.0


用Node.js安裝模塊


npm可以在你的某個項目中單獨安裝模塊,也可以在你的電腦中全局安裝。在某個項目中單獨安裝的時候,npm會下載所有的文件到你項目中的一個叫做node_modules的文件夾內。

這個文件夾的所有者是當前用戶(在Linux中,對文件夾的所有者權限敏感,其他用戶如果沒有授權是無法查看另一個用戶擁有的文件的,Windows中雖然也有這個概念,但通常我們個人電腦用戶都很單一,所以並不是很重視這個概念)。全局模塊會被安裝到{prefix}/lib/node_modules/這個目錄下,目錄的擁有者是root用戶({prefix}通常是/usr/或者/usr/local/)。這意味著如果你要在某個Linux發行版下全局安裝模塊,需要用sudo命令,否則會引發權限錯誤。


更改全局模塊安裝路徑

首先讓我們看一下npm config這個命令會輸出什麼

$ npm config list; cli configsuser-agent = "npm/3.6.0 node/v5.7.0 linux x64"; node bin location = /usr/local/bin/node; cwd = /home/sitepoint; HOME = /home/sitepoint; 'npm config ls -l' to show all defaults.

這裡列出了npm的基本配置信息,重點是這裡

$ npm config get prefix/usr/local

列出了全局安裝模塊的路徑。我們通過下面的命令可以在我們的用戶主目錄下新建一個文件夾,然後把全局模塊安裝路徑更改到這個目錄下。

$ cd && mkdir .node_modules_global$ npm config set prefix=$HOME/.node_modules_global

這樣,我們就更改了全局模塊的安裝位置了。做了責怪操作以後,我們同時也會得到一個自動新建的.npmrc文件。

$ npm config get prefix/home/sitepoint/.node_modules_global$ cat .npmrcprefix=/home/sitepoint/.node_modules_global

但對於有強迫症的開發者來說,這樣還不夠,我們的npm還停留在root目錄下呢。不要緊,我們可以用下面的命令重新安裝npm到我們的本地目錄中。

$ npm install npm --global/home/sitepoint/.node_modules_global/bin/npm -> /home/sitepoint/.node_modules_global/lib/node_modules/npm/bin/npm-cli.js/home/sitepoint/.node_modules_global/lib└── npm@3.7.5

好了,最後一步,我們把.node_modules_global/bin添加到環境變量$PATH中,我們輸入npm命令的時候,就不會去root目錄下尋找,而是在我們自己的主目錄下尋找了。

export PATH="$HOME/.node_modules_global/bin:$PATH"

現在我們用which命令可以確認我們現在用的npm是來自哪個目錄的了。

$ which npm/home/sitepoint/.node_modules_global/bin/npm$ npm --version3.7.5

ok,這樣依賴,我們就不需要再用sudo來進行全局安裝了。


在全局安裝模塊

第一個例子,我們來裝一個包,叫做UglifyJS。這是一個JS壓縮工具。我們用--global這個參數來告訴npm我們要進行全局安裝,這個參數也可以簡寫為-g

$ npm list --global├─┬ npm@3.7.5│ ├── abbrev@1.0.7│ ├── ansi-regex@2.0.0│ ├── ansicolors@0.3.2│ ├── ansistyles@0.1.3└─┬ uglify-js@2.6.2  ├── async@0.2.10  ├── source-map@0.5.3  ├── uglify-to-browserify@1.0.2

大家可以看到,這個輸出相當複雜,我們在安裝其他包的時候,有可能會更慘不忍睹。我們可以用--depth=0來告訴控制臺只輸出一個層級的信息。

$ npm list -g --depth=0├── npm@3.7.5└── uglify-js@2.6.2

好了,接下來你就可以直接用uglifyjs這個命令在shell中壓縮文件了。

$ uglifyjs example.js -o example.min.js


在自己的項目中安裝模塊

不帶任何參數,直接用npm install命令即可在單獨的項目目錄中安裝模塊了。新的包會安裝到項目文件夾下的一個叫做node_modules的目錄中。例如,下面我們在本地安裝一個叫做underscore模塊(Underscore 是一個 JavaScript 工具庫,它提供了一整套函數式編程的實用功能):

$ mkdir ~/project && cd ~/project$ npm install underscore/home/sitepoint/project└── underscore@1.8.3$ lsnode_modules$ ls node_modulesunderscore


在自己項目中列出安裝過的模塊

我們可以通過npm list來列出自己項目已經安裝過的模塊

$ npm list/home/sitepoint/project└── underscore@1.8.3

這就表示,我們可以在另一個項目目錄中,安裝另一個版本的underscore模塊。


卸載模塊


還是以underscore為例,讓我們卸載後並檢查這個模塊是否還存在:

$ npm uninstall underscore- underscore@1.8.3 node_modules/underscore$ npm list/home/sitepoint/project└── (empty)


安裝特定版本的模塊

默認情況下,npm總會尋找最新版本的包來安裝,但我們仍然可以通過參數指定安裝特定版本的模塊:

$ npm install underscore@1.8.2/home/sitepoint/project└── underscore@1.8.2$ npm list/home/sitepoint/project└── underscore@1.8.2


更新模塊

如果我們以前安裝的某個包,有了新版本,例如修復bug,那我們需要一條命令能直接對這個包進行升級。

$ npm update underscoreunderscore@1.8.3 node_modules/underscore$ npm list/home/sitepoint/project└── underscore@1.8.3

註:我們需要在package.json中標記underscore為依賴才能讓上面的命令生效。(參見下面的「管理依賴」一節)


搜索模塊

我們在Linux通常會使用mkdir這個命令,那麼npm中是否有這樣一種包能達到一樣的效果呢。在這個場景下,我們就可能會需要搜索某個具有特定功能的模塊,那麼我們可以用如下命令去搜索:

$ npm search mkdirnpm WARN Building the local index for the first time, please be patient

我們發現,還真有一個,叫做mkdirp。那我們試試直接安裝它

$ npm install mkdirp/home/sitepoint/project└─┬ mkdirp@0.5.1  └── minimist@0.0.8

然後我們試試看是否真的是我們想要的包

var mkdirp = require('mkdirp');mkdirp('foo', function (err) {    if (err) console.error(err)    else console.log('Directory created!')});

運行結果如下

$ node. mkdir.jsDirectory created!

ok,還真成功了~

管理緩存

通常,我們在用npm安裝了一個模塊以後,npm會保留一份安裝包到本地的.npm目錄中,以加速下次安裝同樣的包的速度。例如在Linux發行版,這個目錄是~

$ ls ~/.npm_locks  minimist  mkdirp  registry.npmjs.org  underscore

但日積月累,這個目錄下一定會積攢很多文件,所以我們需要一個命令清理它。

$ npm cache clean


管理依賴

現在,我們已經裝過2個包了,但是這以後肯定會需要更多包,所以我們每次都手動安裝並非明智之舉,這種時候,我們經常在github項目中看到的package.json就派上用場了。我們可以通過這個文件來管理我們的包安裝。而這個文件可以用npm init命令創建。

$ npm initThis utility will walk you through creating a package.json file.Press ^C at any time to quit.name: (project) demoversion: (1.0.0)description: Demo of package.jsonentry point: (index.js)test command:git repository:keywords:author: Sitepointlicense: (ISC)

然後在項目根目錄會生成這樣一個package.json文件。我們對這個文件添加我們的依賴項,並設置一些參數:

JavaScript

{  "name": "demo",  "version": "1.0.0",  "description": "Demo package.json",  "main": "main.js",  "dependencies": {    "mkdirp": "^0.5.1",    "underscore": "^1.8.3"  },  "devDependencies": {},  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1"  },  "author": "Sitepoint",  "license": "ISC"}

下面這個命令可以省略大段的輸入參數,直接創建一個配置文件:

$ npm init --yes

package.json中的name參數將會用你項目的文件夾名字來自動設定。


我們可以通過添加private:true這個配置項來阻止不小心發布了私有的倉庫,而且可以阻止在執行npm install的時候會產生的警告。讓我們創建一個目錄,然後試試用package.json來下載模塊。

$ mkdir ~/demo && cd ~/demo$ cp ~/project/package.json ~/demo$ npm install$ npm listdemo@1.0.0 /home/sitepoint/demo├─┬ mkdirp@0.5.1│ └── minimist@0.0.8└── underscore@1.8.3

又有新問題了,如果我們要手動安裝新包的時候(不試用package.json,直接在shell用npm install命令),如何保持這個文件也能同步修改呢?我們可以用--save參數。例如下面,我們用--save參數安裝一個叫做request的新包

$ npm install request --save$ npm list --depth=0demo@1.0.0 /home/sitepoint/demo├── mkdirp@0.5.1├── request@2.53.0└── underscore@1.8.3

然後,我們的package.json文件就會被自動更新為

JavaScript

"dependencies": {  "mkdirp": "^0.5.1",  "request": "^2.53.0",  "underscore": "^1.8.3"}

可以看到對應的包已經被加入了package.json中了,這全部過程不需要我們修改文件。

##版本管理器##


有幾個工具可以讓我們在同一臺機器上使用不同版本的Node.js。其中一個叫做n。另一個叫做nvm(Node Version Manager)。

尚學堂:每天推送IT新技術文章,跟著我們擴展技術視野吧。


點個讚再走唄!

即刻起關注尚學堂,發送「要課程」,

IT課程免費送!

相關焦點

  • NodeJS包管理器-NPM
    NPM是什麼 全稱 node package manger,是Node的開放式模塊登記和管理系統。
  • Nodejs版本管理工具Nvm
    最後終於在一頓摸索之後發現神器,Nvm版本管理工具(已安裝就解決我卸載不掉舊版本的問題,舒服了)。下面介紹Nvm安裝、配置、使用。nvm-windows/releases配置修改nvm配置安裝目錄的setting.txt文件如下: # nvm安裝目錄 root: D:\software\nvm # nodejs
  • 如何在Linux中安裝最新的NodeJS和NPM
    如何在CentOS,RHEL和Fedora中安裝Node.js 14最新版本的Node.js和NPM可從官方的NodeSource Enterprise Linux存儲庫中獲得,該資源庫由Nodejs網站維護,您需要將其添加到系統中才能安裝最新的Nodejs和NPM軟體包。
  • 前端工程化 - 剖析npm的包管理機制(完整版)
    導讀 現如今,前端開發的同學已經離不開 npm 這個包管理工具,其優秀的包版本管理機制承載了整個繁榮發展的NodeJS社區,理解其內部機制非常有利於加深我們對模塊開發的理解、各項前端工程化的配置以加快我們排查問題(相信不少同學收到過各種依賴問題的困擾)的速度。
  • windows環境下配置小程序的npm
    一、什麼是npm和cnpmnpm(node package manager):nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等
  • Nodejs學習路線圖
    本文把我的學習和使用經驗進行歸納總結,希望給新入門Nodejs的同學做一些指引。2.8 前端包管理平臺: bower.jsBower 是 twitter 推出的一款包管理工具,基於nodejs的模塊化思想,把功能分散到各個模塊中,讓模塊和模塊之間存在聯繫,
  • Linux下對nodejs環境進行源碼編譯並部署雲應用
    平臺:centos 6環境:python 2.6環境安裝包地址:http://nodejs.cn/download/ 可以這裡下載源碼編譯。安裝編譯代碼的開發工具yum -y groupinstall "Development Tools"下載安裝包配置或者源碼編譯首先,優先推薦https://nodejs.org/en/download
  • npm nodejs 經典安裝問題
    為開發環境安裝npm nodejs服務讀完這篇文章你可以了解到npm和nodejs的關係yum install nodejs的版本v0.10.48和官方最新穩定版本v10.16.0版本關係npm 安裝nodejs語法報錯死循環問題處理自從轉開發後,碰到了很多以前沒有遇到過的問題,搜索出來的文章因為思維方式和關鍵字的轉變,
  • Node Package Manager – NPM入門指南
    最開始,它的目的是作為應用程式的伺服器環境,後來不少開發者用它來創建本地任務自動化工具。 從此以後,一個全新的基於Node的工具(如Grunt , Gulp和Webpack )生態系統已經發展到改變前端開發的情況。為了在Node.js中使用這些工具或包,我們需要能夠以有用的方式安裝和管理它們。
  • 從零開始發布自己的NPM包
    前端模塊化作為前端必備的一個技能,已經在前端開發中不可或缺;而模塊化帶來項目的規模不斷變大,項目的依賴越來越多;隨著項目的增多,如果每個模塊都通過手動拷貝的方式無異於飲鴆止渴,我們可以把功能相似的模塊或組件抽取到一個npm包中;然後上傳到私有npm伺服器,不斷迭代npm包來更新管理所有項目的依賴。
  • 我是如何把一個nodejs項目部署上線的
    近日正好在學習nodejs相關的內容,拉代碼放在本地環境開發都很熟悉了,但是要把開發好的項目部署上線就很少接觸了。所以就花了點時間學習了一下如何nodejs項目部署到伺服器上。以下就是整個部署的操作步驟:一、註冊騰訊雲伺服器(阿里雲)首先需要一臺伺服器,目前市面上用的最多的雲服務就是騰訊雲和阿里雲了。
  • 玩客雲配置Nodejs方便部分網友掛腳本使用
    1.找到nodejs壓縮包的下載地址nodejs下載頁面:http://nodejs.cn/download/#創建安裝目錄,可隨意命名。這裡演示命名為nodejsmkdir /usr/local/nodejscd /usr/local/nodejs#下載nodejs壓縮包並解壓縮wget https://npm.taobao.org/mirrors/node/v12.13.0/node-v12.13.0-linux-armv7l.tar.xz && tar -xvf node-v12.13.0
  • macOS 包管理工具 Homebrew 不完全指南
    說到包管理工具,幾乎已經成為現代作業系統或者開發平臺不可或缺的工具軟體。
  • 如何使用 npm 管理 NodeJS 包 | Linux 中國
    前一段時間,我們發布了一個使用 pip 管理 Python 包[1]的指南。今天,我們將討論如何使用 npm 管理 NodeJS 包。npm 是最大的軟體註冊中心,包含 600,000 多個包。每天,世界各地的開發人員通過 npm 共享和下載軟體包。在本指南中,我將解釋使用 npm 基礎知識,例如安裝包(本地和全局)、安裝特定版本的包、更新、刪除和管理 NodeJS 包等等。
  • 包管理工具yarn
    yarn是facebook發布的一款取代npm的資源包管理工具,是一個快速、可靠、安全的依賴管理工具,一款新的node資源包管理工具。
  • 實例創建自己的npm包,發布npm包並使用
    作者:李洪威前言:npm 是 Node.js 官方提供的包管理工具,項目中我們經常用到npm包(
  • 可替代NPM的快速可信賴包管理工具——Yarn
    Facebook發布的新一代包管理工具,旨在解決以往使用npm作為包管理會遇到的一些問題。
  • nodejs免安裝版
    Part1文章首推Part2今日主題:nodejs免安裝版之前有裝過nodejs安裝版,nodejs安裝後的那個目錄創建目錄都需要管理員權限,死活沒辦法解決
  • vue最簡單的入門教程+實戰(vue-cli3.X)
    一、準備工作VUE在日常開發中需要nodejs+npm環境,就是你先要安裝npm。
  • Cypress學習1-windows環境npm安裝Cypress
    安裝 Cypress,必須要求 Node.js 8 或更高版本安裝node.js官網下載地址:https://nodejs.org/en/download/>npm -v6.14.5npm安裝NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種:允許用戶從NPM伺服器下載別人編寫的第三方包到本地使用。