ReturnTmp's Blog ReturnTmp's Blog
首页
基础课程
编程语言
框架技术
运维笔记
人工智能
随笔摘录
  • 友链
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

ReturnTmp

分享有趣好玩的计算机知识
首页
基础课程
编程语言
框架技术
运维笔记
人工智能
随笔摘录
  • 友链
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • GLIBC_2.28 not found 问题解决
  • Monorepo 多项目单仓库
  • Renovate 第三方依赖更新监控
  • 【IDEA】Maven 构建项目生成文件解析
  • K8s

  • Zotero 使用指南
  • package-lock.json 是否提交问题
    • 前言
    • 排查
      • 问题
      • 文档
      • 解释
    • 解决
    • 参考链接
  • 『ARM』和『x86』处理器架构解析指南
  • GlassFish 安装配置
  • 手把手教你安装配置『Oracle Database 19c』
  • Oracle Database 19c 彻底卸载
  • 语雀故障回顾
  • OpenStack 云计算平台 Nova 计算服务学习指南
  • Vue devServer 教程
  • Swagger 导出 API 文档
  • MapStruct POJO 映射框架指南
  • IDEA 代码热部署和热加载
  • SpringBoot 启动参数配置
  • Nacos 入门指南
  • seleuim 指南
  • Spring 服务降级熔断
  • Maven BOM 解析
  • .vscode 文件夹
  • Spring Security Token 认证
  • SpringBoot 基于 Actuator 和 Admin 实现应用监控管理
  • SPM/SCM 流量跟踪体系
  • Netty 入门
  • Flyway 数据库版本管理实战指南
  • Swagger 2 和 3 安装区别
  • MP 配置分页
  • MySQL 分库分表
  • Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准
  • VSCode 插件 i18n Ally 进行国家化配置
  • Vue3 组合式 全局挂载
  • TS 教程
  • 架构解析:同城双活、异地多活、单元化架构
  • Spring 跨域配置
  • SpringCloud 微服务实战
  • Sentinel 流量治理组件教程
  • leetcode 上分
  • JMeter 压测
  • Netty IM 系统
  • IDEA 插件开发
  • SpringBoot 邮件服务 集成配置 详解
  • Maven 依赖包冲突问题解决
  • 社区项目 forest 修改
  • Maven 项目命名规范
  • 新版 PyCharm 设置 Conda 虚拟环境
  • 框架工具
ReturnTmp
2023-10-13
目录

package-lock.json 是否提交问题

# 前言

之前博主使用 vdoing (opens new window) 这款主题创建了博客,已经使用了很长时间,然后远程分别使用了 Vercel 部署和云服务器部署,然后最近服务器迁移到国外,重新部署网站之后,发现 npm 拉取包失败,但是 Vercel 可以正常拉取包部署

我开始怀疑自己的服务器配置过低,导致拉取包出现服务器 CPU & 内存占用率过高,然后导致系统卡死,拉取包失败,虽然后面排查确实有这方面原因。下面我将详细讲解排查记录

# 排查

# 问题

然后我使用 windows 主机拉取仓库也安不上依赖,然后我仔细检查了仓库文件,结果 .gitignore 文件中居然有 package-lock.json,导致 package-lock.json 没有上传,结果下载的包版本有错误

# 文档

官方文档:package-lock.json | npm Documentation (codingdict.com) (opens new window)

npm 官方文档对于 package-lock.json 解释是这样的

package-lock.json 为 npm 修改 node_modules 树或 package.json 的任何操作自动生成。它描述了生成的确切树,以便后续安装能够生成相同的树,而不考虑中间依赖项更新。

此文件旨在提交到源存储库中,并具有多种用途:

  • 描述依赖关系树的单个表示形式,以便保证团队成员、部署和持续集成安装完全相同的依赖关系。
  • 为用户提供一种工具,使其可以“时间旅行”到以前的状态, node_modules 而无需提交目录本身。
  • 通过可读的源代码管理差异提高树更改的可见性。
  • 通过允许 npm 跳过以前安装的包的重复元数据解析来优化安装过程。

一个 package-lock.json 关键细节是它不能发布,如果在顶级包以外的任何地方找到它将被忽略。它与 npm-shrinkwrap.json 共享一种格式,后者本质上是相同的文件,但允许发布。除非部署 CLI 工具或以其他方式使用发布过程来生成生产包,否则不建议这样做。

# 解释

首先我们知道 npm 包的依赖关系是树状的,手动能锁定的只有 package.json 里的第一层包的版本,每个包往下还有数不清的依赖分支,每个依赖中都有自己独立的 package.json,这些没办法都手动锁定版本,它们升级的话,一样会造成同样的问题。

package-lock.json 的出现就是为了解决上面的问题,对整个依赖树进行版本锁定 。 这个方案大概是在npm 5之后出现的。

所以如果有锁定版本的需求,package-lock.json 需要提交到源码库中,这样锁定后问题是确定性的,维护会方便。如果出现问题,可以定位到指定的包,然后如果问题修复就手动更新,比较方便

如果说你不需要锁定版本的需求,可以直接在 .npmrc 添加 package-lock=false 即可,或者在 .gitignore 写入 package-lock.json ,这样的话可以及时获得开发者修复升级的版本,不容易有潜在 bug,但是问题是由于版本出现环境依赖问题,会比较难定位问题,不好解决

注:所以理论上锁版本和不锁版本都没问题,看项目需求

# 解决

按照上面说的,直接把 package-lock.json 上传到源码库即可解决,云服务器就可以正常拉取依赖部署网站。

但是其实上面我提到个问题,同样没有 package-lock.json,为什么云服务器自己部署拉取依赖出错 ,但是 Vercel 可以正常拉取依赖包,也许是 Vercel 有特殊机制,不过这个问题也不重要了

# 参考链接

  • .gitignore 到底要不要写上 package-lock.json - 掘金 (juejin.cn) (opens new window)
  • package-lock.json 需要写进 .gitignore 吗? - 知乎 (zhihu.com) (opens new window)
编辑 (opens new window)
上次更新: 2023/10/14, 10:01:13
Zotero 使用指南
『ARM』和『x86』处理器架构解析指南

← Zotero 使用指南 『ARM』和『x86』处理器架构解析指南→

最近更新
01
百度网盘加速
03-24
02
新版 PyCharm 设置 Conda 虚拟环境
03-24
03
腾讯云域名转到阿里云
03-24
更多文章>
Theme by Vdoing | Copyright © 2023-2024 ReturnTmp | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式