package.json详解

188 阅读7分钟

1 package.json

在 node.js中,有模块的概念,这个模块可以是一个库、框架、项目等。这个模块的描述文件就是 package.json。

它是标准的json对象,描述了这个项目的配置信息(名称、版本、许可证等元数据)以及所需要的各种模块。

npm install 命令会根据这个配置文件,自动下载模块依赖,配置和运行开发环境。

2 name version

{
  name:"package-learn",
  version:"1.0.0"
}

name :包的名称,发布到npm平台,显示的名称,业务引入是require(name)名称。 version:包版本,对于业务项目来说,往往不重要。但对自己的发布的项目,就显得十分重要。name和version共同决定了唯一一份代码。npm是用npm-semver来解析版本号的。

npm模块的完整的版本号一般是【主版本,次要版本,小版本】比如React 16.10.1

大版本:大的变动 可能影响了向后的兼容性

次要版本:增加了新的特性不改变已有特性

小版本:修改bug,或其他的小的改动

3 description keywords

description 包的描述,字符串格式,发布包之后,用户在npmjs.com使用搜索,在结果列表里发现你的包,和对应的描述。 description : create react apps with no build configuration

keywords: 关键字, 是一个字符串的数组,其作用与描述相似。

keywords:[ "react" ]

4 People

在author: 项目的作者。

author:{
  name: 'davy',
  email: '',
  url: ''
}

contributors: author 与 contributors字段的功能类似。他们都是People字段,author只供一个人使用,contributors则可以由多个人组成。

contributors:[{
  name:'laohan',
  email:''
}]

5 homepage bugs repository

homepage:主页信息,一个表示项目首页的url

bugs 一个表示接受问题反馈的url地址,也可以是email地址。一般是Github项目下的issues

bugs:{url:http://path/to/bug, email: bug@example.com}

bugs:{url: https://github.com/vue.js/vue/issues}

repository 指明你的项目源代码仓库所在位置,这有助于其他人为你的项目贡献代码,对于组件库很有用,这个配置项 会直接在组件库的npm首页生效。

respository:{
  type:'git',
  url:'git+https://github.com/xxx.git'
}

6 files private engines

files 数组,表示代码包下载安装完成时包括的所有文件,如果要包含所有文件可以使用【*】表示

files:【
  index.js,
  createReactApp.js,
  yarn.lock.cached
】

private: 如果设为true, 无法通过npm publish发布代码

{ private:'true' }

engines 制定项目所依赖的node 环境、npm版本等 engines:{ node:'>=8', npm:'>=4.0.0' }

7 main license

main 项目的主要入口,启动项目的文件

 {
   main:index.js
 }

可以指定项目的主要入口,用户安装使用,require()就能返回主要入口文件的export module.exports暴露的对象

license 包的许可证,根据许可证的类型,用户知道如何使用它,有哪些限制

license :'ISC' ISC许可证 license : 'MIT' MIT 许可证

8 依赖包管理

npm 目前支持5种依赖包管理类型 dependencies 应用依赖/业务依赖 devDependencies 开发依赖 peerDependencies 同伴依赖 bundledDependeccies/bundleDepencies 打包依赖 optionalDependencies 可选依赖

我们平常用的依赖是dependencies devdependencies,剩下三种依赖有发布到平台的需求才会使用到

dependecies :业务依赖

列出了项目使用的所有的依赖项 使用npm cli安装软件包时,它将下载到你的node/modules 用于指定应用依赖的外部包,一些依赖是应用发布上线后,正常执行时所需要的。意思就是这些依赖项应该是线上代码的一部分。

用于指定应用依赖的外部包,一些依赖是应用发布上线后,正常执行时所需要的。意思就是这些依赖项应该是线上代码的一部分。所以我们在装包的时候,一定要考虑这个包在线上是否用的到,不要全部放到dependecies中,增加我们打包的体积和效率。

通过以下的指令安装依赖会放在dependencies

 npm i packageName --save
 npm install packageName -S

 npm i packageName 
 // npm 5.x版本,不需要-s 或者 --save 
 // 就会把依赖添加到dependencies中去。

如果没有指定版本,直接写一个包的名字,则安装当前npm仓库中这个包的最新版本。如果要指定版本的,可以把版本号写在包名后面,比如npm i react@16.12.0 -S

主要版本匹配

指定版本:比如1.2.2 遵循大版本 次要版本 小版本的格式 安装时只安装指定版本

波浪号(~) + 指定版本 :比如 ~1.2.2 表示安装1.2.新的最新版本(不低于1.2.2) 但是不安装1.3.x,也就是已经固定 大版本和次要版本号。

插入号 + 指定版本: 比如 ^1.2.2 ,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是已经固定了 大版本号。 但是当 大版本号是0的时候,则和~作用相同了,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。

lastest :安装的最新版本

devDependencies:开发依赖

项目开发时需要的依赖,不应该是线上代码的一部分。通常是单元测试或者打包工具等通过以下指令安装依赖会放在devDepencies

npm i packageName --save-dev npm i packageName -D

dependencies和 devDepencies本质上没有什么区别,只是单纯的一个规范作用。执行npm install 时两个依赖都会下载到本地。

9 peerDependencies:同等/同伴依赖

这种依赖的作用使提示 宿主环境去安装插件在 peerDenpencies中所制定依赖的包,最终解决插件与所依赖包不一致的问题。

举个例子。 element-ui@2.6.3 只是提供一套基于vue的ui组件库,但它要求制定的vue版本,所以你经常会看到 element项目中的package.json中有

peerDependencies:{
  vue:^2.5.16
}

它要求宿主环境安装3.0.0 > vue >= 2.5.16的版本。

10 bundledDepencies/ bundleDepencies打包依赖

这种依赖会和 npm pack打包命令有关,假设package.json配置如下:

{
  name:'font-end',
  version:'1.0.0',
  dependencies:{
    fe1:'^0.3.2'
  },
  devdependencies:{
    fe2:'^1.0.0'
  },
  bundledDepencies:[
    fe1,
    fe2
  ]
}

执行打包命令npm pack,会生成font-end-1.0.0.tgz压缩包,并且这个压缩包含分fe1 fe2两个包。这样执行者在执行npm install font-end-1.0.0.tgz的时候,也会安装着两个依赖。

在bundledDepencies中指定的依赖包,必须先在denpenDepencies和devDepencies中声明过。

11 optionalDependencies可选依赖

这种依赖中的依赖项 即使安装失败了,也不会影响安装的过程,

optionalDependencies的优先级高于 dependencies 和 devdependencies. 同一依赖出现在其中,则优先optionalDependencies.

{
  name:'package-json',
  version:'1.0.0',
  main:'index.js',
  dependencies:{
    react:'^16.12.0'
  }
  devdependencies:{
    react:'^15.12.0'
  }
}

12 package-lock文件的作用

在执行npm install 的时候,会自动生成package-lock.json的文件。

用于记录当前状态下实际安装的各个npm package的具体来源和版本号。

当package.json与 package-lock.json的版本信息不一致的时候

  • 当大版本一致的时候,package.json中的小版本 小于 package-lock.json时,则被package-lock.json锁定。 当大于时候,则 会安装大版本下的最新的版本,并 更新至 package-lock.json中。

  • 当大版本不同时候,npm install 遵循的是 package.json中的版本

  • 如果一个模块在package.json中有记录,而在package-lock.json中无记录时,npm install后则会在package-lock.json中有详细记录,反之同理。

13 bin字段

package.json中的字段bin表示的是一个可执行的文件(软连接或者符号链接)到制定资源的映射。

14 scripts

scripts可以用来自定义脚本命令,是对象格式,每一个属性对应一个脚本。

自定义脚本案例:

scripts:{
  dev: webpack --config webpack-dev-config.js
}

这样可以通过 npm run dev 脚本来代替 webpack --config webpack-dev-config.js脚本来启动项目。而无需每一次来敲这么长的代码来启动项目。

npm run 是 npm run-script的缩写,一般使用前者,但后者更能反映这个命令的本质。