項目開發之package.json


Name

必須字段。

提示:

  • 不要在name中包含js, node字樣;
  • 這個名字不能以點號或下划線開頭;
  • 這個名字不能包含有大寫字母;
  • 這個名字可能在require()方法中被調用,所以應該盡可能短;
  • name字段不能含有非URL安全的字符,因為它將當發布的時候,它將作為你的包的相關信息被寫入URL中
    那么,有哪些算是非URL安全的字符呢?

         

Version

必須字段。

對於"version":"x.y.z"
1.修復bug,小改動,增加z
2.增加了新特性,但仍能向后兼容,增加y
3.有很大的改動,無法向后兼容,增加x
 

npm有自己的檢驗version的模塊——node-semver

 
npm有自己的一套檢驗version正確性的模塊,它叫做 node-semver,是一開始就跟隨着npm一起被打包安裝的。當然了,你也可以通過自己安裝去在自己的項目中使用它。
使用的例子像這樣:
先npm install --save semver
然后:
const semver = require('semver')
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null

Description

可選字段,必須是字符串。npm search的時候會用到。

Keywords

可選字段,字符串數組。npm search的時候會用到。

 

簡單地說,Description和Keywords是npm搜索系統中的搜索條件,所以。如果你試圖發布的是一個開源插件,那么這兩個字段你應該重視

Homepage

可選字段,沒有http://等帶協議前綴的URL。

Bugs

可選字段,問題追蹤系統的URL或郵箱地址;npm bugs用的上。

{ "url" :"http://github.com/owner/project/issues",

 "email" :"project@hostname.com"

}

License

可選字段。

如果是使用一個普遍的license,比如BSD-3-Clause或MIT,直接使用:

{ "license" : "BSD-3-Clause" }

Author, contributors

都是可選字段。author是一個人,contributors是一組人。

Author的格式如下:

{ "name" : "Barney Rubble",
 "email" : "b@rubble.com",
 "url" : "http://barnyrubble.tumblr.com/"
}
name屬性(必填)      email屬性(選填)    URL屬性(選填)

這種格式也可以:

"Barney Rubble <b@rubble.com> (http://barnyrubble.tumblr.com/)"

Files

可選字段,項目包含的一組文件。如果是文件夾,文件夾下的文件也會被包含。如果需要把某些文件不包含在項目中,添加一個”.npmignore”文件。這個文件和”gitignore”類似。

Main

可選字段。這個字段的值是你程序主入口模塊的ID

這個是你項目的入口文件。簡而言之,當 別人安裝了你發布的模塊時,require你的模塊的時候返回的就是這個模塊的導出(exports)。
 
例如你寫入了 { "main":"XXX.js"},而他人通過npm install '你的模塊名稱' . 安裝了你的模塊后,他通過 var X = require('你的模塊名稱')取得的就是你在XXX.js的輸出

Bin

可選字段。很多的包都會有執行文件需要安裝到PATH中去。

這個字段對應的是一個Map,每個元素對應一個{ 命令名:文件名 }

{ "bin" : { "npm" : "./cli.js" } }

Directories

用於指示包的目錄結構:

Directories.lib

指示庫文件的位置。

Directories.bin

和前面的bin是一樣的,但如果前面已經有bin,那么這個就無效。

除了以上兩個,還有Directories.doc& Directories.man & Directories.example。

Repository

可選字段。用於指示代碼存放的位置。

"repository" :
  { "type" : "git"
  , "url" : "http://github.com/npm/npm.git"
  }
 
"repository" :
  { "type" : "svn"
  , "url" : "http://v8.googlecode.com/svn/trunk/"
  }

Scripts

寫進scripts的命令(command),可以通過npm run <command>或者npm <command> 運行對應的shell指令,例如:

{

  "scripts": { "start": "node main.js"}

}

可以讓你在終端輸入npm start的時候,等同於運行了node main.js

 

什么時候要加“run”,什么時候可以不用加“run”呢?

 
一個讓我們可能有些困擾的問題是,通過script字段內的npm命令運行腳本時,有時候要加“run”,有時候又不要加"run",即有時候是可以直接用npm <command>;而有時候又要用npm run <command> 才能運行腳本,這該如何區分呢?
 
首先要提一下的是,run的原名是run-script,是一段腳本,而run是它的一個別名(alias)
 
1.當run[-script]被 test, start, restart, and stop這四個自帶的命令所使用時,它可以被省略(或者說不需要加“run”就可以直接調用),所以我們 平時最常輸入的npm start實際上相當於npm run start,只不過是為了方便省略了run而已 
2. 當你在package.json的script字段中定義的是除了1中的4個命令外的命令的時候,你就不能省略“run”了
例如你定義
"scripts": {
  "build": "XXX.js"
}

的時候,你運行XXX.js就只能通過npm run build去運行了

 

npm為script字段中的腳本路徑都加上了node_moudles/.bin前綴

 
npm為script字段中的腳本路徑都加上了node_moudles/.bin前綴,這意味着:你在試圖運行本地安裝的依賴在 node_modules/.bin 中的腳本的時候,可以省略node_modules/.bin這個前綴。例如:
我剛npm install webpack了,而在我的項目下的node_modules目錄的.bin子目錄下:

就多了一個叫做webpack的腳本

 

本來運行這個腳本的命令應該是:node_modules/.bin webpack
但由於npm已經自動幫我們加了node_modules/.bin前綴了,所以我們可以直接寫成:
"scripts": {"start": "webpack"}
而不用寫成:
"scripts": {"start": "node_modules/.bin webpack"}

npm start是有默認值的,默認為:node server.js

·  "scripts":{"start": "node server.js"}

如果你的包里有server.js文件,npm默認將執行: node server.js.

·  "scripts":{"preinstall":"node-gyp rebuild"}

如果包里有binding.gyp,npm默認在preinstall命令時,使用node-gyp做編譯。

 

better-npm-run的安裝與betterScript字段的使用

 
這個是package.json文檔介紹里所沒有的,但這里我想特別講一下:
 
先通過npm install better-npm-run安裝好包,然后你就可以在你的package.json里面使用一個新的字段—— "betterScripts"字段
 
故名思意,它和"scripts"字段很像,那么兩者間有什么聯系呢?咱還是用代碼說話吧,它可以把
"scripts": {
   "test": "NODE_ENV=production karma start"
}
變成:
復制代碼
"scripts": {
    "test": "better-npm-run test"
},
"betterScripts": {
    "test": {
        "command": "karma start",
        "env": {
            "NODE_ENV": "test"
          }
       }
}
復制代碼
 
簡單地說,就是當運行"scripts"字段中的命令的時候,它會進一步去運行 "betterScripts"中對應的命令,並通過"env"對象控制運行時的環境變量,如NODE_ENV。
 
好處是讓你的代碼的可讀性更強一些
 
另外提一下NODE_ENV的作用:
用來設置環境變量(默認值為development)。
通過檢查這個值可以分別對開發環境和生產環境下做不同的處理
 
例如在服務端代碼中通過檢查是否是開發環境(development)決定是否啟動代碼熱重載功能
熱重載只是為了在開發環境【developmen】提高生產效率用,在生產環境【production】沒毛用)
復制代碼
if (process.env.NODE_ENV === 'development') {
// 省略諸多內容
app.use(require('webpack-hot-middleware')(compiler, {
    path: '/__webpack_hmr'
}))
}
復制代碼
 

Config

可選字段,object。

Config對象中的值在Scripts的整個周期中皆可用,專門用於給Scripts提供配置參數。

Dependencies

可選字段,指示當前包所依賴的其他包。

{ "dependencies" :
  { "foo" : "1.0.0 - 2.9999.9999"
  , "bar" : ">=1.0.2 <2.1.2"
  , "baz" : ">1.0.2 <=2.3.4"
  , "boo" : "2.0.1"
  , "qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0"
  , "asd" : "http://asdf.com/asdf.tar.gz"
  , "til" : "~1.2"
  , "elf" : "~1.2.3"
  , "two" : "2.x"
  , "thr" : "3.3.x"
  }
}

版本格式可以是下面任一種:

  • version 完全匹配
  • >version 大於這個版本
  • >=version大於或等於這個版本
  • <version
  • <=version
  • ~version 非常接近這個版本
  • ^version 與當前版本兼容
  • 1.2.x X代表任意數字,因此1.2.1, 1.2.3等都可以
  • http://... Unix系統下使用的tarball的URL。
  • *任何版本都可以
  • ""任何版本都可以
  • version1 - version2  等價於 >=version1 <=version2.
  • range1 || range2 滿足任意一個即可
  • git... Git地址
  • user/repo

devDependencies

可選字段。如果只需要下載使用某些模塊,而不下載這些模塊的測試和文檔框架,放在這個下面比較不錯。

 

dependencies字段和devDependencies字段的區別

dependencies字段和devDependencies字段分別代表生產環境依賴和開發環境依賴
 
與兩個字段相關的npm install的命令
npm install 模塊 --save 安裝好后寫入package.json的dependencies中(生產環境依賴)
npm install 模塊 --save-dev 安裝好后寫入package.json的devDepencies中(開發環境依賴)

怎么區分到底安裝包的時候放在dependencies中還是devDepencies中呢?

很簡單
1.一般你去github或者npm社區里面相關包的介紹后面都會帶有--save 或者--save-dev 的參數的,這時候把命令直接復制過來運行就OK了,不用管那么多
 
2. 如果沒有1中的介紹,那么請思考,這個包到底是純粹為了開發方便使用呢?還是要放到上線后APP的代碼中呢?前者則為devDepencies,后者則為dependencies
 
【注意】:在團隊協作中,一個常見的情景是他人從github上clone你的項目,然后通過npm install安裝必要的依賴,(剛從github上clone下來是沒有node_modules的,需要安裝)那么根據什么信息安裝依賴呢?就是你的package.json中的dependencies和devDepencies。所以,在本地安裝的同時, 將依賴包的信息(要求的名稱和版本)寫入package.json中是很重要的!

peerDependencies

可選字段。兼容性依賴。如果你的包是插件,適合這種方式。

bundledDependencies

可選字段。發布包時同時打包的其他依賴。

optionalDependencies

可選字段。如果你想在某些依賴即使沒有找到,或則安裝失敗的情況下,npm都繼續執行。那么這些依賴適合放在這里。

Engines

可選字段。既可以指定node版本:

{ "engines" : {"node" : ">=0.10.3 <0.12" } }

也可以指定npm版本:

{ "engines" : {"npm" : "~1.0.20" } }

engineStrick

可選字段,布爾值。如果你肯定你的程序只能在制定的engine上運行,設置為true。

Os

可選字段。指定模塊可以在什么操作系統上運行:

"os" : [ "darwin","linux" ]

"os" : [ "!win32" ]

CPU

可選字段。指定CPU型號。

"cpu" : [ "x64","ia32" ]

"cpu" : [ "!arm","!mips" ]

preferGlobal

可選字段,布爾值。如果你的包是個命令行應用程序,需要全局安裝,就可以設為true。

Private

可選字段,布爾值。如果private為true,npm會拒絕發布。這可以防止私有repositories不小心被發布出去。

publishConfig

可選字段。發布時使用的配置值放這。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM