什麼是Node.js的模塊(Module)?在Node.js中,模塊是一個庫或框架,也是一個Node.js項目。Node.js項目遵循模塊化的架構,當咱們建立了一個Node.js項目,意味着建立了一個模塊,這個模塊的描述文件,被稱爲package.json。
一般狀況下package.json內容出錯,會致使項目出現bug,甚至阻止項目的運行。下面是normalize包的package.json文件:javascript
{ "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!" }
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 - 關鍵字css
上述參數是極爲常見的參數,另外還能夠設置script
、license
等等。除了官方必須的一些參數外,咱們也能夠存儲咱們本身的關於模塊的描述信息在package.json。html
咱們可使用NPM生成package.json文件,它能夠包含最基本的設置以及結果。java
$ 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書寫格式,不然容易出現意想不到的簡單錯誤。node
npm模塊的完整的版本號通常是【主版本 . 次要版本 . 補丁版本】,通常狀況下,次要版本號發生改變的話,表示程序有重大更新。git
(1)使用~表示版本範圍github
這裏大概能夠如此概述:① 補丁版本號缺失,則容許補丁版本號升級;② 次要版本號+補丁版本號缺失,則容許次要版本號+補丁版本號升級。npm
標識示例 | 描述 | 版本範圍 | 說明 |
---|---|---|---|
~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)使用^表示版本範圍json
這裏大概能夠如此概述:
① 若主版本號不爲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位。
{ "dependencies": { "foo": "1.0.0 - 2.9999.9999", "bar": ">=1.0.2 <2.1.2", 必須大於等於1.0.2版本且小於2.1.2版本 "baz": ">1.0.2 <=2.3.4", 必須大於1.0.2版本且小於等於2.3.4版本 "boo": "2.3.1", 必須匹配這個版本 "boo": "~2.3.1", 約等於2.3.1,只更新最小版本,至關於2.3.X,即>=2.3.1 <2.4.0 "thr": "2.3.x", "boo": "^2.3.1", 與2.3.1版本兼容,至關於2.X.X, 即>=2.3.1 < 3.0.0,不改變大版本號。 "qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0", "asd": "http://asdf.com/asdf.tar.gz", 在版本上指定一個壓縮包的url,當執行npm install 時這個壓縮包會被下載並安裝到本地。 "til": "~1.2", "elf": "~1.2.3", "two": "2.x", "lat": "latest", 安裝最新版本 "dyl": "file:../dyl", 使用本地路徑 "adf": "git://github.com/user/project.git#commit-ish" 使用git URL加commit-ish } }
版本號有了這個保證後,在申明第三方包依賴時,除了可依賴於一個固定版本號外,還可依賴於某個範圍的版本號。例如"argv": "0.0.x"表示依賴於0.0.x系列的最新版argv。