[toc]
>[success] # package-lock.json
~~~
1.在npm5 中,npm 引入了'package-lock.json'文件,为什么已经有了'package.json'还要
引入'package-lock.json'?
1.1. 'package.json'可以使用 semver 表示法设置要升级到的版本(补丁版本或次版本),
(补充说明:'semver' 是一种版本规规范,想了解更多看上一个章节),举个例子
"devDependencies": {
"fibers": ">= 3.1.1 <5.0.0",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",
"vue": "^2.6.11",
"vue-router": "^3.2.0",
"vue-template-compiler": "^2.6.11",
"vuex": "^3.4.0"
}
举个例子在开发初期使用我们使用的vue版本声明定义'vue: ^2.5.1',某个阶段有新的
开发加入我们团队,并且此时vue版本最新版本已经到了'2.6.1',那么当他执行'npm install'
时候根据 'semver'版本规则安装版本将会是vue ^2.5.1 = >=2.5.1 <3.0.0, npm会选择安装
2.6.1,因为它在匹配版本范围内,且是目前最新的vue2的版本,它不会选择2.5.0和3.0.0
这时候使用了新提供一些方法或者api 很有可能当你拉下代码时候出现一些报错,除非你
重新更新你本地'node_modules'
1.2.'package.json问题':在package.json中通常做了锁定大版本的操作,这样在每次npm
install的时候都会拉取依赖包大版本下的最新的版本。这种机制最大的一个缺点就是当有
依赖包有小版本更新时,可能会出现协同开发者的依赖包不一致的问题。
~~~
>[info] ## package-lock.json 来解决问题
~~~
1.如何解决这类问题出现,最简单的方法将'node_modules'提交大家保持统一,但是
该文件夹通常很大,那我们将所有包固定指定确切的版本,问题是体验不到更新的快乐
2.那提出一个方案,这个方案可以具备我们上面第一条形式但又避免第一条形式出现
的问题,我们采用一个 'json' 文件,他可以记录我们'node_modules' 文件目录结构
和此时此刻你安装包的具体版本,这样我们在配合一个更新指令在想要更新的时候
可以将包版本更新,这样就不用提交庞大的'node_modules' 和将每个包版本锁住
还要注意固定版本只是固定来自身的版本,依赖的版本无法固定
'package-lock 出现':
3.'package-lock.json'文件精确描述了'node_modules' 目录下所有的包的树状依赖结构,每个包的版本号都是完全精确的,这样'package-lock.json '文件需要被提交到 Git 仓库,
'package-lock.json'可以理解成是一个'node_modules' 这样现在大家的'node_modules'
都是一个版本,如果想更新新的版本包当运行 npm update 时,package-lock.json 文件
中的依赖的版本会被更新
~~~
>[info] ## package-lock.json 文件的作用
~~~
1.在团队开发中,确保每个团队成员安装的依赖版本是一致的,确定一棵唯一的
'node_modules'树
2.'node_modules' 目录本身是不会被提交到代码库的,但是 'package-lock.json' 可以提交
到代码库,如果开发人员想要回溯到某一天的目录状态,只需要把 'package.json' 和
'package-lock.json' 这两个文件回退到那一天即可。
3.由于 'package-lock.json' 和 'node_modules' 中的依赖嵌套完全一致,可以更加清楚的
了解树的结构及其变化。
4.在安装时,npm 会比较 'node_modules' 已有的包,和' package-lock.json' 进行比较,
如果重复的话,就跳过安装 ,从而优化了安装的过程。
~~~
>[info] ## package-lock.json 结构
1. 构成字段**version、resolved、integrity、dev、requires、dependencies、name、lockfileVersion**
1.1. '**version**':包唯一的版本号
1.2. '**resolved**':安装源
1.3. '**integrity**':表明包完整性的hash值(验证包是否已失效),用来从缓存中获取索引,再通过索引去获取压缩包文件
1.4. '**dev**':如果为true,安装时候是开发依赖
1.5. '**requires**':依赖包所需要的所有依赖项,对应依赖包package.json里dependencies中的依赖项
1.6. '**dependencies**':依赖包node_modules中依赖的包,与顶层的dependencies一样的结构有些依赖包中还会有一层'node_modules'
1.7. **lockfileVersion**:lock文件的版本;
1.8. **name**:项目的名称;
2. 下图安装了一个'sass-loader'**,可以看到'package-lock.json 结构' 和'node_modules'
文件结构是一样的**,这样'package-lock.json文件提交到代码版本仓库'**后拉取安装后
安装的依赖版本都是一致的**
![](https://img.kancloud.cn/35/50/35503702a1fad9e6093876c4f48de5d4_1439x609.png)
3. 但是在**开发一个库时**,则**不应把package-lock.json文件发布到仓库中**。实际上,**npm也默认不会把package-lock.json文件发布出去**。之所以这么做,是因为**库项目一般是被其他项目依赖的,在不写死的情况下,就可以复用主项目已经加载过的包,而一旦库依赖的是精确的版本号那么可能会造成包的冗余。**
>[info] ## 文件参考
[package-lock.json 文件的作用](https://www.infoq.cn/article/qj3z2ygrzdgicqauaffn)
- 工程化 -- Node
- vscode -- 插件
- vscode -- 代码片段
- 前端学会调试
- 谷歌浏览器调试技巧
- 权限验证
- 包管理工具 -- npm
- 常见的 npm ci 指令
- npm -- npm install安装包
- npm -- package.json
- npm -- 查看包版本信息
- npm - package-lock.json
- npm -- node_modules 层级
- npm -- 依赖包规则
- npm -- install 安装流程
- npx
- npm -- 发布自己的包
- 包管理工具 -- pnpm
- 模拟数据 -- Mock
- 页面渲染
- 渲染分析
- core.js && babel
- core.js -- 到底是什么
- 编译器那些术语
- 词法解析 -- tokenize
- 语法解析 -- ast
- 遍历节点 -- traverser
- 转换阶段、生成阶段略
- babel
- babel -- 初步上手之了解
- babel -- 初步上手之各种配置(preset-env)
- babel -- 初步上手之各种配置@babel/helpers
- babel -- 初步上手之各种配置@babel/runtime
- babel -- 初步上手之各种配置@babel/plugin-transform-runtime
- babel -- 初步上手之各种配置(babel-polyfills )(未来)
- babel -- 初步上手之各种配置 polyfill-service
- babel -- 初步上手之各种配置(@babel/polyfill )(过去式)
- babel -- 总结
- 各种工具
- 前端 -- 工程化
- 了解 -- Yeoman
- 使用 -- Yeoman
- 了解 -- Plop
- node cli -- 开发自己的脚手架工具
- 自动化构建工具
- Gulp
- 模块化打包工具为什么出现
- 模块化打包工具(新) -- webpack
- 简单使用 -- webpack
- 了解配置 -- webpack.config.js
- webpack -- loader 浅解
- loader -- 配置css模块解析
- loader -- 图片和字体(4.x)
- loader -- 图片和字体(5.x)
- loader -- 图片优化loader
- loader -- 配置解析js/ts
- webpack -- plugins 浅解
- eslit
- plugins -- CleanWebpackPlugin(4.x)
- plugins -- CleanWebpackPlugin(5.x)
- plugin -- HtmlWebpackPlugin
- plugin -- DefinePlugin 注入全局成员
- webapck -- 模块解析配置
- webpack -- 文件指纹了解
- webpack -- 开发环境运行构建
- webpack -- 项目环境划分
- 模块化打包工具 -- webpack
- webpack -- 打包文件是个啥
- webpack -- 基础配置项用法
- webpack4.x系列学习
- webpack -- 常见loader加载器
- webpack -- 移动端px转rem处理
- 开发一个自己loader
- webpack -- plugin插件
- webpack -- 文件指纹
- webpack -- 压缩css和html构建
- webpack -- 清里构建包
- webpack -- 复制静态文件
- webpack -- 自定义插件
- wepack -- 关于静态资源内联
- webpack -- source map 对照包
- webpack -- 环境划分构建
- webpack -- 项目构建控制台输出
- webpack -- 项目分析
- webpack -- 编译提速优护体积
- 提速 -- 编译阶段
- webpack -- 项目优化
- webpack -- DefinePlugin 注入全局成员
- webpack -- 代码分割
- webpack -- 页面资源提取
- webpack -- import按需引入
- webpack -- 摇树
- webpack -- 多页面打包
- webpack -- eslint
- webpack -- srr打包后续看
- webpack -- 构建一个自己的配置后续看
- webpack -- 打包组件和基础库
- webpack -- 源码
- webpack -- 启动都做了什么
- webpack -- cli做了什么
- webpack - 5
- 模块化打包工具 -- Rollup
- 工程化搭建代码规范
- 规范化标准--Eslint
- eslint -- 扩展配置
- eslint -- 指令
- eslint -- vscode
- eslint -- 原理
- Prettier -- 格式化代码工具
- EditorConfig -- 编辑器编码风格
- 检查提交代码是否符合检查配置
- 整体流程总结
- 微前端
- single-spa
- 简单上手 -- single-spa
- 快速理解systemjs
- single-sap 不使用systemjs
- monorepo -- 工程
- Vue -- 响应式了解
- Vue2.x -- 源码分析
- 发布订阅和观察者模式
- 简单 -- 了解响应式模型(一)
- 简单 -- 了解响应式模型(二)
- 简单 --了解虚拟DOM(一)
- 简单 --了解虚拟DOM(二)
- 简单 --了解diff算法
- 简单 --了解nextick
- Snabbdom -- 理解虚拟dom和diff算法
- Snabbdom -- h函数
- Snabbdom - Vnode 函数
- Snabbdom -- init 函数
- Snabbdom -- patch 函数
- 手写 -- 虚拟dom渲染
- Vue -- minVue
- vue3.x -- 源码分析
- 分析 -- reactivity
- 好文
- grpc -- 浏览器使用gRPC
- grcp-web -- 案例
- 待续