node应用线上部署时锁定包的依赖版本

简介:

npm shrinkwrap

我们使用node开发时,经常需要依赖一些模块来完成功能需求,而我们所依赖的模块也必然会依赖其他模块,就这样一级一级的依赖,而且这些依赖模块并不为我们所控制。一个产品或项目的开发周期,少则几个周,多则几个月几年。开发人员往往在一开始时下载了依赖包发现能够正常工作后,便一直在依赖包的当前版本上工作,然而在线上服务器布属时往往是根据依赖配置文件,重新下载依赖包。可这个时候依赖链中的包的开发者很可能已经将某个模块升级了,而且并不能保证这些新的依赖包没有bug。一旦依赖链上的某个包出现bug,可能对产品造成严重影响,而且这个时候往往无法找回开发时所用的正确依赖,以及依赖的依赖的版本。
我们来看一个经典的例子:
假设有包A依赖包B,包B依赖包C:

//包A
{
  "name": "A",
  "version": "0.1.0",
  "dependencies": {
    "B": "<0.1.0"
  }
}
//包B
{
  "name": "B",
  "version": "0.0.1",
  "dependencies": {
    "C": "<0.1.0"
  }
}
//包C
{
  "name": "C",
  "version": "0.0.1"
}

假设在开发时,我们运行npm install A得到以下的依赖链:

A@0.1.0
`-- B@0.0.1
    `-- C@0.0.1

而在项目需要部署上线时,我们不可能把所有node_modules放到线上服务器中,所以将项目代码放到服务器时,我们便会运行npm install A,而恰恰这阶段,包B的版本更新到了0.0.8,所以我们在服务器上得到的依赖链就是:

A@0.1.0
`-- B@0.0.8
    `-- C@0.0.1

如果B的新版本有问题,这时就会对产品造成难以预估的损失。
所以我们推荐当开发环境中,所有依赖模块都能正常工作时,便在部署到服务器之前将依赖包的版本锁住,这时候就运行这个命令:

npm shrinkwrap

我们会得到一个npm-shrinkwrap.json的文件,这个文件保存了所有当前使用的依赖模块的版本:

{
  "name": "A",
  "version": "0.1.0",
  "dependencies": {
    "B": {
      "version": "0.0.1",
      "from": "B@^0.0.1",
      "resolved": "https://registry.npmjs.org/B/-/B-0.0.1.tgz",
      "dependencies": {
        "C": {
          "version": "0.0.1",
          "from": "org/C#v0.0.1",
          "resolved": "git://github.com/org/C.git#5c380ae319fc4efe9e7f2d9c78b0faa588fd99b4"
        }
      }
    }
  }
}

将这个文件连同项目源码一同部署到服务器上,然后运行npm install这时候,npm会首先检查有没有npm-shrinkwrap.json文件,有的话会根据该文件中依赖包的版本以及resolve字段下载依赖包,这样就能够保证线上环境与开发环境一致。

from 与 resolve

这个文件时根据我们当前项目中的node_modules中的模块的当前版本生成的。version代表当前模块版本,from表示的是package.json中对该依赖模块的版本描述,resolve代表当前模块的实际来源。
比如当你的package.json中对于某个依赖模块有如下描述:

"dependencies": {
    "acorn": "^3.0.0",
....................................
  }

acorn模块安装后,它的package.json文件中会出现如下字段:

  "_from": "acorn@>=3.0.0 <4.0.0",
  "_resolved": "https://registry.npmjs.org/acorn/-/acorn-3.2.0.tgz",

这时候运行npm shrinkwrap便会出现:

  "dependencies": {
    "acorn": {
      "version": "3.2.0",
      "from": "acorn@>=3.0.0 <4.0.0",
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.2.0.tgz"
    },

对于npm-shrinkwrap.json来说,这其中最重要的就是resolve字段。

使用npm shrinkwrap的注意事项

  • 如果要安装新的依赖模块,一定要使用npm install --save 模块,这样保证package.json与npm-shrinkwrap.json文件同步更新。
  • node_modules中的模块必须能够包含package.json中的依赖模块,如果node_modules中不存在package.json中指定的依赖模块,运行npm shrinkwrap会报错;如果node_modules中包含有package.json中未指定的模块,根据官方说法是也会报错,但根据我的实验(windows7系统)并没有报错,npm-shrinkwrap.json会包含所有在node_modules中的模块。
  • npm-shrinkwrap.json中并不会包含devDependencies字段中的模块。

参考文章:

npm-shrinkwrap-Lock down dependency versions

目录
相关文章
|
14天前
|
JavaScript 开发者
深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第57天】本文将带你走进Node.js的事件循环机制,通过浅显易懂的语言和实例代码,揭示其背后的工作原理。我们将一起探索如何高效利用事件循环进行异步编程,提升后端应用的性能和响应速度。无论你是Node.js新手还是有一定经验的开发者,这篇文章都能给你带来新的启发和思考。
|
17天前
|
JavaScript 应用服务中间件 Linux
宝塔面板部署Vue项目、服务端Node___配置域名
本文介绍了如何使用宝塔面板在阿里云服务器上部署Vue项目和Node服务端项目,并配置域名。文章详细解释了安装宝塔面板、上传项目文件、使用pm2启动Node项目、Vue项目打包上传、以及通过Nginx配置域名和反向代理的步骤。
55 0
宝塔面板部署Vue项目、服务端Node___配置域名
|
25天前
|
JavaScript Linux 开发者
一个用于管理多个 Node.js 版本的安装和切换开源工具
【9月更文挑战第14天】nvm(Node Version Manager)是一个开源工具,用于便捷地管理多个 Node.js 版本。其特点包括:版本安装便捷,支持 LTS 和最新版本;版本切换简单,不影响开发流程;多平台支持,包括 Windows、macOS 和 Linux;社区活跃,持续更新。通过 nvm,开发者可以轻松安装、切换和管理不同项目的 Node.js 版本,提高开发效率。
|
2天前
|
JavaScript 算法 内存技术
如何降低node.js版本(nvm下载安装与使用)
如何降低node.js版本(nvm下载安装与使用)
|
28天前
|
缓存 资源调度
解决node升级到18版本node-sass安装问题
解决node升级到18版本node-sass安装问题
|
1月前
|
JavaScript API 数据库
深入理解Node.js事件循环及其在后端开发中的应用
【9月更文挑战第3天】本文将深入浅出地介绍Node.js的事件循环机制,探讨其非阻塞I/O模型和如何在后端开发中利用这一特性来处理高并发请求。通过实际的代码示例,我们将看到如何有效地使用异步操作来优化应用性能。文章旨在为读者揭示Node.js在后端开发中的核心优势和应用场景,帮助开发者更好地理解和运用事件循环来构建高性能的后端服务。
|
14天前
|
JavaScript Linux 开发工具
如何将nodejs项目程序部署到阿里云服务器上
该文章详细描述了将Node.js项目部署到阿里云服务器的步骤,包括服务器环境配置、项目上传及使用PM2进行服务管理的过程。
|
1月前
|
JavaScript 前端开发 Windows
NodeJS的环境部署
介绍如何在Windows操作系统上安装Node.js环境,包括下载长期支持版本的Node.js、安装程序、编写测试代码并执行,以及如何在WebStorm集成开发环境中配置和运行Node.js。
37 1
|
2月前
|
JavaScript 开发者
深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第31天】 本文将带你走进Node.js的事件循环机制,通过浅显易懂的语言和实例代码,揭示其背后的工作原理。我们将一起探索如何高效利用事件循环进行异步编程,提升后端应用的性能和响应速度。无论你是Node.js新手还是有一定经验的开发者,这篇文章都能给你带来新的启发和思考。
|
Web App开发 弹性计算 JavaScript
部署Node.js环境
本教程介绍如何在安装了CentOS 7.2系统的ECS实例上,安装Node.js并部署项目。
1006 0