npm 學(xué)習(xí)筆記

Paste_Image.png

1.npm簡介

npm 是 2009 年開始的一個 javascript模塊管理工具,也是最流行的代碼共享平臺之一。2013 年 npm 的模塊總數(shù)是 4 萬,2014 年就升到 8 萬以上,超過所有其他同類平臺。今年 4 月npm官方發(fā)了一份統(tǒng)計,截止 4 月全球估計有 4 百萬用戶使用 npm,并且這個數(shù)字每年會翻一倍。NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上很多問題,
常見的使用場景有以下幾種:

  • 允許用戶從NPM服務(wù)器下載別人編寫的第三方包到本地使用。
  • 允許用戶從NPM服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。
  • 允許用戶將自己編寫的包或命令行程序上傳到NPM服務(wù)器供別人使用。

2. npm 命令大全

2.1 簡單查詢
// 查看 npm 命令列表
$ npm help

//查看各個命令的簡單用法
$ npm -l

//查看當(dāng)前npm 的版本
$ npm -v

// 查看 npm 的配置
$ npm config list -l

// 以樹型結(jié)構(gòu)列出當(dāng)前項目安裝的所有模塊,以及它們依賴的模塊
$ npm ls

// 列出所有全局安裝的模塊
$ npm ls -g

// 全局和本地的依賴包的安裝路徑
$ npm root - g
$ npm root

// 查看全局或者本地的依賴包
$ npm list -g
$ npm list

// 查看依賴包的package.json 的信息,也可以單獨查找某一個配置項
$ npm view <package name>
$ npm view <package name> dependencies  //查看gulp包的依賴關(guān)系
$ npm view <package name> repository.url  //查看gulp包的源文件地址

// 搜索遠程資源庫中的依賴包,當(dāng)在需要發(fā)布一個依賴包的時候,可以用這個命令。查找是否已有依賴包
$ npm search <package name>

// 查看某個包的信息
npm info <package name>
2.2 npm init 命令
簡單例子

npm init用來初始化生成一個新的package.json文件,package.json是基于nodejs項目必不可少的配置文件,它是存放在項目根目錄的普通json文件.它會引導(dǎo)用戶設(shè)置一系列配置,如果你覺得不用修改默認(rèn)配置,一路回車就可以了。

[注意:json文件內(nèi)是不能寫注釋的,下面代碼的注釋是方便學(xué)習(xí)的筆記,一個最簡單的例子)]

{
  "name": "test",   //項目名稱(必須)
  "version": "1.0.0",   //項目版本(必須)
  "description": "This is for study npm project !",   //項目描述(必須)
  "homepage": "",   //項目主頁
  "repository": {    //項目資源庫
    "type": "git",
    "url": "https://git.oschina.net/xxxx"
  },
  "author": {    //項目作者信息
    "name": "oysun",
    "email": "web-oysun@qq.com"
  },
  "license": "ISC",    //項目許可協(xié)議
  "devDependencies": {    //項目依賴的插件
    "gulp": "^3.8.11",
    "gulp-less": "^3.0.0"
  }
}
Package.json 屬性說明

<strong>name</strong>

  • 在package.json中最重要的就是name和version字段。他們都是必須的,如果沒有就無法install。name和version一起組成的標(biāo)識在假設(shè)中是唯一的。改變包應(yīng)該同時改變version
  • 這個名字可能會作為參數(shù)被傳入require(),所以它應(yīng)該比較短,但也要意義清晰
  • name必須小于等于214個字節(jié),包括前綴名稱在內(nèi)(如xxx/xxxmodule)
  • name不能以”_”或”.”開頭
  • 不能含有大寫字母
  • name會成為url的一部分,不能含有url非法字符
  • 創(chuàng)建一個模塊前可以先到后邊的網(wǎng)址查查name是否已經(jīng)被占用.https://www.npmjs.com/

<strong>version</strong>

  • version必須可以被npm依賴的一個node-semver模塊解析.

<strong>description</strong>

  • 一個描述,方便別人了解你的模塊作用,搜索的時候也有用

<strong>homepage</strong>

  • 這個項目主頁url和url屬性不同,如果你填寫了url屬性,npm注冊工具會認(rèn)為你把項目發(fā)布到其他地方了,獲取模塊的時候不會從npm官方倉庫獲取,而是會重定向到url屬性配置的地址

<strong>keywords</strong>

  • 一個字符串?dāng)?shù)組,方便別人搜索到本模塊

<strong>author</strong>

  • 包的作者姓名

<strong>bugs</strong>

  • 你項目的提交問題的url和(或)郵件地址。這對遇到問題的屌絲很有幫助。例子:
{
    "url" :"http://github.com/owner/project/issues",
    "email" : "project@hostname.com"
}
  • 你可以指定一個或者指定兩個。如果你只想提供一個url,那就不用對象了,字符串就行。
    如果提供了url,它會被npm bugs命令使用。

<strong>license</strong>

  • 指定一個許可證,讓人知道使用的權(quán)利和限制的。最簡單的方法是,假如你用一個像BSD或者MIT這樣通用的許可證,就只需要指定一個許可證的名字,像這樣:{ “l(fā)icense” : “BSD” }如果你有更復(fù)雜的許可條件,或者想要提供給更多地細節(jié),可以這樣:
"licenses" :
  [
    {
      "type" : "MyLicense",
      "url" :"http://github.com/owner/project/path/to/license"
    }
  ]

<strong>files</strong>

  • files是一個包含項目中的文件的數(shù)組。如果命名了一個文件夾,那也會包含文件夾中的文件。(除非被其他條件忽略了)你也可以提供一個.npmignore文件,讓即使被包含在files字段中得文件被留下。其實就像.gitignore一樣。

  • main

  • main字段配置一個文件名指向模塊的入口程序。如果你包的名字叫foo,然后用戶require(“foo”),main配置的模塊的exports對象會被返回。
    這應(yīng)該是一個相對于根目錄的文件路徑。對大對數(shù)模塊而言,這個屬性更多的是讓模塊有一個主入口文件,然而很多模塊并不寫這個屬性

    bin

    • 很多包都有一個或多個可執(zhí)行的文件希望被放到PATH中。npm讓媽媽再也不用擔(dān)心了(實際上npm本身也是通過bin屬性安裝為一個可執(zhí)行命令的)。要用這個功能,給package.json中的bin字段一個命令名到文件位置的map。初始化的時候npm會將他鏈接到prefix/bin(全局初始化)或者./node_modules/.bin/(本地初始化)。
      比如,npm有:
    ``` bash
    { "bin" : { "npm" : "./cli.js" } }
    ```
    
    * 所以,當(dāng)你初始化npm,它會創(chuàng)建一個符號鏈接到cli.js腳本到/usr/local/bin/npm。如果你只有一個可執(zhí)行文件,并且名字和包名一樣。那么你可以只用一個字符串,比如:
    ```bash
    {
      "name": "my-program",
      "version": "1.2.5",
      "bin": "./path/to/program"
    }
    ```
    
    * 結(jié)果和這個一樣:
    ```bash
    {
        "name": "my-program",
        "version": "1.2.5",
        "bin" : {
          "my-program" : "./path/to/program"
        }
     }
    ```
    

<strong>man</strong>

  • 指定一個單一的文件或者一個文件數(shù)組供man程序使用。如果只提供一個單一的文件,那么它初始化后就是man的結(jié)果,而不管實際的文件名是神馬,比如:
{
    "name" : "foo",
    "version" : "1.2.3",
    "description" : "A packaged foo fooer for fooing foos",
    "main" : "foo.js",
    "man" : "./man/doc.1"
}
  • 這樣man foo就可以用到./man/doc.1文件了。如果文件名不是以包開頭,那么它會被冠以前綴,下面的:
{
    "name" : "foo",
    "version" : "1.2.3",
    "description" : "A packaged foo fooer for fooing foos",
    "main" : "foo.js",
    "man" : [ "./man/foo.1", "./man/bar.1" ]
}
  • 會為man foo和man foo-bar創(chuàng)建文件。man文件需要以數(shù)字結(jié)束,然后可選地壓縮后以.gz為后綴。The number dictates which man section the file is installed into.
{
    "name" : "foo",
    "version" : "1.2.3",
    "description" : "A packaged foo fooer for fooing foos",
    "main" : "foo.js",
    "man" : [ "./man/foo.1", "./man/foo.2" ]
}
  • 會為man foo和man 2 foo創(chuàng)建。

<strong>directories</strong>

  • CommonJS Packages規(guī)范說明了幾種方式讓你可以用directorieshash標(biāo)示出包得結(jié)構(gòu)。如果看一下npm’s package.json,你會看到有directories標(biāo)示出doc, lib, and man。
    在未來,這個信息可能會被用到。

<strong>repository</strong>

  • 指定你的代碼存放的地方。這個對希望貢獻的人有幫助。如果git倉庫在github上,那么npm docs命令能找到你。這樣做:
"repository" :
  {
    "type" : "git",
     "url" : "http://github.com/isaacs/npm.git"
  }
"repository" :
  {
    "type" : "svn",
    "url" : "http://v8.googlecode.com/svn/trunk/"
  }

<strong>scripts</strong>

  • scripts屬性是一個對象,里邊指定了項目的生命周期個各個環(huán)節(jié)需要執(zhí)行的命令。key是生命周期中的事件,value是要執(zhí)行的命令。具體的內(nèi)容有 install start stop 等,詳見: https://docs.npmjs.com/misc/scripts
"scripts": {
    "dev": "node build/dev-server.js",
    "start": "node build/dev-server.js",
    "build": "node build/build.js",
    "lint": "eslint --ext .js,.vue src"
}

<strong>config</strong>

  • 用來設(shè)置一些項目不怎么變化的項目配置,例如port等。用戶用的時候可以使用如下用法:
  http.createServer(...).listen(process.env.npm_package_config_port)
  • 可以通過npm config set foo:port 80來修改config。

<strong>dependencies</strong>

  • dependencies屬性是一個對象,配置模塊依賴的模塊列表,key是模塊名稱,value是版本范圍,版本范圍是一個字符,可以被一個或多個空格分割。dependencies也可以被指定為一個git地址或者一個壓縮包地址。不要把測試工具或transpilers寫到dependencies中。

<strong>devDependencies</strong>

  • 如果有人想要下載并使用你的模塊,也許他們并不希望或需要下載一些你在開發(fā)過程中使用的額外的測試或者文檔框架。在這種情況下,最好的方法是把這些依賴添加到devDependencies屬性的對象中。這些模塊會在npm link或者npm install的時候被安裝,也可以像其他npm配置一樣被管理,詳見npm的config文檔。對于一些跨平臺的構(gòu)建任務(wù),例如把CoffeeScript編譯成JavaScript,就可以通過在package.json的script屬性里邊配置prepublish腳本來完成這個任務(wù),然后需要依賴的coffee-script模塊就寫在devDependencies屬性種。例如:
{
  "name": "ethopia-waza",
  "description": "a delightfully fruity coffee varietal",
  "version": "1.2.3",
  "devDependencies": {
    "coffee-script": "~1.6.3"
    },
  "scripts": {
    "prepublish": "coffee -o lib/ -c src/waza.coffee"
  },
  "main": "lib/waza.js"
}
2.3 包安裝命令
npm的包安裝分為本地安裝(local)、全局安裝(global)兩種,從敲的命令行來看,差別只是有沒有-g而已.
  • 但是代碼中,直接通過require()的方式是沒有辦法調(diào)用全局安裝的包的。全局的安裝是供命令行使用的。
  • 每個模塊可以“全局安裝”,也可以“本地安裝”。“全局安裝”指的是將一個模塊安裝到系統(tǒng)目錄中,各個項目都可以調(diào)用。一般來說,全局安裝只適用于工具模塊,比如eslint和gulp?!氨镜匕惭b”指的是將一個模塊下載到當(dāng)前項目的node_modules子目錄,然后只有在項目目錄之中,才能調(diào)用這個模塊
// 本地安裝
$ npm install <package name>

// 全局安裝
$ npm install <package name> -global
$ npm install <package name> -g

// npm install也支持直接輸入Github代碼庫地址
$ npm install git://github.com/package/path.git
$ npm install git://github.com/package/path.git#0.1.0

// install命令總是安裝模塊的最新版本,如果要安裝模塊的特定版本,可以在模塊名后面加上@和版本號。
$ npm install <package name>@latest
$ npm install <package name>@0.1.1
$ npm install <package name>@">=1.9.0 <3.1.0"

// 如果使用–save-exact參數(shù),會在package.json文件指定安裝模塊的確切版本
$ npm install <package name> --save-exact
$ npm install <package name> -E

// 安裝包信息將加入到dependencies(生產(chǎn)階段的依賴)
$ npm install <package name> --save
$ npm install <package name> -S

// 安裝包信息將加入到devDependencies(開發(fā)階段的依賴),所以開發(fā)階段一般使用它
$ npm install <package name> --save-dev
$ npm install <package name> -D

install命令可以使用不同參數(shù),指定所安裝的模塊屬于哪一種性質(zhì)的依賴關(guān)系,即出現(xiàn)在packages.json文件的哪一項中

–save:模塊名將被添加到dependencies,可以簡化為參數(shù)-S。
–save-dev: 模塊名將被添加到devDependencies,可以簡化為參數(shù)-D

一旦安裝了某個模塊,就可以在代碼中用require命令加載這個模塊。另外,模塊的依賴都被寫入了package.json文件后,他人打開項目的根目錄(項目開源、內(nèi)部團隊合作),使用npm install命令可以根據(jù)dependencies配置安裝所有的依賴包

2.4 包移除,更新插件命令
// 卸載已安裝的模塊
$ npm uninstall <package name>

// 檢查本地有哪些本地包,列出需要更新的包的信息,需要更新的包的名稱、當(dāng)前版本號、最新的版本號等
$ npm outdated

// 更新本地安裝的某個模塊和全局模塊
$ npm update <package name>
$ npm update  <package name> -g

// 全部更新
$ npm update
$ npm update -g

3. npm使用技巧

  1. 國內(nèi)訪問外網(wǎng)都很慢,甚至不能訪問!大家都懂,都很無奈!
    使用淘寶的npm國內(nèi)鏡像可以極大的提高包下載的速度
$ npm config set strict-ssl false //取消ssl驗證
$ npm install -g cnpm --registry=https://registry.npm.taobao.org

  1. windows下無法直接刪除node_modules,因為node_modules內(nèi)部嵌套的子目錄太多使用rimraf插件可以很好的解決問題
$ npm install rimraf -g
$ rimraf node_modules
  1. npm默認(rèn)將全局包和緩存文件放在C盤。如果想更改路勁可以這樣設(shè)置:
$ npm config set prefix "d:x\node"http://修改nodejs全局包的安裝路徑
$ npm config set cache "D:\nodejs\npm-cache" //修改緩存路徑

注意:由于改變了module的默認(rèn)地址,所以上面的用戶變量都要跟著改變一下“用戶變量”PATH”修改為你重新設(shè)置的路徑,要不,使用module的時候會導(dǎo)致輸入命令出現(xiàn)“xxx不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件”這個錯誤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey閱讀 6,367評論 2 36
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 1. npm 簡介 npm :一個包管理工具 包/模塊 :為了JavaScript編寫人員 共享 他們?yōu)榻鉀Q一些特...
    恰皮閱讀 892評論 2 6
  • 描述 npm從以下來源獲取配置值,按優(yōu)先級排序: 命令行標(biāo)記 在命令行上放置--foo bar設(shè)置foo配置參數(shù)為...
    竹天亮閱讀 44,496評論 0 8
  • npm是什么 NPM的全稱是Node Package Manager,是隨同NodeJS一起安裝的包管理和分發(fā)工具...
    build1024閱讀 8,141評論 0 9

友情鏈接更多精彩內(nèi)容