package.json和package-lock.json依赖包文件

一、package.json

package.json 是在运行 “ npm init ”时生成的,主要记录项目依赖

  • name:项目名,也就是在使用npm init 初始化时取的名字,但是如果使用的是npm init -y
    快速初始化的话,那这里的名字就是默认存放这个文件的文件名;
  • version:版本号;
  • private:希不希望授权别人以任何形式使用私有包或未发布的;
  • scripts-serve:是vue的项目启动简写配置;
  • scripts-build:是vue的打包操作简写配置;
  • dependencies:指定了项目运行时所依赖的模块;
  • devDependencies:指定项目开发时所需要的模块,也就是在项目开发时才用得上,一旦项目打包上线了,就将移除这里的第三方模块;

axios在package.json中的样子:

"dependencies": { // 指定项目运行时所依赖的模块
    "axios": "^0.27.2",
  },

二、package-lock.json

package-lock.json是在运行“npm install”时生成的一个文件,用于记录当前状态下项目中实际安装的各个package的版本号、模块下载地址、及这个模块又依赖了哪些依赖。

axios在package-lock.json中的样子:

"packages": {
    "": {
      "name": "vuerender",
      "version": "0.1.0",
      "dependencies": {
        "axios": "^0.27.2",
        "core-js": "^3.8.3",
        "element-ui": "^2.15.6",
        "vue": "^2.6.14",
        "vue-router": "^3.5.4",
        "vuex": "^3.6.0"
      },
//============================================================================
"node_modules/axios": {
      "version": "0.27.2",
      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 
      // resolved表示安装包的真实地址
      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
       // integrity表示安装包的hash值
      "dependencies": { // dependencies表示安装包的依赖
        "follow-redirects": "^1.14.9",
        "form-data": "^4.0.0"
      }
    },

// =================================================================
"axios": {
      "version": "0.27.2",
      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
      "requires": { // requires表示依赖的包
        "follow-redirects": "^1.14.9",
        "form-data": "^4.0.0"
      }
    }, 

三、语义化版本(semver)

指定版本:比如 1.2.2 ,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。

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

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

latest:安装最新版本。

四、为什么有了package.json,还需要package-lock.json文件呢?

当项目中已有 package-lock.json 文件,在安装项目依赖时,将以该文件为主进行解析安装指定版本依赖包,而不是使用 package.json 来解析和安装模块。因为 package 只是指定的版本不够具体,而package-lock 为每个模块及其每个依赖项指定了版本,位置和完整性哈希,所以它每次创建的安装都是相同的。无论你使用什么设备,或者将来安装它都无关紧要,每次都应该给你相同的结果。

五、npm install的过程

npm install的过程大致就是从package.json中读取所有的依赖信息,然后再与node_modules中已经安装的依赖进行对比,如果没有安装,则通过package-lock.json获取相应版本号下载安装.如果已经存在,则会通过package-lock.json检查更新。

进行更新的原则就是其范围是在package.json中对应安装包版本所容纳的版本。^ 就是指兼容该版本以后的小版本而不更新大版本,如上图package.json所示,“vue”:" ^ 2.5.2"也就是指范围应该在>=2.5.2和<3.0.0之间(tips:网上大多数帖子说的比较笼统,而参考其中的一篇帖子大致就是,^会忽视版本号开头为0的数字,也就是说"axios":"0.19.0"的范围应该在>=0.19.0和<0.20.0之间)

npm5 版本下 install 规则

npm 并不是一开始就是按照现有这种规则制定的。
5.0.x 版本:

不管 package.json 中依赖是否有更新,npm install 都会根据 package-lock.json 下载。针对这种安装策略,有人提出了这个 issue[6] ,然后就演变成了 5.1.0 版本后的规则。

5.1.0 版本后:

当 package.json 中的依赖项有新版本时,npm install 会无视 package-lock.json 去下载新版本的依赖项并且更新 package-lock.json。针对这种安装策略,又有人提出了一个 issue[7] 参考 npm 贡献者 iarna 的评论,得出 5.4.2 版本后的规则。

5.4.2 版本后:

如果只有一个 package.json 文件,运行 npm install 会根据它生成一个 package-lock.json 文件,这个文件相当于本次 install 的一个快照,它不仅记录了 package.json 指明的直接依赖的版本,也记录了间接依赖的版本。

如果 package.json 的 semver-range version 和 package-lock.json 中版本兼容(package-lock.json 版本在 package.json 指定的版本范围内),即使此时 package.json 中有新的版本,执行 npm install 也还是会根据 package-lock.json 下载。

如果手动修改了 package.json 的 version ranges,且和 package-lock.json中版本不兼容,那么执行 npm install 时 package-lock.json 将会更新到兼容 package.json 的版本。

六、npm install安装的包在dependencies中,还是Devdependencies中?

简单说,不带-dev参数,则安装保存到dependencies中,如果带参数-dev,则保存到Devdependencies中

npm  install ... --save    //通过--save的方式来保存到dependencies中

npm install ... --save-dev     //通过--save-dev的方式来保存到Devdependencies中

npm install是将package.json下面的所有依赖报全部进行安装,而npm install --production则只是安装dependencies下的依赖而不安装Devpendecies下的。

参考:
1.https://blog.csdn.net/weixin_51670675/article/details/120819061
2.https://blog.csdn.net/qq_34998786/article/details/117138142
3.https://juejin.cn/post/6844903907290775565

你可能感兴趣的:(前端,javascript)