Node 项目在项目根目录中名为 package.json 的文件中跟踪依赖关系和元数据。这是你项目的核心。它包含名称、描述和版本之类的信息,以及运行、开发以及有选择地将项目发布到 NPM 所需的信息。
以下,我们将:
- 了解 package.json 与项目之间的关系
- 确定重要字段和元数据
- 了解如何管理 package.json
1. 了解 package.json
如果你用过 Node.js,则可能会遇到 package.json 文件。它是一个 JSON 文件,位于项目的根目录中。你的 package.json 包含关于项目的重要信息。它包含关于项目的使人类可读元数据(如项目名称和说明)以及功能元数据(如程序包版本号和程序所需的依赖项列表)。
package.json 示例如下所示:
{
"name": "my-project",
"version": "1.5.0",
"description": "Express server project using compression",
"main": "src/index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon",
"lint": "eslint **/*.js"
},
"dependencies": {
"express": "^4.16.4",
"compression": "~1.7.4"
},
"devDependencies": {
"eslint": "^5.16.0",
"nodemon": "^1.18.11"
},
"repository": {
"type": "git",
"url": "https://github.com/osiolabs/example.git"
},
"author": "Jon Church",
"contributors": [{
"name": "Amber Matz",
"email": "example@example.com",
"url": "https://www.osiolabs.com/#team"
}],
"keywords": ["server", "osiolabs", "express", "compression"]
}
2. package.json 的用途是什么?
项目的 package.json 是配置和描述如何与程序交互和运行的中心。npm CLI(和 yarn)用它来识别你的项目并了解如何处理项目的依赖关系。package.json 文件使 npm 可以启动你的项目、运行脚本、安装依赖项、发布到 NPM 注册表以及许多其他有用的任务。npm CLI 也是管理 package.json 的最佳方法,因为它有助于在项目的整个生命周期内生成和更新 package.json 文件。
package.json 会在项目的生命周期中扮演多个角色,其中某些角色仅适用于发布到 NPM 的软件包。即使你没有把项目发布到 NPM 注册表中,或者没有将其公开发布给其他人,那么 package.json 对于开发流程仍然至关重要。
你的项目还必须包含 package.json,然后才能从 NPM 安装软件包。这可能是你在项目中需要它的主要原因之一。
3. package.json 中的常见字段
让我们看一下 package.json 中包含的一些最常见和重要的字段,以更好地了解如何使用和管理这个基本文件。有些用来发布到 NPM,而其他一些则可以帮助 npm CLI 运行应用程序或安装依赖项。
实际的字段比我们所介绍的要多,你可以在它的文档【https://docs.npmjs.com/files/package.json】中了解其余字段,但以下的是必须要了解的 package.json 属性。
3.1 name
"name": "my-project"
name 字段定义包的名称。发布到 NPM 注册表时,这是软件包将在其中显示的名称。它不能超过 214 个字符,只能是小写字母,并且必须是URL安全的(允许连字符和下划线,但 URL 中不允许使用空格或其他字符)。
如果将软件包发布到 NPM,则 name 属性是必需的,并且必须是唯一的。如果尝试用 NPM 注册表上当前已经使用的名称发布程序包,则会收到错误消息。如果你的软件包并不是要发布到 NPM 上,则 name 不必是唯一的。
3.2 version
"version": "1.5.0",
version 字段对于任何已发布的软件包都非常重要,并且在发布之前是必填的。这是 package.json 描述的软件的当前版本。
3.3 license
这是非常重要但经常被忽略的属性。license 字段使我们可以定义适用于 package.json 所描述代码的许可证。同样,在将项目发布到 NPM 注册表时,这非常重要,因为许可证可能会限制某些开发人员或组织对软件的使用。拥有清晰的许可证有助于明确定义该软件可以使用的术语。
3.4 author 和 contributors
"author": "Jon Church jon@example.com https://www.osioslabs.com/#team",
"contributors": [{
"name": "Amber Matz",
"email": "example@example.com",
"url": "https://www.osiolabs.com/#team"
}],
author
和 contributors
字段的功能类似。它们都是 people
字段,可以是"Name" 格式的字符串,也可以是具有 name,email,url 字段的对象。email 和 url 都是可选的。
author
只供一个人使用,contributors
则可以由多个人组成。
这些字段是列出公共项目的联系人以及与贡献者共享信用的有用方法。
3.5 description
NPM 注册表将description
字段用于发布的软件包,以在搜索结果中和 npmjs.com 网站上描述该软件包。
当用户搜索 NPM 注册表时,该字符串用于帮助了解软件包。这应该是软件包的简短摘要。
即使你没有将其发布到 NPM 注册表中,它也可以用作项目的简单文档。
3.6 keywords
"keywords": ["server", "osiolabs", "express", "compression"]
keywords
字段是一个字符串数组,其作用与描述相似。NPM 注册表会为该字段建立索引,能够在有人搜索软件包时帮助找到它们。数组中的每个值都是与你的程序包关联的一个关键字。
如果你不发布到 NPM 注册表,则这个字段用处不大,可以忽略它。
3.7 main
"main": "src/index.js",
main
字段是 package.json
的功能属性。它定义了项目的入口点,通常是用于启动项目的文件。
如果你的包(例如其名称为 foo-lib
)是由用户安装的,则当用户执行 require('foo-lib')
时,这是 require
返回的 main
字段中所列出的文件的 module.exports
属性。
它的值通常是项目根目录中的 index.js
文件,但也可以是你选择作为包的主入口的任何文件。
3.8 scripts
"scripts": {
"start": "node index.js",
"dev": "nodemon"
}
scripts
字段是package.json
中的另一种元数据功能。scripts
属性接受一个对象,它的值为可以通过 npm run
运行的脚本,其键为实际运行的命令。这些通常是终端命令,我们把它们放入scripts
字段,可以既可以记录它们又可以轻松地重用。
scripts
是 npm CLI
用来运行项目任务的强大工具。他们可以完成开发过程中的大多数任务。了解有关 npm 脚本的更多信息【https://heynode.com/tutorial/what-are-npm-scripts】。
3.9 repository
"repository": {
"type": "git",
"url": "https://github.com/osiolabs/example.git"
}
这是 package.json
中最重要的字段之一,它列出了项目使用的所有依赖项(项目所依赖的外部代码)。使用 npm CLI
安装软件包时,它将下载到你的 node_modules/
文件夹中,并将一个条目添加到你的依赖项属性中,注意软件包的名称和已安装的版本。
dependencies
字段是一个对象,其中的包名做为键,而版本或版本范围为值。从这个列表中,当在目录中运行 npm install
时,npm
知道要获取和安装哪些包(以及什么版本)。package.json
的 dependencies
字段位于项目的核心,并定义项目所需的外部包。
在依赖版本中看到的插入符号(^
)和波浪号(~
)是 SemVer 中定义的版本范围的表示法。
3.10 devDependencies
"devDependencies": {
"nodemon": "^1.18.11"
}
与 dependencies
字段类似,但是这里列出的包仅在开发期间需要,而在生产中不需要。
devDependency
是记录开发过程中程序需要哪些工具的好方法。要将 npm
的软件包作为 devDependency
安装,可以运行 npm install --save-dev
。
devDependencies
属性的另一种用途是在我们的 npm
脚本中使用它们。了解有关在npm
脚本中使用 devDependencies
的更多信息【https://heynode.com/tutorial/what-are-npm-scripts】。
4.管理 package.json
package.json
文件必须是有效的 JSON
。这意味着任何缺少的逗号、丢失的引号或其他格式错误都将阻止 npm
与 package.json
进行交互。如果确实引入了错误,则下次运行 npm
命令时将会看到错误提示。建议尽可能使用 npm CLI
更新和管理 package.json
,以避免意外将错误引 入package.json
中。
使用 npm init
创建你的 package.json
将有助于确保你生成有效的文件。
最好使用 npm
的命令 npm install
,npm uninstall
和 npm update
来管理依赖项,这样可以使你的 package.json
和 node_modules/
文件夹保持同步。如果手动添加依赖项列表的话,需要你在把依赖项实际安装到项目之前运行 npm install
。
因为 package.json
仅是我们记录依赖项的位置,而 node_modules/
文件夹是安装依赖项代码的实际位置,所以手动更新 package.json
的依赖项字段不会立即将我们的状态反映到 node_modules/
文件夹。这就是为什么要用 npm
帮助管理依赖项的原因,因为它会同时更新 package.json
和 node_modules/
文件夹。
你当然可以在文本编辑器中手动编辑 package.json
并进行更改,只要你注意不要引入任何 JSON
格式错误,这对大多数字段都适用。但是我建议你尽可能使用 npm CLI
命令。
5.总结
package.json 文件是 Node 项目的核心。它记录了有关发布到 NPM 之前所需要的项目的重要元数据,它还定义了 npm 用于安装依赖项、运行脚本以及标识包的入口点的项目功能属性。
并非 package.json 中所有字段都适用于你,但是我们可以通过其在 package.json 文件中记录有关程序的信息来获得一些强大的好处。了解 package.json 的角色以及它与 npm 的关系是开发 Node.js 应用的重要组成部分,并且正日益成为 JavaScript 生态系统的重要组成部分。
网友评论