1、package.json是什么?
什么是Node.js的模塊(Module)?在Node.js中,模塊是一個庫或框架,也是一個Node.js項目。Node.js項目遵循模塊化的架構,當我們創建了一個Node.js項目,意味着創建了一個模塊,這個模塊的描述文件,被稱為package.json。
通常情況下package.json內容出錯,會導致項目出現bug,甚至阻止項目的運行。下面是normalize包的package.json文件:
{ "name": "normalize.css", "version": "3.0.3", "description": "Normalize.css as a node packaged module", "style": "normalize.css", "files": [ "LICENSE.md", "normalize.css" ], "homepage": "http://necolas.github.io/normalize.css", "repository": { "type": "git", "url": "git://github.com/necolas/normalize.css.git" }, "main": "normalize.css", "author": { "name": "Nicolas Gallagher" }, "license": "MIT", "gitHead": "2bdda84272650aedfb45d8abe11a6d177933a803", "bugs": { "url": "https://github.com/necolas/normalize.css/issues" }, "_id": "normalize.css@3.0.3", "scripts": {}, "_shasum": "acc00262e235a2caa91363a2e5e3bfa4f8ad05c6", "_from": "normalize.css@3.0.3", "_npmVersion": "2.7.0", "_nodeVersion": "0.10.35", "_npmUser": { "name": "necolas", "email": "nicolasgallagher@gmail.com" }, "maintainers": [ { "name": "tjholowaychuk", "email": "tj@vision-media.ca" }, { "name": "necolas", "email": "nicolasgallagher@gmail.com" } ], "dist": { "shasum": "acc00262e235a2caa91363a2e5e3bfa4f8ad05c6", "tarball": "https://registry.npmjs.org/normalize.css/-/normalize.css-3.0.3.tgz" }, "directories": {}, "_resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-3.0.3.tgz", "readme": "ERROR: No README data found!" }
2、package.json屬性說明
name - 包名. version - 包的版本號。 description - 包的描述。 homepage - 包的官網URL。 author - 包的作者,它的值是你在https://npmjs.org網站的有效賬戶名,遵循“賬戶名<郵件>”的規則,例如:zhangsan <zhangsan@163.com>。 contributors - 包的其他貢獻者。 dependencies / devDependencies - 生產/開發環境依賴包列表。它們將會被安裝在 node_module 目錄下。 repository - 包代碼的Repo信息,包括type和URL,type可以是git或svn,URL則是包的Repo地址。 main - main 字段指定了程序的主入口文件,require('moduleName') 就會加載這個文件。這個字段的默認值是模塊根目錄下面的 index.js。 keywords - 關鍵字
上述參數是極為常見的參數,另外還可以設置script
、license
等等。除了官方必須的一些參數外,我們也可以存儲我們自己的關於模塊的描述信息在package.json。
3、生成package.json文件
我們可以使用NPM生成package.json文件,它可以包含最基本的設置以及結果。
$ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg> --save` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. name: (node_modules) runoob # 模塊名 version: (1.0.0) description: Node.js 測試模塊(www.runoob.com) # 描述 entry point: (index.js) test command: make test git repository: https://github.com/runoob/runoob.git # Github 地址 keywords: author: license: (ISC) About to write to ……/node_modules/package.json: # 生成地址 { "name": "runoob", "version": "1.0.0", "description": "Node.js 測試模塊(www.runoob.com)", …… } Is this ok? (yes) yes
這樣就生成了一個最基本的package.json文件,注意手動更改的時候要完全遵循嚴格的JSON書寫格式,否則容易出現意想不到的簡單錯誤。
翻譯:
該實用程序將引導您創建package.json文件。 它僅涵蓋最常見的項目,並嘗試猜測合理的默認值。 有關這些字段的權威文檔,請參閱`npm help json` 而且他們到底做了什么。 之后使用`npm install <pkg> --save`來安裝軟件包 將其保存為package.json文件中的依賴項。 隨時按^ C退出。 name:(node_modules)runoob#模塊名 版本:(1.0.0) description:Node.js測試模塊(www.runoob.com)#描述 入口點:(index.js) test命令:make test git repository:https://github.com/runoob/runoob.git#Github地址 關鍵字: 作者: 執照:(ISC) 即將寫入...... / node_modules / package.json:#生成地址
4、關於版本號的描述
npm模塊的完整的版本號一般是【主版本 . 次要版本 . 補丁版本】,一般情況下,次要版本號發生改變的話,表示程序有重大更新。
(1)使用~表示版本范圍
這里大概可以如此概述:① 補丁版本號缺失,則允許補丁版本號升級;② 次要版本號+補丁版本號缺失,則允許次要版本號+補丁版本號升級。
標識示例 | 描述 | 版本范圍 | 說明 |
---|---|---|---|
~2.3.4 | 主版本+次要版本+補丁版本 | 2.3.4 <= version < 2.4.0 | 在主版本+次要版本不允許變更的前提下,允許補丁版本升級(補丁板板號下限是4,無上限)。 |
~2.3 | 主版本+次要版本 | 2.3.0 <= version < 2.4.0 | 在主版本+次要版本不允許變更的前提下,允許補丁版本升級。 |
~2 | 主版本 | 2.0.0 <= version < 3.0.0 | 在主版本不允許變更的前提下,允許次要版本+補丁版本升級。 |
(2)使用^表示版本范圍
這里大概可以如此概述:
① 若主版本號不為0,則允許次要版本號+補丁版本號升級;② 若主版本號為0,次要版本號不為0,則允許補丁版本號升級;③ 若主版本號+次要版本號皆為0,將無法升級模塊;④ 若主版本不為0,補丁版本缺失(將被視作0),那么將允許次要版本+補丁版本升級到到最新;⑤ 若主版本為0,補丁版本缺失(將被視作0),那么允許補丁版本升級到最新;⑥ 若次要版本+補丁版本均缺失,此時補丁版本,被視作1,那么將允許次要版本+補丁版本升級到最新。
標識示例 | 描述 | 版本范圍 | 說明 |
---|---|---|---|
^1.3.4 | 主版本號不為0 | 1.3.4 <= version < 2.0.0 | 主版本不為0,允許次要版本+補丁版本升級(此例下限是1.3.4,上線是2.0.0但不匹配2.0.0) |
^0.2.3 | 主版本號為0,次要版本號不為0 | 0.2.3 <= version < 0.3.0 | 主版本為0,次要版本不為0,允許補丁版本升級(此例下限是0.2.3,上限是0.3.0但不匹配0.3.0) |
^0.0.3 | 主版本號+次要版本號均為0 | 0.0.3 <= version < 0.0.4 | 主版本號+次要版本號均為0,無法升級模塊 |
^1.3 | 主版本不為0,補丁版本缺失 | 1.3.0 <= version < 2.0.0 | 主版本不為0,補丁版本因缺失被視作0,允許次要版本+補丁版本升級到到最新(此例下限是1.3.0,上線是2.0.0但不匹配2.0.0) |
^0.2 | 主版本為0,補丁版本缺失 | 0.2.0 <= version < 0.3.0 | 主版本為0,補丁版本因缺失被視作0,允許補丁版本升級到最新(此例下限是0.2.0,上限是0.3.0但不匹配0.3.0) |
^1 | 主版本號不為0,次要版本+補丁版本均缺失 | 1.0.0 <= version < 2.0.0 | 主版本不為0,次要版本+補丁版本因缺失被視作0,允許次要版本+補丁版本升級(此例下限是1.0.0,上線是2.0.0但不匹配2.0.0) |
^0 | 主版本號為0,次要版本+補丁版本均缺失 | 0.0.1 <= version < 1.0.0 | 主版本為0,次要版本因缺失被視作0,補丁版本雖缺失但只能被視作1,允許缺失的次要版本+補丁版本升級到最新(此例下限是0.0.1,上限是1.0.0但不匹配1.0.0) |
(3)語義版本號
使用NPM下載和發布代碼時都會接觸到版本號。NPM使用語義版本號來管理代碼,這里簡單介紹一下。
語義版本號分為X.Y.Z三位,分別代表主版本號、次版本號和補丁版本號。當代碼變更時,版本號按以下原則更新。
如果只是修復bug,需要更新Z位。
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大變動,向下不兼容,需要更新X位。
版本號有了這個保證后,在申明第三方包依賴時,除了可依賴於一個固定版本號外,還可依賴於某個范圍的版本號。例如"argv": "0.0.x"表示依賴於0.0.x系列的最新版argv。