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包的源文件地址

// 搜索遠(yuǎn)程資源庫中的依賴包善涨,當(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或者M(jìn)IT這樣通用的許可證,就只需要指定一個許可證的名字霎苗,像這樣:{ “l(fā)icense” : “BSD” }如果你有更復(fù)雜的許可條件姆吭,或者想要提供給更多地細(xì)節(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>

  • 指定你的代碼存放的地方。這個對希望貢獻(xiàn)的人有幫助谐区。如果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壳繁≌鸬罚“本地安裝”指的是將一個模塊下載到當(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)部團(tuán)隊合作),使用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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市介粘,隨后出現(xiàn)的幾起案子殖氏,更是在濱河造成了極大的恐慌,老刑警劉巖姻采,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雅采,死亡現(xiàn)場離奇詭異,居然都是意外死亡慨亲,警方通過查閱死者的電腦和手機(jī)婚瓜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刑棵,“玉大人巴刻,你說我怎么就攤上這事◎惹” “怎么了胡陪?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碍舍。 經(jīng)常有香客問我柠座,道長,這世上最難降的妖魔是什么片橡? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任妈经,我火速辦了婚禮,結(jié)果婚禮上捧书,老公的妹妹穿的比我還像新娘吹泡。我一直安慰自己,他們只是感情好经瓷,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布爆哑。 她就那樣靜靜地躺著,像睡著了一般了嚎。 火紅的嫁衣襯著肌膚如雪泪漂。 梳的紋絲不亂的頭發(fā)上廊营,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音萝勤,去河邊找鬼露筒。 笑死,一個胖子當(dāng)著我的面吹牛敌卓,可吹牛的內(nèi)容都是我干的慎式。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼趟径,長吁一口氣:“原來是場噩夢啊……” “哼瘪吏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜗巧,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤掌眠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幕屹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蓝丙,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年望拖,在試婚紗的時候發(fā)現(xiàn)自己被綠了渺尘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡说敏,死狀恐怖鸥跟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盔沫,我是刑警寧澤医咨,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站迅诬,受9級特大地震影響腋逆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侈贷,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望等脂。 院中可真熱鬧俏蛮,春花似錦、人聲如沸上遥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粉楚。三九已至辣恋,卻和暖如春亮垫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伟骨。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工饮潦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人携狭。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓继蜡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逛腿。 傳聞我的和親對象是個殘疾皇子稀并,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

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