什么是package.json


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/04/02/%E4%BB%80%E4%B9%88%E6%98%AFpackage-json/

摘要

本文主要讲述了:

  1. 什么是 package.json
  2. 作用
  3. 字段
  4. 创建

正文

什么是 package.json

package.json是包的元信息描述文件。

托管在 npm 的包必须包含package.json

作用

  • 描述了包的名称、版本、作者等基本信息
  • 描述了包的依赖

字段

name

包的名字

注意:必须全部小写,可以包含-_

示例:

1
2
3
{
"name": "foo"
}

version

包的版本

注意:必须是x.x.x的格式且遵循语义化版本

示例:

1
2
3
{
"version": "1.0.0"
}

description

包的描述

用于提供搜索信息,例如:包的描述信息将会出现在npm search的结果中

示例:

1
2
3
{
"description": "hello, world"
}

keywords

包的关键词数组

用于提供搜索信息,例如:包的关键词将会出现在npm search的结果中

示例:

1
2
3
{
"keywords": ["foo", "bar"]
}

homepage

项目主页的 URL

示例:

1
2
3
{
"homepage": "https://jsweibo.github.io/"
}

bugs

反馈 bug 的 URL

示例:

1
2
3
{
"bugs": "https://jsweibo.github.io/"
}

1
2
3
4
5
6
{
"bugs": {
"url": "https://jsweibo.github.io/",
"email": "foo@bar.com"
}
}

license

用户许可协议

示例:

1
2
3
{
"license": "MIT"
}

author

作者的信息

注意:作者有且只能有 1 位

示例:

1
2
3
{
"author": "jsweibo"
}

1
2
3
4
5
6
7
{
"author": {
"name": "jsweibo",
"email": "foo@bar.com",
"url": "https://jsweibo.github.io/"
}
}

contributors

参与贡献者列表

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"contributors": [
{
"name": "foo",
"email": "foo@foobar.com",
"url": "https://foo.github.io/"
},
{
"name": "bar",
"email": "bar@foobar.com",
"url": "https://bar.github.io/"
}
]
}

main

nodejs 环境下,包的入口文件

示例:

foo/package.json

1
2
3
4
{
"name": "foo",
"main": "index.js"
}

foo/index.js

1
2
const bar = require('bar');
console.log(bar);

bar/package.json

1
2
3
4
{
"name": "bar",
"main": "index.js"
}

bar/index.js

1
2
3
4
5
exports.firstName = 'foo';
exports.lastName = 'bar';
exports.sayHello = function () {
return 'hello, world';
};

运行:

1
2
3
#!/usr/bin/env bash

node .

browser

浏览器环境下,包的入口文件

示例:

foo/webpack.config.js

1
2
3
4
module.exports = {
mode: 'development',
entry: './src/index.js',
};

foo/src/index.js

1
const bar = require('bar');

1
import bar from 'bar';

bar/package.json

1
2
3
4
5
{
"name": "bar",
"main": "main.js",
"browser": "browser.js"
}

运行:

1
2
3
#!/usr/bin/env bash

npx webpack

此时webpack会打包browser的值所对应的文件

bin

包的可执行文件

示例:

foo/package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"name": "foo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": "bin.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}

foo/index.js

1
console.log('index.js');

foo/bin.js

1
2
3
4
#!/usr/bin/env node

// 注意:JavaScript文件的首行必须为`#!/usr/bin/env node`,表明该脚本文件由`node`进行解释和执行
console.log('bin.js');

运行:

1
2
3
4
5
6
7
#!/usr/bin/env bash

# 调用包的可执行文件
npx .

# 调用`package.json`中的`main`字段所对应的脚本
node .

npm link执行成功之后,shell 脚本文件(用于调用包的可执行文件)已经位于$PATH,可以通过npx调用 shell 脚本文件来执行包的可执行文件

1
2
3
4
5
6
7
8
#!/usr/bin/env bash

# 在`npm root -g`下创建指向`demo`的符号链接
# 在`npm bin -g`下创建shell脚本文件(用于调用包的可执行文件)
npm link

# 通过`npx`调用shell脚本文件来执行包的可执行文件
npx foo

npm link执行成功之后,shell 脚本文件(用于调用包的可执行文件)已经位于$PATH,也可以直接调用 shell 脚本文件来执行包的可执行文件

1
2
3
4
5
6
7
8
#!/usr/bin/env bash

# 在`npm root -g`下创建指向`demo`的符号链接
# 在`npm bin -g`下创建shell脚本文件(用于调用包的可执行文件)
npm link

# 直接调用shell脚本文件来执行包的可执行文件
foo

repository

包代码仓库的 URL

示例:git@github.com:jsweibo/jsweibo.github.io.git

1
2
3
4
5
6
{
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/jsweibo/jsweibo.github.io.git"
}
}

示例:https://github.com/jsweibo/jsweibo.github.io.git

1
2
3
4
5
6
{
"repository": {
"type": "git",
"url": "git+https://github.com/jsweibo/jsweibo.github.io.git"
}
}

scripts

包的脚本

示例:

1
2
3
4
5
{
"scripts": {
"start": "node index.js"
}
}

config

包的配置信息

示例:

foo/package.json

1
2
3
4
5
{
"config": {
"jsweibo": 123
}
}

foo/index.js

1
console.log(process.env.npm_package_config_jsweibo);

输出:

1
123

注意:包的配置信息也可以写在 npm 的配置文件里。若与 npm 的配置文件相冲突,以 npm 的配置文件为准。

示例:

1
2
3
4
#!/usr/bin/env bash

# 为foo配置jsweibo
npm config set foo:jsweibo 456

输出:

1
456

dependencies

包的生产环境依赖

示例:npm install bar

1
2
3
4
5
{
"dependencies": {
"bar": "^1.0.0"
}
}

示例:npm install ../bar

1
2
3
4
5
{
"dependencies": {
"bar": "file:../bar"
}
}

示例:npm install https://github.com/jsweibo/bar.git

1
2
3
4
5
{
"dependencies": {
"bar": "git+https://github.com/jsweibo/bar.git"
}
}

devDependencies

包的开发环境依赖

开发环境依赖仅在开发环境使用,不用于生产环境

示例:npm install --save-dev bar

1
2
3
4
5
{
"devDependencies": {
"bar": "^1.0.0"
}
}

示例:npm install --save-dev ../bar

1
2
3
4
5
{
"devDependencies": {
"bar": "file:../bar"
}
}

示例:npm install --save-dev https://github.com/jsweibo/bar.git

1
2
3
4
5
{
"devDependencies": {
"bar": "git+https://github.com/jsweibo/bar.git"
}
}

peerDependencies

包的同伴依赖

常用于插件包中,用于提醒

注意:自npm@3起,npm install不再默认安装依赖包的同伴依赖

示例:jquery-cookie/package.json

1
2
3
4
5
{
"peerDependencies": {
"jquery": "^1.12.4"
}
}

bundledDependencies

包的打包依赖

  • bundledDependencies为空时,npm pack不会处理./node_modules/
  • bundledDependencies不为空时,npm pack会把bundledDependencies列表中的依赖一并打包

注意:bundledDependencies也可以写作bundleDependencies

示例:

1
2
3
4
5
6
{
"dependencies": {
"jquery": "^3.4.1"
},
"bundledDependencies": ["jquery"]
}

optionalDependencies

包的可选依赖

示例:npm install --save-optional bar

1
2
3
4
5
{
"optionalDependencies": {
"bar": "^1.0.0"
}
}

示例:npm install --save-optional ../bar

1
2
3
4
5
{
"optionalDependencies": {
"bar": "file:../bar"
}
}

示例:npm install --save-optional https://github.com/jsweibo/bar.git

1
2
3
4
5
{
"optionalDependencies": {
"bar": "git+https://github.com/jsweibo/bar.git"
}
}

engines

表示能运行此包的 node 版本范围或能管理此包的 npm 版本范围

注意:除非用户将engine-strict设置为true,否则仅会输出警告信息

示例:

1
2
3
4
5
6
{
"engines": {
"node": "^10.0.0",
"npm": "^6.0.0"
}
}

private

私有包,禁止发布

npm将拒绝发布privatetrue的包

示例:

1
2
3
{
"private": true
}

创建

问答式创建

  1. 创建并进入 1 个新的目录,以foo为例。
  2. 运行npm init命令。
  3. 根据提示输入信息。
1
2
3
4
#!/usr/bin/env bash

mkdir foo && cd foo
npm init

基于默认值创建

  1. 创建并进入 1 个新的目录,以foo为例。
  2. 运行npm init --yes命令。
1
2
3
4
#!/usr/bin/env bash

mkdir foo && cd foo
npm init --yes

设定默认值

示例:设定默认的 Email

1
2
3
#!/usr/bin/env bash

npm config set init.author.email "test@exmaple.com"

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/04/02/%E4%BB%80%E4%B9%88%E6%98%AFpackage-json/


本文对你有帮助?请支持我


支付宝
微信