package.json 冷知识

版本号

  1. 指定版本:比如 1.2.2,遵循 大版本.次要版本.小版本 的格式规定,安装时只安装指定版本
  2. 波浪号(tilde)+指定版本:比如 ~1.2.2,表示安装 1.2.x 的最新版本(不低于 1.2.2 ),但是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号
  3. 插入号(caret)+指定版本:比如 ˆ1.2.2 ,表示安装 1.x.x 的最新版本(不低于 1.2.2 ),但是不安装 2.x.x ,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为 0 ,则插入号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容
  4. latest:安装最新版本

安装指令

  • npm i -Snpm install --save 即写入 dependencies,项目运行所依赖的模块
  • npm i -Dnpm install --save-dev 即写入 devDependencies,项目开发所依赖的模块

关于 package-lock.json 的更新

如果 npm i xxx -D 后只提交了 package.json,就会导致其他人拉取到的 package.jsonlock 文件不同,那么执行 npm i 时会根据 package.json 中的版本号以及语义含义去下载最新的包,并更新 lock

pkg.module 字段含义

  • pkg.module 字段要指向的应该是一个基于 ES6 模块规范使用 ES5 语法书写的模块
  • 基于 ES6 模块规范是为了用户在使用我们的包时可以享受 Tree Shaking 带来的好处;使用 ES5 语法书写是为了用户在配置 babel 插件时可以放心的屏蔽node_modules 目录

相当于在一个包内同时发布了两种模块规范的版本。当打包工具遇到我们的模块时:

  1. 如果它已经支持pkg.module字段则会优先使用 ES6 模块规范的版本,这样可以启用 Tree Shaking 机制。
  2. 如果它还不识别pkg.module字段则会使用我们已经编译成 CommonJS 规范的版本,也不会阻碍打包流程。