
如果使用 JavaScript、或者曾經(jīng)與 JavaScript 項目、Node.js 或前端項目進行過交互,則肯定會遇到過 package.json 文件。
它有什么用途?應(yīng)該了解它的什么,可以使用它完成哪些有趣的事情?
package.json 文件是項目的清單。 它可以做很多完全互不相關(guān)的事情。 例如,它是用于工具的配置中心。 它也是 npm 和 yarn 存儲所有已安裝軟件包的名稱和版本的地方。
文件結(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)注:筆墨是小舟