## 【譯】package.json的使用
> Tips:package.json這一章比較重要,所以,我對npm官方文檔[Using a package.json](https://docs.npmjs.com/getting-started/using-a-package.json) 這一小節在個人理解的基礎上做了翻譯,你也可以直接查看[官方文檔](https://docs.npmjs.com/getting-started/using-a-package.json)。
[TOC]
管理本地安裝的包的最好方法是創建一個`package.json`文件。
**`package.json`文件會給你提供很多好東西:**
1. 它是你這個工程的基礎依賴和基本信息描述的集合。
2. 它允許你使用語義化版本管理規則,指定項目中能使用的包的版本。
3. 使你的構建版本可以重新生成,方便你與其他開發者分享代碼。
### 必要項
`package.json `必須包括以下幾項:
* **"name"**
* 全部為小寫字母
* 一個單詞,無空格
* 允許半角破折號和下劃線
* **"version"**
* 格式為 x.x.x
* 遵循語義化版本號規則 [semver spec](https://docs.npmjs.com/getting-started/semantic-versioning)
示例:
~~~
{
"name": "my-awesome-package",
"version": "1.0.0"
}
~~~
只要有這兩項,就可以創建一個最簡單的node 模塊
### 創建package.json文件
`$ npm init [-f|--force|-y|--yes]`
npm init是初始化項目命令,會在你運行此命令的文件夾根目錄下創建項目配置文件`package.json`。同時,在命令行,程序會依次提示你輸入。這些問題最終會記錄到`package.json`文件中。
當你在命令行輸入`npm init`命令時,它會向用戶提問一系列問題,如果不用修改默認配置,一路回車就可以了,這些問題最終會記錄到`package.json`文件中。
在命令行回答問題這個過程不是必須的,你可以在后面添加 `-f`(即在命令行輸入 `npm init -f`)跳過回答問題的過程,這時,程序會使用默認值直接生成`package.json`文件。`npm init` 有4個可選參數,這里,其他3個參數(`--force、-y、--yes`)的效果和 `-f`是一樣的。
生成的`package.json`如下(npm版本不同,`JSON`字段會有不同):
~~~
{
"name": "my_package",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"repository": {
"type": "git",
"url": ""
},
"bugs": {
"url": ""
},
"homepage": ""
}
~~~
* name:模塊的名稱,默認值是作者名字(如果有設置),除非在git目錄中,它會是git倉庫的名字,否則,為當前所在文件夾的名稱,當你將這個模塊發布之后,其他開發者就可以通過搜索這個名稱找到你發布的模塊。
* version:版本號,剛初始化的項目總是1.0.0;
* description: 模塊描述,默認為空,當你發布模塊時,npm將使用README.md 或者README的第一行來描述,這個描述可以方便其他開發者找到你的模塊,提高模塊被其他開發者發現的概率。
* main:默認為index.js;
* scripts:默認創建一行空的測試腳本;(這里可以先適當囫圇吞棗)
* keywords:搜索關鍵字,默認為空,版本發布的時候,建議寫上,方便其他開發者搜索
* author:作者
* license:默認為ISC開源證書
* repository: 如果你有把這個模塊托管到git倉庫(比如github),這里可以填寫這個URL地址
* bugs: bug反饋地址(也是針對像在github做了代碼托管的模塊),默認為空
* homepage: 作者主頁默認為空
你也可以通過set命令來設置npm init過程的默認值。比如下邊的這些:
> npm set init.author.email "wombat@npmjs.com"
npm set init.author.name "ag_dubs"
npm set init.license "MIT"
### 自定義npm init過程
除了設置`npm init`的默認值,你還可以完全自定義`npm Init` 整個過程。只需要在用戶目錄下,創建一個`.npm-init.js`文件,然后在`.npm-init.js`中編寫代碼即可。你可以像下面這樣編寫`.npm-init.js`
~~~
module.exports = {
customField: 'Custom Field',
otherCustomField: 'This field is really cool'
}
~~~
你也可以自定義在`npm init`過程中命令行提問的問題,這時,你需要用到prompt方法,寫法如下:
```
module.exports = prompt("what's your favorite flavor of ice cream buddy?", "I LIKE THEM ALL");
```
更多自定義npm init過程的細節可以參考[init-package-json](https://github.com/npm/init-package-json)
### 指定依賴包
你開發的模塊很多時候需要引入其他開發者開發的第三方模塊,這個時候,你需要在`package.json`中輸入引入所有需要的模塊,你可以通過以下兩種方式來實現:
* dependencies: 這些模塊是你開發的模塊的依賴項,沒有這些模塊你的代碼就會報錯
* devDependencies: 這些模塊只在開發環境下使用,比如`jshint、grunt`等開發過程中的輔助工具
你可以直接用IDE打開package.json文件,然后手動編輯,其格式如下:
~~~
{
"name": "my_package",
"version": "1.0.0",
"dependencies": {
"my_dep": "^1.0.0"
},
"devDependencies" : {
"my_test_framework": "^3.1.0"
}
}
~~~
不過,我們一般不會通過手動編輯`package.json`來引入第三方模塊,而是通過`--save 和 --save-dev`這兩個安裝標記來實現,這是添加依賴到你的package.json文件的更簡單(也更酷)的方式。
添加`package.json`依賴的入口(即執行該命令之后,第三方模塊會被寫入到`dependencies`字段中):
`$ npm install <package_name> --save`
添加package.json開發環境依賴的入口(即執行該命令之后,第三方模塊會被寫入到`devDependencies`字段中):
`$ npm install <package_name> --save-dev`
dependencies和devDependencies的成員都必須按照`“模塊名稱”:"模塊版本"`來編寫,
`模塊版本`的寫法遵從語義化版本管理的規則。
### 管理依賴包的版本
`npm`使用語義化版本管理依賴包,也就是我們常說的“SemVer”。
如果在項目文件夾下存在`package.json`文件,你在此文件夾下運行命令`npm install`,npm就會檢查文件中列出的依賴包,并下載所有滿足語義化規則的最新版本的依賴包。
語以化版本號的內容不是本教程的重點,請參考[語義化版本控制](http://www.tuicool.com/articles/JnmuE3R)