npm中package.json詳解

package.json

什么是Node.js的模塊(Module)?在Node.js中,模塊是一個(gè)庫或框架,也是一個(gè)Node.js項(xiàng)目。Node.js項(xiàng)目遵循模塊化的架構(gòu),當(dāng)我們創(chuàng)建了一個(gè)Node.js項(xiàng)目,意味著創(chuàng)建了一個(gè)模塊,這個(gè)模塊的描述文件,被稱為package.json。

package.json屬性說明

{
    "name": "hello world", // 項(xiàng)目名稱
    "version": "0.0.1", // 版本號(hào):大版本.次要版本.小版本
    "author": "張三",
    "description": "第一個(gè)node.js程序",
    "keywords":["node.js","javascript"], // 關(guān)鍵詞,有助于 npm search 發(fā)現(xiàn)
    "repository": { // 存儲(chǔ)庫,指定代碼所在位置(如果git repo在GitHub上,那么該npm docs 命令將能夠找到文件位置。)
        "type": "git",
        "url": "https://path/to/url"
    },
    "license":"MIT", // 指定包許可證,詳細(xì)可見[SPDX許可證ID的完整列表](https://spdx.org/licenses/)
    "engines": {"node": "0.10.x"}, // 指定該模塊運(yùn)行的平臺(tái),可以指定 node 版本、npm 版本等
    "bugs":{"url":"http://path/to/bug","email":"bug@example.com"}, // 項(xiàng)目問題跟蹤器的URL和應(yīng)報(bào)告問題的電子郵件地址。
    "contributors":[{"name":"李四","email":"lisi@example.com"}],
    "bin": { // 指定內(nèi)部命令對(duì)應(yīng)的可執(zhí)行文件的位置,在 scripts 中就可以簡寫
        "webpack": "./bin/webpack.js"
    },
    "main": "lib/webpack.js", // 指定加載的模塊入口文件,require('moduleName')就會(huì)加載這個(gè)文件。這個(gè)字段的默認(rèn)值是模塊根目錄下面的index.js。
    "config" : { "port" : "8080" }, // 用于添加命令行的環(huán)境變量(用戶在運(yùn)行 scripts 命令時(shí),就默認(rèn)在腳本文件中添加 process.env.npm_package_config_port,用戶可以通過 npm config set foo:port 80 命令更改這個(gè)值)
    "scripts": { // 指定運(yùn)行腳本的 npm 命令行縮寫
        "start": "node index.js"
    },
    "peerDependencies": { // 指定項(xiàng)目安裝必須一起安裝的模塊及其版本號(hào),(注意:從 npm 3.0 開始,peerDependencies不會(huì)再默認(rèn)安裝)
        "chai": "1.x"
    },
    "dependencies": { // 指定項(xiàng)目運(yùn)行所依賴的模塊
        "express": "latest",
        "mongoose": "~3.8.3",
        "handlebars-runtime": "~1.0.12",
        "express3-handlebars": "~0.5.0",
        "MD5": "~1.2.0"
    },
    "devDependencies": { // 指定項(xiàng)目開發(fā)所需要的模塊
        "bower": "~1.2.8",
        "grunt": "~0.4.1",
        "grunt-contrib-concat": "~0.3.0",
        "grunt-contrib-jshint": "~0.7.2",
        "grunt-contrib-uglify": "~0.2.7",
        "grunt-contrib-clean": "~0.5.0",
        "browserify": "2.36.1",
        "grunt-browserify": "~1.3.0",
    },
    "browser": { // 指定該模板供瀏覽器使用的版本
        "tipso": "./node_modules/tipso/src/tipso.js"
    },
    "preferGlobal": true, // 表示當(dāng)用戶不將該模塊安裝為全局模塊時(shí)(即不用–global參數(shù)),要不要顯示警告,表示該模塊的本意就是安裝為全局模塊。
}

版本號(hào)的描述

npm模塊的完整的版本號(hào)一般是【主版本 . 次要版本 . 補(bǔ)丁版本】,一般情況下,次要版本號(hào)發(fā)生改變的話,表示程序有重大更新。

  • 指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式規(guī)定,安裝時(shí)只安裝指定版本。

  • 波浪號(hào)(tilde)+指定版本:比如~1.2.2,表示安裝1.2.x的最新版本(不低于1.2.2),但是不安裝1.3.x,也就是說安裝時(shí)不改變大版本號(hào)和次要版本號(hào)。


    image.png
  • 插入號(hào)(caret)+指定版本:比如?1.2.2,表示安裝1.x.x的最新版本(不低于1.2.2),但是不安裝2.x.x,也就是說安裝時(shí)不改變大版本號(hào)。需要注意的是,如果大版本號(hào)為0,則插入號(hào)的行為與波浪號(hào)相同,這是因?yàn)榇藭r(shí)處于開發(fā)階段,即使是次要版本號(hào)變動(dòng),也可能帶來程序的不兼容。


    image.png
  • latest:安裝最新版本。

npm install 與 npm update

  • 如果本地 node_modules 已安裝,再次執(zhí)行 install 不會(huì)更新包版本, 執(zhí)行 update 才會(huì)更新; 而如果本地 node_modules 為空時(shí),執(zhí)行 install/update 都會(huì)直接安裝更新包;
  • npm update 總是會(huì)把包更新到符合 package.json 中指定的 semver(語義化版本) 的最新版本號(hào)——本例中符合 ^1.8.0 的最新版本為 1.15.0
  • 一旦給定 package.json, 無論后面執(zhí)行 npm install 還是 update, package.json 中的 webpack 版本一直頑固地保持 一開始的 ^1.8.0 巋然不動(dòng)

npm i 與 npm install

實(shí)際使用的區(qū)別點(diǎn)主要如下:

  • 用npm i安裝的模塊無法用npm uninstall刪除,用npm un才卸載掉
  • npm i會(huì)幫助檢測(cè)與當(dāng)前 node 版本最匹配的 npm 包版本號(hào),并匹配出來相互依賴的 npm 包應(yīng)該提升的版本號(hào)
  • 部分 npm 包在當(dāng)前 node 版本下無法使用,必須使用建議版本
  • 安裝報(bào)錯(cuò)時(shí) install 肯定會(huì)出現(xiàn) npm-debug.log 文件,npm i不一定

npm devDependencies 與 dependencies

--save-dev

—save

首先需要說明的是 Dependencies一詞的中文意思是依賴和附屬的意思,而dev則是 develop(開發(fā))的簡寫。

所以它們的區(qū)別在 package.json 文件里面體現(xiàn)出來的就是,使用 --save-dev 安裝的 插件,被寫入到 devDependencies 域里面去,而使用 —save 安裝的插件,則是被寫入到 dependencies 區(qū)塊里面去。

那 package.json 文件里面的 devDependencies 和 dependencies 對(duì)象有什么區(qū)別呢?

devDependencies 里面的插件只用于開發(fā)環(huán)境,不用于生產(chǎn)環(huán)境,而 dependencies 是需要發(fā)布到生產(chǎn)環(huán)境的

比如我們寫一個(gè)項(xiàng)目要依賴于jQuery,沒有這個(gè)包的依賴運(yùn)行就會(huì)報(bào)錯(cuò),這時(shí)候就把這個(gè)依賴寫入dependencies

npm 包命令

npm list -g --depth 0 // 查看全局安裝過的包 -g:全局的安裝包 list:已安裝的node包 –depth 0:深度0
npm view <packageName> // 查看npm服務(wù)器中包版本號(hào) 
npm info <packageName> // npm服務(wù)器更多信息,更多版本號(hào)
npm ls <packageName> // 本地包
npm ls <packageName> -g // 全局安裝包
npm docs // 打開包git目錄

// 注意:npm build 與 npm start 是項(xiàng)目中常用的命令,注意它們有什么不同

// 在 package.json 文件中定義的 "scripts" 對(duì)象中查找 "start" 屬性,
// 執(zhí)行該屬性定義的命令,如果沒有定義,默認(rèn)執(zhí)行 node server.js 命令
npm start [--<args>] 

 // 其中,<package-folder> 為其根目錄中包含一個(gè) package.json 文件的文件夾,
// 這是由 npm link 命令和 npm install 命令組成的管道命令,
// 通常在安裝過程中被調(diào)用。如果想要直接運(yùn)行它,則運(yùn)行 npm run build
npm build [<package-folder>]

bin

對(duì)于 全局模式安裝的包(通過 -g 來安裝的包,將包安裝成全局可用的可執(zhí)行命令,并不意味著任何地方都可以通過 require() 來引用它):它會(huì)通過 bin 字段配置,將實(shí)際腳本鏈接到 Node 可執(zhí)行目錄下,例如

"bin": {
  "webpack": "./bin/webpack.js" // 告訴package.json.我的bin文件叫wepack,實(shí)際執(zhí)行的文件地址路徑為./bin/webpack.js
},

必須要打成全局包才可以使用該命令,打成全局包的命令
npm install . -g
或者
npm link
符號(hào)鏈接和package.json中的bin屬性

參考:http://www.itdecent.cn/p/b3d86ddfd555
https://www.pzijun.cn/blog/7/1.4.html#%E4%B8%80-package-json-%E8%A7%A3%E8%AF%BB

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

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

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