了解 package.json

321 阅读3分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

package.json文件介绍

相信接触过 JavaScript 的同学对于 package.json 文件一定不会陌生。几乎所有现代化的前端或 Node.js 项目根目录下都会有这个文件,那么它的作用是什么呢?我们来接着往下看。

package.json 是什么

  • package.json 是 npm 包(npm package)的描述文件
  • 其本质是一个 JSON 对象

npm 是目前 JavaScript 生态中运用最为广泛的包管理工具。 package.json 通过一个 JSON 对象来描述 npm 包的各项属性,包括 name、version、description、main、scripts ...

创建一个 package.json 文件

npm init

执行命令后 npm 将会通过问答的形式来帮助你初始化一个 package.json 文件,示例如下:

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>` afterwards to install a package and
save it as a dependency in the package.json file.
​
Press ^C at any time to quit.
package name: (code) typescript-tutorial
version: (1.0.0)
description: typescript languare tutorial
entry point: (index.js)
test command:
git repository:
keywords:
author: ivanpeng
license: (ISC)
About to write to /Users/jinvien/code/package.json:
​
{
  "name": "typescript-tutorial",
  "version": "1.0.0",
  "description": "typescript languare tutorial",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "author": "ivanpeng",
  "license": "ISC"
}
​
​
Is this OK? (yes) yes

输入上述内容,生成如下格式的的 package.json 文件:

{
  "name": "typescript-tutorial",
  "version": "1.0.0",
  "description": "typescript languare tutorial",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "author": "ivanpeng",
  "license": "ISC"
}

如果你觉得问答式有些繁琐,那么你可以通过 --yes 来简化这个步骤

npm init --yes
`

通过上述命令将不用输入任何内容即可生成一份 package.json 文件。其中各项属性的默认值遵循如下规则:

- name             # 默认为目录名称,但在 git 仓库中,将采用 git 仓库的名称
- version          # 1.0.0
- main             # index.js
- scripts          # 默认情况下会创建一个空test脚本
- keywords         # 空
- author           # 空
- license          # ISC
- repository       # 将从当前目录中提取信息(如果存在)
- bugs             # 将从当前目录中提取信息(如果存在)
- homepage         # 将从当前目录中提取信息(如果存在)

我们还可以为 init 命令设置一些配置项,例如:

> npm set init.author.email "hi@qq.com"
> npm set init.author.name "dreamer"
> npm set init.license "MIT"

小贴士:

如果 package.json 中没有 description 属性,npm 会使用 README.md 或 README.md 的第一行来帮助人们在 npm 搜索中找到对应的包,所以在 package.json 中 声明 description 属性有助于包被检索到。

package.json 文件详解

name 和 version 属性

  • 一个符合规范的 package.json 文件必须有 name 和 version 属性,name 用于描述包的名称,version 则表示包的版本
  • name 命名规则:全部小写、一个单词,不允许空格、允许英文破折号和下划线
{
    "name": "typescript-tutorial",
    "version": "1.0.0"
}

main

main 用于指定 npm 包的入口文件

script

script 是 npm 包的脚本命令对象。它的每一个属性对应一个命令,属性值则对应要执行的命令脚本。例如:

"script":{
    "dev": "node build/dev-server.js"
}

我们在终端输入 npm run dev 就等同于执行 node build/dev-server.js

package.json 的依赖管理

当我们的 npm 包依赖于其他 npm 包时,我们需要在 package.json 中对依赖进行描述。 npm 包中可以包含两种类型的依赖包:

  • "dependencies":在生产环境中需要的包
  • "devDependencies":这些包仅用于开发和测试

添加依赖项的的方法是执行npm install,同时可以使用 --save 或 --save-dev 来区分两种依赖

dependencies:

npm install <package_name> --save

devDependencies:

npm install <package_name> --save-dev

package.json 的其他属性

完整的 package.json 属性介绍,可以参考官方文档