溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

nodejs中的package.json的作用

發(fā)布時間:2021-07-16 11:56:36 來源:億速云 閱讀:920 作者:chen 欄目:web開發(fā)

這篇文章主要講解了“nodejs中的package.json的作用”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“nodejs中的package.json的作用”吧!

package.json 文件作用

我們在創(chuàng)建 Node.js項目的時候,會遇到 package.json 文件。它是一個 JSON 文件,位于項目的根目錄下。

package.json 包含關(guān)于項目的重要信息。它包含關(guān)于項目的使人類可讀元數(shù)據(jù)(如項目名稱和說明)以及功能元數(shù)據(jù)(如程序包版本號和程序所需的依賴項列表),要想徹底搞懂package.json,我們還得從Node.js的模塊(Module)講起。

在Node.js中,模塊可以是一個庫或者一個框架,也可以是一個Node.js項目,Node.js項目遵循模塊化架構(gòu),當我們創(chuàng)建一個Node.js項目的時,這些模塊的描述文件被稱之為package.json文件。

package.json是Node.js項目中非常重要的配置文件,是一個項目的核心,該文件中跟蹤依賴關(guān)系和元數(shù)據(jù),定義了當前項目所需要的各種模塊,以及項目的配置信息,是對項目或者模塊包的描述,里面包含許多元信息。

其定義了運行項目所需要的各種依賴和項目的配置信息(比如項目名稱、項目版本、項目執(zhí)行入口文件、執(zhí)行的腳本、依賴的插件、項目貢獻者、許可證以及運行、開發(fā)以及有選擇地將項目發(fā)布到 npm 所需的信息。)。

它是配置和描述如何與程序交互和運行的中心,npm和yarn用它來識別你的項目并了解如何處理項目的依賴關(guān)系。

npm cli 也是管理 package.json 的最佳方法,因為它有助于在項目的整個生命周期內(nèi)生成和更新 package.json 文件。package.json文件就是一個JSON對象,該對象的每一個成員就是當前項目的一項設(shè)置。

package.json 會在項目的生命周期中扮演多個角色,其中某些角色僅適用于發(fā)布到 npm的軟件包,可以啟動你的項目、運行腳本、安裝依賴項、發(fā)布到npm注冊表以及許多其他有用的任務(wù)。。即使你沒有把項目發(fā)布到 npm注冊表中,或者沒有將其公開發(fā)布給其他人,那么 package.json 對于開發(fā)流程仍然至關(guān)重要。

你的項目還必須包含 package.json,然后才能從 npm安裝軟件包。這也是項目中需要它的主要原因之一。

npm install 命令會根據(jù)這個文件下載所有依賴模塊。package.json一般都在項目的根目錄下。

package.json 文件創(chuàng)建

package.json 文件創(chuàng)建有兩種方式,手動創(chuàng)建自動創(chuàng)建,一般我們使用自動創(chuàng)建較多。

1、手動創(chuàng)建

創(chuàng)建項目目錄

$mkdir node-demo>cd node-demo>touch package.json

直接在項目根目錄下新建一個 package.json 文件,然后輸入相關(guān)的內(nèi)容。

{
  "name": "express-admin",
  "version": "1.0.0",
  "description": "Express Admin",
  "keywords": [
    "server",
    "express",
    "compression"
  ],
  "homepage":"https://gitee.com/xunzhaotech/express-admin.git",
  "bugs":"https://github.com/owner/project/issues",
  "license": "MIT",
  "author": {
    "name": "Amber luyb",
    "email": "luyb@xunzhaotech.com",
    "url": "https://www.xunzhaotech.com"
  },
  "contributors": [
    {
      "name": "Amber luyb",
      "email": "luyb@xunzhaotech.com",
      "url": "https://gitee.com/xunzhaotech/express-admin.git"
    }
  ],
  "funding": [
    {
      "type" : "individual",
      "url" : "http://example.com/donate"
    },
    "http://example.com/donateAlso",
    {
      "type" : "patreon",
      "url" : "https://www.patreon.com/my-account"
    }
  ],
  "files":[".git",
    "CVS",
    ".svn",
    ".hg",
    ".lock-wscript",
    ".wafpickle-N",
    ".*.swp",
    ".DS_Store",
    "._*",
    "npm-debug.log",
    ".npmrc",
    "node_modules",
    "config.gypi",
    "*.orig,"],
  "main": "index.js",
  "browser":"",
  "bin": {
    "myapp": "./cli.js"
  },
  "man": [
    "./man/foo.1",
    "./man/bar.1"
  ],
  "repository": {
    "type": "git",
    "url": "https://gitee.com/xunzhaotech/express-admin.git"
  },
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs",
    "server": "node server.js",
    "start": "node index.js",
    "dev": "nodemon",
    "lint": "eslint **/*.js"
  },
  "config": {
    "port": "8080"
  },
  "devDependencies": {
    "eslint": "^7.22.0",
    "mockjs": "^1.1.0",
    "nodemon": "^2.0.7",
    "vuepress": "^1.8.2"
  },
  "dependencies": {
    "body-parser": "^1.19.0",
    "compression": "^1.7.4",
    "cookie-parser": "^1.4.5",
    "debug": "^4.3.1",
    "express": "^4.17.1",
    "express-session": "^1.17.1"
  },
  "peerDependencies": {
    "tea": "2.x"
  },
  "peerDependenciesMeta": {
    "soy-milk": {
      "optional": true
    }
  },
  "bundledDependencies": [
    "renderized",
    "super-streams"
  ],
  "optionalDependencies":{},
  "engines": {
    "npm": "~1.0.20"
  },
  "os": [
    "darwin",
    "linux"
  ],
  "cpu": [
    "!arm",
    "!mips"
  ],
  "private": false,
  "publishConfig":{},
  "workspaces": [
    "./packages/*"
  ]
}

2、自動創(chuàng)建

當我們新建一個名稱為 xz-nuxt-admin, 在項目根目錄下執(zhí)行 yarn init -ynpm init -y 命令后,也可以輸入 npm inityarn init -y這個命令采用互動方式,要求用戶回答一些問題,然后根據(jù)提示一步步輸入相應(yīng)的內(nèi)容完成后即可在項目目錄下會新增一個基本的 package.json文件。所有問題之中,只有項目名稱(name)和項目版本(version)是必填的,其他都是選填的。內(nèi)容如下:

{
 "name": "my-test",   # 項目名稱
  "version": "1.0.0", # 項目版本(格式:大版本.次要版本.小版本)
  "author": "",       # 作者
  "description": "",  # 項目描述
  "main": "index.js", # 入口文件
  "scripts": {        # 指定運行腳本命令的 npm 命令行縮寫
      "test": "echo \"Error: no test specified\" && exit 1"
  },
"keywords": [],       # 關(guān)鍵詞
"license": "ISC"      # 許可證
}

package.json 文件配置說明

我們知道 package.json 中包含的一些最常見和重要的字段,用來管理項目的配置信息或發(fā)布到 npm,而其他一些則可以幫助 npm CLI 運行應(yīng)用程序或安裝依賴項。實際的字段比我們所介紹的要多,你可以在它的文檔中了解其余字段,但以下的是必須要了解的 package.json 屬性。

1、必須字段

package.json 中有非常多的配置項,其中必須填寫的兩個字段分別是 name 字段和 version 字段,它們是組成一個 npm 模塊的唯一標識。

name

name 字段定義了模塊的名稱,其命名時需要遵循官方的一些規(guī)范和建議:

  • 項目/模塊名稱,長度必須小于等于214個字符,不能以"."(點)或者"_"(下劃線)開頭,不能包含大寫字母。

  • 模塊名會成為模塊 url、命令行中的一個參數(shù)或者一個文件夾名稱,任何非 url 安全的字符在模塊名中都不能使用(我們可以使用 validate-npm-package-name 包來檢測模塊名是否合法)。

  • 語義化模塊名,可以幫助開發(fā)者更快的找到需要的模塊,并且避免意外獲取錯誤的模塊;

  • 若模塊名稱中存在一些符號,將符號去除后不得與現(xiàn)有的模塊名重復。

name 字段不能與其他模塊名重復,我們可以執(zhí)行以下命令查看模塊名是否已經(jīng)被使用:npm view <packageName>或者,我們也可以去 npm 上輸入模塊名,如果搜不到,則可以使用該模塊名。

version
  • 在package.json文件中,版本是非常重要的一個概念,npm 包中的模塊版本都需要遵循 SemVer 規(guī)范,該規(guī)范的標準版本號采用 X.Y.Z 的格式,其中 X、Y 和 Z 均為非負的整數(shù),且禁止在數(shù)字前方補零:

  • X 是主版本號(major):第一位就是主要版本號。一般來說,重大功能的更新,或功能的添加又不能向后兼容的情況會提升該版本號。

  • Y 是次版本號(minor):中間那一位是指次要版本號。一般來說,一些功能的添加,但又能向后兼容,這種更新會提升該版本號。

  • Z 是修訂號(patch):最后一位就是補丁版本號。一般來說,如果是項目的一些BUG修復,會將該版本號提升。

當某個版本改動比較大、并非穩(wěn)定而且可能無法滿足預期的兼容性需求時,我們可能要先發(fā)布一個先行版本。

先行版本號可以加到主版本號.次版本號.修訂號的后面,通過 - 號連接一連串以句點分隔的標識符和版本編譯信息:

  • 內(nèi)部版本(alpha)

  • 公測版本(beta)

  • 正式版本的候選版本rc(即 Release candiate)

我們可以執(zhí)行以下命令查看模塊的版本:

$npm view <packageName> version  # 查看某個模塊的最新版本
$npm view <packageName> versions # 查看某個模塊的所有歷史版本

2、可選字段

可選字段是除去必填字段需要補充的項目信息

描述信息(description & keywords)
  • description:字段用于添加模塊的描述信息,便于用戶了解該模塊,是一個字符串。它可以幫助人們在使用npm search時找到這個包。

  • keywords 項目關(guān)鍵字,是一個字符串數(shù)組。用于給模塊添加關(guān)鍵字。它可以幫助人們在使用npm search時找到這個包。

  • 當我們使用 npm 檢索模塊時,會對模塊中的 description 字段和 keywords 字段進行匹配,寫好 package.json中的 description 和 keywords 將有利于增加我們模塊的曝光率。

安裝項目依賴(dependencies & devDependencies)
  • dependencies:字段指定了項目運行所依賴的模塊(生產(chǎn)環(huán)境下,項目運行所需依賴)。

  • devDependencies:指定項目開發(fā)所需要的模塊(開發(fā)環(huán)境下,項目所需依賴)。

說明:

我們在使用vue框架開發(fā)一個程序,開發(fā)階段需要用到webpack來構(gòu)建你的開發(fā)和本地運行環(huán)境。所以vue一定要放到dependencies里,因為以后程序到生產(chǎn)環(huán)境也要用。webpack則是你用來壓縮代碼,打包等需要的工具,程序?qū)嶋H運行的時候并不需要,所以放到devDependencies里就可以了。或者我們在寫程序要用ES6標準,瀏覽器并不完全支持,所以你要用到babel來轉(zhuǎn)換代碼,babel放devDependencies。程序里有用到開源組件,比如你想用antd,antd要放dependencies。

簡化終端命令(scripts)

scripts 字段是 package.json 中的一種元數(shù)據(jù)功能,它接受一個對象,對象的屬性為可以通過 npm run 運行的腳本,值為實際運行的命令(通常是終端命令),如:

  "scripts": {
     "dev": "nuxt",
     "build": "nuxt build",
     "start": "nuxt start",
     "generate": "nuxt generate"
 },

將終端命令放入 scripts 字段,既可以記錄它們又可以實現(xiàn)輕松重用。

定義項目入口(main)

main 字段是 package.json 中的另一種元數(shù)據(jù)功能,它可以用來指定加載的入口文件。假如你的項目是一個 npm 包,當用戶安裝你的包后,const ModuleName = require('module-name') 返回的是 main 字段中所列出文件的 module.exports 屬性。當不指定main 字段時,默認值是模塊根目錄下面的index.js 文件。

發(fā)布文件配置(files)

files 字段用于描述我們使用 npm publish 命令后推送到 npm 服務(wù)器的文件列表,如果指定文件夾,則文件夾內(nèi)的所有內(nèi)容都會包含進來。我們可以查看下載的 antd 的 package.json 的files 字段,內(nèi)容如下:

"files": [
   "dist",
   "lib",
   "es"
    ……
],

可以看到下載后的 antd 包是下面的目錄結(jié)構(gòu)中包含了  /dist/"lib/es文件,另外,我們還可以通過配置一個 .npmignore 文件來排除一些文件, 防止大量的垃圾文件推送到 npm 上。

定義私有模塊(private)

一般公司的非開源項目,都會設(shè)置 private 屬性的值為 true,這是因為 npm 拒絕發(fā)布私有模塊,通過設(shè)置該字段可以防止私有模塊被無意間發(fā)布出去。

指定模塊適用系統(tǒng)(os)

使用 os 屬性可以指定模塊適用系統(tǒng)的系統(tǒng),或者指定不能安裝的系統(tǒng)黑名單(當在系統(tǒng)黑名單中的系統(tǒng)中安裝模塊則會報錯)

"os" : [ "darwin", "linux" ] # 適用系統(tǒng)
"os" : [ "!win32" ] # 黑名單

在 node 環(huán)境下可以使用 process.platform 來判斷操作系統(tǒng)

指定模塊適用 cpu 架構(gòu)(cpu)

我們可以用 cpu 字段更精準的限制用戶安裝環(huán)境

"cpu" : [ "x64", "ia32" ] # 適用 cpu
"cpu" : [ "!arm", "!mips" ] # 黑名單

在 node 環(huán)境下可以使用 process.arch 來判斷 cpu 架構(gòu)

指定項目 node 版本(engines)

防止因node 版本不同,導致會出現(xiàn)很多奇奇怪怪的問題(如某些依賴安裝報錯、依賴安裝完項目跑不起來等)。

"engines": {
  "node": ">= 8.16.0",
  "npm": ">= 6.9.0"
},

需要注意的是,engines屬性僅起到一個說明的作用,當用戶版本不符合指定值時也不影響依賴的安裝

自定義命令(bin)

bin 字段用來指定各個內(nèi)部命令對應(yīng)的可執(zhí)行文件的位置。主要應(yīng)用在腳手架搭建中,當package.json 提供了 bin 字段后,即相當于做了一個命令名和本地文件名的映射。 當用戶安裝帶有 bin 字段的包時,

  • 如果是全局安裝,npm 將會使用符號鏈接把這些文件鏈接到/usr/local/node_modules/.bin/;

  • 如果是本地安裝,會鏈接到./node_modules/.bin/。

如果要使用 mfd-cli 作為命令時,可以配置以下 bin 字段:

"bin": {
  "mfd-cli": "./bin/cli.js"
  }

上面代碼指定,mfd-cli 命令對應(yīng)的可執(zhí)行文件為 bin 子目錄下的 cli.js,因此在安裝了 mfd-cli 包的項目中,就可以很方便地利用 npm執(zhí)行腳本:

"scripts": {
    start: 'node node_modules/.bin/mfd-cli'
 }

這里看起來和 vue create/create-react-app之類的命令不太一樣?是因為:當需要 node 環(huán)境時就需要加上 node 前綴如果加上 node 前綴,就需要指定mfd-cli 的路徑 -> node_modules/.bin,否則 node mfd-cli會去查找當前路徑下的 mfd-cli.js,這樣肯定是不對。若要實現(xiàn)像 vue create/create-react-app之類的命令一樣簡便的方式,則可以在上文提到的 bin 子目錄下可執(zhí)行文件cli.js 中的第一行寫入以下命令:#!/usr/bin/env node這行命令的作用是告訴系統(tǒng)用 node 解析,這樣命令就可以簡寫成 mfd-cli 了。

設(shè)置應(yīng)用根路徑(homepage)

當我們使用 create-react-app 腳手架搭建的 React 項目,默認是使用內(nèi)置的 webpack 配置,當package.json 中不配置 homepage 屬性時,build 打包之后的文件資源應(yīng)用路徑默認是/

一般來說,我們打包的靜態(tài)資源會部署在 CDN 上,為了讓我們的應(yīng)用知道去哪里加載資源,則需要我們設(shè)置一個根路徑,這時可以通過 package.json 中的 homepage 字段設(shè)置應(yīng)用的根路徑。

當我們設(shè)置了 homepage 屬性后:

{
    "homepage": "https://xxxx.cdn/project-name",
}

打包后的資源路徑就會加上 homepage 的地址:/project-name/bundle.js

其它配置
  • author:項目開發(fā)者,它的值是你在npmjs.org網(wǎng)站的有效賬戶名,遵循“賬戶名<郵件>”的規(guī)則,例如:xunzhaotech@aliyun.com。

  • private:是否私有,設(shè)置為 true 時,npm 拒絕發(fā)布。

  • license:軟件授權(quán)條款,讓用戶知道他們的使用權(quán)利和限制。

  • bugs:bug 提交地址。

  • contributors:項目貢獻者 。

  • repository:項目倉庫地址。

  • module:是以 ES Module(也就是 ES6)模塊化方式進行加載,因為早期沒有 ES6 模塊化方案時,都是遵循 CommonJS 規(guī)范,而 CommonJS 規(guī)范的包是以 main 的方式表示入口文件的,為了區(qū)分就新增了 module 方式,但是 ES6 模塊化方案效率更高,所以會優(yōu)先查看是否有 module 字段,沒有才使用 main 字段。

  • eslintConfig:EsLint 檢查文件配置,自動讀取驗證。

  • browserslist:供瀏覽器使用的版本列表。

  • style:供瀏覽器使用時,樣式文件所在的位置;樣式文件打包工具parcelify,通過它知道樣式文件的打包位置。

package.json和package-lock.json的區(qū)別

為什么有了package.json,還需要package-lock.json文件呢,當node_modules文件夾并不存在或被刪除時,需要用到npm install重新裝載全部依賴時,通過package-lock.json可以直接表明下載地址和相關(guān)依賴,相對下載速度也更快,也不容易報錯。

感謝各位的閱讀,以上就是“nodejs中的package.json的作用”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對nodejs中的package.json的作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI