12. package.json 指南

圖片來源網(wǎng)絡(luò),侵刪

如果使用 JavaScript、或者曾經(jīng)與 JavaScript 項目、Node.js 或前端項目進行過交互,則肯定會遇到過 package.json 文件。

它有什么用途?應(yīng)該了解它的什么,可以使用它完成哪些有趣的事情?

package.json 文件是項目的清單。 它可以做很多完全互不相關(guān)的事情。 例如,它是用于工具的配置中心。 它也是 npmyarn 存儲所有已安裝軟件包的名稱和版本的地方。

文件結(jié)構(gòu)

這是一個示例的 package.json 文件:

{}

它是空的! 對于應(yīng)用程序,package.json 文件中的內(nèi)容沒有固定的要求。 唯一的要求是必須遵守 JSON 格式,否則,嘗試以編程的方式訪問其屬性的程序則無法讀取它。

如果要構(gòu)建要在 npm 上分發(fā)的 Node.js 軟件包,則必須具有一組可幫助其他人使用它的屬性。 稍后會詳細介紹。

這是另一個 package.json:

{
  "name": "nodejs_cn"
}

它定義了 name 屬性,用于告知應(yīng)用程序或軟件包的名稱。

這是一個更復(fù)雜的示例,該示例是從 Vue.js 應(yīng)用程序示例中提取的:

{
  "name": "test-project",
  "version": "1.0.0",
  "description": "A Vue.js project",
  "main": "src/main.js",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "unit": "jest --config test/unit/jest.conf.js --coverage",
    "test": "npm run unit",
    "lint": "eslint --ext .js,.vue src test/unit",
    "build": "node build/build.js"
  },
  "dependencies": {
    "vue": "^2.5.2"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-eslint": "^8.2.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-jest": "^21.0.2",
    "babel-loader": "^7.1.1",
    "babel-plugin-dynamic-import-node": "^1.2.0",
    "babel-plugin-syntax-jsx": "^6.18.0",
    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
    "babel-preset-env": "^1.3.2",
    "babel-preset-stage-2": "^6.22.0",
    "chalk": "^2.0.1",
    "copy-webpack-plugin": "^4.0.1",
    "css-loader": "^0.28.0",
    "eslint": "^4.15.0",
    "eslint-config-airbnb-base": "^11.3.0",
    "eslint-friendly-formatter": "^3.0.0",
    "eslint-import-resolver-webpack": "^0.8.3",
    "eslint-loader": "^1.7.1",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-vue": "^4.0.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.4",
    "friendly-errors-webpack-plugin": "^1.6.1",
    "html-webpack-plugin": "^2.30.1",
    "jest": "^22.0.4",
    "jest-serializer-vue": "^0.3.0",
    "node-notifier": "^5.1.2",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
    "postcss-import": "^11.0.0",
    "postcss-loader": "^2.0.8",
    "postcss-url": "^7.2.1",
    "rimraf": "^2.6.0",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^0.5.8",
    "vue-jest": "^1.0.2",
    "vue-loader": "^13.3.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.5.2",
    "webpack": "^3.6.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-merge": "^4.1.0"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
}

這里有很多東西:

  • name 設(shè)置了應(yīng)用程序/軟件包的名稱。
  • version 表明了當(dāng)前的版本。
  • description 是應(yīng)用程序/軟件包的簡短描述。
  • main 設(shè)置了應(yīng)用程序的入口點。
  • private 如果設(shè)置為 true,則可以防止應(yīng)用程序/軟件包被意外地發(fā)布到 npm。
  • scripts 定義了一組可以運行的 node 腳本。
  • dependencies 設(shè)置了作為依賴安裝的 npm 軟件包的列表。
  • devDependencies 設(shè)置了作為開發(fā)依賴安裝的 npm 軟件包的列表。
  • engines 設(shè)置了此軟件包/應(yīng)用程序在哪個版本的 Node.js 上運行。
  • browserslist 用于告知要支持哪些瀏覽器(及其版本)。
    以上所有的這些屬性都可被 npm 或其他工具使用。

屬性分類

本節(jié)詳細介紹了可以使用的屬性。

其中大多數(shù)屬性僅可用于 https://www.npmjs.com/,其他屬性則可被與代碼交互的腳本(例如 npm 或其他工具)使用。

name

設(shè)置軟件包的名稱。

示例:

"name": "nodejs_cn"

名稱必須少于 214 個字符,且不能包含空格,只能包含小寫字母、連字符(-)或下劃線(_)。

這是因為當(dāng)軟件包在 npm 上發(fā)布時,它會基于此屬性獲得自己的 URL。

如果在 GitHub 上公開地發(fā)布此軟件包,則 GitHub 倉庫的名稱是作為此屬性的不錯選擇。

author

列出軟件包的作者名稱。

示例:

{
  "author": "NodeJS中文網(wǎng) <mail@nodejs.cn> (http://nodejs.cn)"
}

也可以使用以下格式:

{
  "author": {
    "name": "NodeJS中文網(wǎng)",
    "email": "mail@nodejs.cn",
    "url": "http://nodejs.cn"
  }
}
contributors

除作者外,該項目可以有一個或多個貢獻者。 此屬性是列出他們的數(shù)組。

示例:

{
  "contributors": ["NodeJS中文網(wǎng) <mail@nodejs.cn> (http://nodejs.cn))"]
}

也可以使用以下格式:

{
  "contributors": [
    {
      "name": "NodeJS中文網(wǎng)",
      "email": "mail@nodejs.cn",
      "url": "http://nodejs.cn"
    }
  ]
}
bugs

鏈接到軟件包的問題跟蹤器,最常用的是 GitHub 的 issues 頁面。

示例:

{
  "bugs": "https://github.com/nodejscn/node-api-cn/issues"
}
homepage

設(shè)置軟件包的主頁。

示例:

{
  "homepage": "http://nodejs.cn"
}
version

指定軟件包的當(dāng)前版本。

示例:

"version": "1.0.0"

此屬性遵循版本的語義版本控制記法,這意味著版本始終以 3 個數(shù)字表示:x.x.x。

第一個數(shù)字是主版本號,第二個數(shù)字是次版本號,第三個數(shù)字是補丁版本號。

這些數(shù)字中的含義是:僅修復(fù)缺陷的版本是補丁版本,引入向后兼容的更改的版本是次版本,具有重大更改的是主版本。

license

指定軟件包的許可證。

示例:

"license": "MIT"
keywords

此屬性包含與軟件包功能相關(guān)的關(guān)鍵字數(shù)組。

示例:

"keywords": [
  "email",
  "machine learning",
  "ai"
]

這有助于人們在瀏覽相似的軟件包或瀏覽 https://www.npmjs.com/ 網(wǎng)站時找到你的軟件包。

description

此屬性包含了對軟件包的簡短描述。

示例:

"description": "NodeJS中文網(wǎng)入門教程"

如果要將軟件包發(fā)布到 npm,則這個屬性特別有用,人們可以知道該軟件包是干啥用的。

repository

此屬性指定了此程序包倉庫所在的位置。

示例

"repository": "github:nodejscn/node-api-cn",

注意 github 前綴。 其他流行的服務(wù)商還包括:

"repository": "gitlab:nodejscn/node-api-cn",
"repository": "bitbucket:nodejscn/node-api-cn",

可以顯式地設(shè)置版本控制系統(tǒng):

"repository": {
  "type": "git",
  "url": "https://github.com/nodejscn/node-api-cn.git"
}

也可以使用其他的版本控制系統(tǒng):

"repository": {
  "type": "svn",
  "url": "..."
}
main

設(shè)置軟件包的入口點。

當(dāng)在應(yīng)用程序中導(dǎo)入此軟件包時,應(yīng)用程序會在該位置搜索模塊的導(dǎo)出。

示例:

"main": "src/main.js"
private

如果設(shè)置為 true,則可以防止應(yīng)用程序/軟件包被意外發(fā)布到 npm 上。

示例:

"private": true
scripts

可以定義一組可以運行的 node 腳本。

示例:

"scripts": {
  "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  "start": "npm run dev",
  "unit": "jest --config test/unit/jest.conf.js --coverage",
  "test": "npm run unit",
  "lint": "eslint --ext .js,.vue src test/unit",
  "build": "node build/build.js"
}

這些腳本是命令行應(yīng)用程序。 可以通過調(diào)用 npm run XXXX 或 yarn XXXX 來運行它們,其中 XXXX 是命令的名稱。 例如:npm run dev。

可以為命令使用任何的名稱,腳本也可以是任何操作。

dependencies

設(shè)置作為依賴安裝的 npm 軟件包的列表。

當(dāng)使用 npm 或 yarn 安裝軟件包時:

npm install <PACKAGENAME>
yarn add <PACKAGENAME>

該軟件包會被自動地插入此列表中。

示例:

"dependencies": {
  "vue": "^2.5.2"
}
devDependencies

設(shè)置作為開發(fā)依賴安裝的 npm 軟件包的列表。

它們不同于 dependencies,因為它們只需安裝在開發(fā)機器上,而無需在生產(chǎn)環(huán)境中運行代碼。

當(dāng)使用 npm 或 yarn 安裝軟件包時:

npm install --dev <PACKAGENAME>
yarn add --dev <PACKAGENAME>

該軟件包會被自動地插入此列表中。

示例:

"devDependencies": {
  "autoprefixer": "^7.1.2",
  "babel-core": "^6.22.1"
}
engines

設(shè)置此軟件包/應(yīng)用程序要運行的 Node.js 或其他命令的版本。

示例:

"engines": {
  "node": ">= 6.0.0",
  "npm": ">= 3.0.0",
  "yarn": "^0.13.0"
}
browserslist

用于告知要支持哪些瀏覽器(及其版本)。 Babel、Autoprefixer 和其他工具會用到它,以將所需的 polyfill 和 fallback 添加到目標(biāo)瀏覽器。

示例:

"browserslist": [
  "> 1%",
  "last 2 versions",
  "not ie <= 8"
]

此配置意味著需要支持使用率超過 1%(來自 CanIUse.com 的統(tǒng)計信息)的所有瀏覽器的最新的 2 個主版本,但不含 IE8 及更低的版本。

命令特有的屬性

package.json 文件還可以承載命令特有的配置,例如 Babel、ESLint 等。

每個都有特有的屬性,例如 eslintConfig、babel 等。 它們是命令特有的,可以在相應(yīng)的命令/項目文檔中找到如何使用它們。

軟件包版本

在上面的描述中,已經(jīng)看到類似以下的版本號:?3.0.0 或 ^0.13.0。 它們是什么意思,還可以使用哪些其他的版本說明符?

該符號指定了軟件包能從該依賴接受的更新。

鑒于使用了 semver(語義版本控制),所有的版本都有 3 個數(shù)字,第一個是主版本,第二個是次版本,第三個是補丁版本,具有以下規(guī)則:
(1) ~: 如果寫入的是 ?0.13.0,則只更新補丁版本:即 0.13.1 可以,但 0.14.0 不可以。
(2) ^: 如果寫入的是 ^0.13.0,則要更新補丁版本和次版本:即 0.13.1、0.14.0、依此類推。
(3) *: 如果寫入的是 *,則表示接受所有的更新,包括主版本升級。
(4) >: 接受高于指定版本的任何版本。
(5) >=: 接受等于或高于指定版本的任何版本。
(6) <=: 接受等于或低于指定版本的任何版本。
(7) <: 接受低于指定版本的任何版本。

還有其他的規(guī)則:

  • 無符號: 僅接受指定的特定版本。
  • latest: 使用可用的最新版本。
    還可以在范圍內(nèi)組合以上大部分內(nèi)容,例如:1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或從 1.1.0 開始但低于 1.2.0 的版本。
    文章來源 node中文官方 http://nodejs.cn/

更多知識點 請關(guān)注:筆墨是小舟

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

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