npm包的更新说明,你还敢不看吗

npm包的更新说明,你还敢不看吗

前言

平时工作少不了依赖一些第三方的npm包,站在各位大牛的肩膀上来更好的写bug,此外还可以学习各位大佬们的各种设计思路和优雅实现。不过npm包虽好,但使用之前也要多加甄别,特别是相同包的不同版本之间的差别,可能一不小心,原本用的飞起的轮子就会让我们笑不出来。下面用两次惨痛的线上问题来给大家提个醒。

版本依赖符号

在描述问题之前,先谈一下npm的包管理控制。

假设我们依赖一个npm包 a 常见的依赖符号有下面这么几种

{
"dependencies": {
  "a":"5.6.1",
  "a":">=5.6.1",
  "a":">5.6.1",
  "a":"<=5.6.1",
  "a":"<5.6.1",
  "a":"~5.6.1",
  "a":"^5.6.1"
}
}

我们安装的npm包依赖有大概下面这么几种:

  • version 匹配具体版本 例如:a:5.6.1
  • |>=|<|<= version 大于或者小于5.6.1

  • ~version 大致相当于当前版本 即 5.6.X 均可以 5.7.1不可以
  • ^version 兼容版本 兼容的是中间的版本,例如5.7.X不包括 6.X.X

详细区别请查看

根据上面的安装标识,npm会默认去拉去符合规定的最新版本。

当我们执行npm i 时 默认的版本依赖关系是"a":"^5.6.1"

npm i a -s //默认安装的依赖符号是 "a":"^5.6.1"

上面是npm的版本控制规范,有规范也要我们去遵循才可以生效。

开发者版本控制

我们发布npm包的时候,版本标识是package.json中的version

"version": "0.0.1"

一般来说对于测试版本,都是0.X.X的版本(当然也可以有例外,例如react,最高到0.14.X,突然来了个15.X.X)

成熟版本会从1.X.X开始。

如果有bug或者功能更新的时候,可不能随便更新,要根据对使用者的影响程度来进行版本更新。

版本更新策略

从我们团队来说版本更新策略如下:

  • bugfix 原有功能和api无变动

    最后一位小版本更新

  • 功能更新,新增api等,但是老版本依旧可以使用

    中间一位版本更新

  • 不兼容更新,老版本无法使用

    最前面的大版本升级

更复杂一点的可以通过tag来控制不同包具体可以参考https://cnodejs.org/topic/537b47d1cbcc39634983b739来了解

使用者

结合前面提到的,npm 默认的兼容版本安装,成熟npm包来说,更新策略一般都是考虑使用者的。

会进行比较严谨的版本控制,但是我们新项目使用的时候,如果觉得老的包有用,直接npm i 之前可要思量一下,是否进行了打的版本升级。

问题示例

一、query-string 6.x版本不支持低版本

问题描述

上线一个月左右的一个项目,突然接到反馈,某个页面正常渲染之后,无法选中某个某个模块。

问题定位

  • 问题复现

接到反馈之后,立即拿起手边的手机进行复现,心里还说这么明显的问题竟然发生了,赶紧分分钟干掉。

结果发现手边的手机都无法复现这种情况

  • app版本

这时候怀疑是不是app版本问题,试着让用户升级下app。

结果发现依旧存在相同问题

  • 确认问题机型

这时候询问发现机型为oppo,没有仔细去看具体型号。

赶紧拿了个oppo r17测试机,发现依然不存在相关问题。

  • 是否网络问题

因为使用的是公司内网,切换到手机4g,依然无法复现。

  • 操作系统版本

这时候怀疑是旧版本不兼容最新语法,不过我们的js都是经过处理的,应该不会存在,不过还是确认了下用户操作系统,安卓4.6

  • 复现

因为身边手机版本都较高,无法复现,不复现就很难定位。这时候想起来我司有个云真机平台,终于找到了个低版本的oppo,app运行都有点卡的那种。。。上面终于复现了。赶紧去调试,发现点击的时候报错:

Uncaught SyntaxError: Use of const in strict mode.

这下确认是es6没有被转义的问题了

问题解决

不过这里还有点疑问,我们项目本身将src下的源码进行了处理的。如果说没有成功,那么多用到const的地方,应该一开始就报错。这下就让我我有点头疼了。

仔细想了想,可能是第三方npm包没有经过转义处理,不过引了那么多的包,确定还是太难了。webpack打包之后的代码生产环境下是压缩的,简直不能看。

本地打包

还好webpck4提供了不同的mode方式,可以直接使用 --mode development指定打包,这样是没有压缩过的。

对比发现,const出现在query-string相关逻辑中,直接本地打开查看,发现就是其6.X的版本有要求。

?? Want to strengthen your core JavaScript skills and master ES6?

I would personally recommend this awesome ES6 course by Wes Bos.

Also check out his Node.js, React, Sublime courses.

可以从其tag中看到,原本使用的5.x是基于es5的,18年五月份升级了6.x,抛弃了支持es5,要求限制环境。

问题原因

原本使用过该模块用来解析和序列化请求参数,所以新项目就直接安装了该依赖。

安装的时候,如果没有指定版本,npm会默认获取最新版本,所以安装了6.x的版本。

这时候我们没有去查看是否已经有大版本的更新。

但目前大部分新型手机已经支持es6,所以在开发测试和上线的过程中,不会出现该问题。

只有在部分低版本的手机,才会发现。

二、antd upload组件不显示已上传图片

问题描述

同事做的一个项目用到了antd的upload组件,发现测试环境可以显示后端返回的图片,但是线上不可以,因为同事休假,本着团结互助,积极接锅的精神,就拿过来改了。

本地复现

首先拉代码到本地,然后本地测试,依然还是没有问题的。

这样情况,还是对比下环境依赖。因为这里比较明显是upload的问题,所以我们只关注antd就好。

对比测试环境和线上可以看到确实版本有差别:

beta和本地是3.1.4 线上是3.5.4

在本地限定版本之后可以发现问题修复。

问题原因

  1. 代码跟进去可以看到:

    3.5.4版本做了个限制:

//图片后缀名必须为以下其一
 (webp|svg|png|gif|jpg|jpeg|bmp)$/.test(extension)

因为我们返回的缩略图地址没有后缀,所以不会显示。

  1. 我们项目里面的版本依赖的写法是兼容版本写法:

    "antd": "^3.1.4"

    因为3.5.4和3.1.4都是符合要求的。

  2. antd的版本升级策略是说的过去的毕竟不是大改动,正常情况下图片无外乎其中之一,这么小的概略就被我们碰上了。

结束语

吃一堑长一智,所以在使用npm包的时候一定要结合实际情况认真筛选是否适用,对于部分已经使用过的npm包,新项目使用的时候一定要注意是否有大版本变动。

对于问题,首先还是要复现问题,为了更好的复现,最好保证各种版本都一致才能更好的定位。

定位之后就比较好解决了。

原文地址:https://www.cnblogs.com/pqjwyn/p/9690130.html

时间: 2024-10-08 17:41:39

npm包的更新说明,你还敢不看吗的相关文章

npm包的上传npm包的步骤,与更新和下载步骤

官网: ======================================================= 没有账号可以先注册一个,右上角点击"Sign Up",有账号直接点击"Login" 注册与登录账号这些就不详说了,不懂直接重新学习吧!!!!!!!!======================================================= 打开终端:win+r 登录命令:npm login查找用户名命令:npm whoami==

npm学习(四)之如何安装全局包、更新全局安装的包、卸载全局安装的包

如何安装全局包 有两种方式用来安装 npm 包:本地安装和全局安装.选用哪种方式来安装,取决于你如何使用这个包. 如果你想将其作为一个命令行工具,那么你应该将其安装到全局.这种安装方式后可以让你在任何目录下使用这个包.比如 grunt 就应该以这种方式安装. 如果您希望依赖于来自您自己模块的包,那么请在本地安装它.例如,如果您正在使用require语句,您将使用这个选项. 将包安装到全局,你应该使用 npm install -g <package> 命令,例如:npm install -g j

不会发布npm包?进来包会!

前言 本文从发布一个简单的npm包开始,逐步对它进行完(踩)善(坑)和扩(装)展(逼),最后得到一个相对完善的npm包,下面就让我们手摸手,呸!手把手的开始吧! 一.一个最简单的npm包 1.1 新建文件夹 可以找个地方直接建个文件夹,最好语义化一点,这样以后也方便管理,我们这里用终端建文件夹: mkdir toupper-case-project // 这里我们建了一个名为toupper-case-project的文件夹 (对命令行还不太熟的小伙伴可以看看我这篇博客命令行不会?看这里) 1.2

关于npm包,react-lifecycles-compat

看看这包名起的,react生命周期兼容... 一开始我看到这个的时候本以为这是一个可以对react已经废弃的api做一个兼容处理.. 那么是不是就意味着,我们根本就不用做react升级.?????? 后来深入的读了一下官方的ReadMe,,,, 这个包的主要目的是使react的新Api能够在旧版本的react上使用.(0.14.9+). 这就有点烦了,人家根本不是为了让你不用更新react组件才出的这个包,人家是为了让你在更新完之后还能在老的react版本上跑(没错,放心的更新你们的react组

关于 npm 包管理器最常用的内容都在这儿了

Nodejs的诞生,给前端开发世界带来了翻天覆地的变化. 前端工程化,各种工具,以及向后端的能力扩展. 车子离不开轮子,node(前后端)开发离不开npm这个包管理工具,在这总结下常用配套工具: npm nrm nvm npm 安装Nodejs会自带 npm,这个默认的包管理器. 常用的基本命令有 初始化,建立工程(主要体现在生成一个package.json的文件) npm init 安装包 如果是clone一个已有工程,下到本地第一步自然是安装所有的依赖包了. npm install // 简

怎么开发一个npm包

一.注册npm账号* 怎么将代码提到github,大家都知道需要一个github账号* 同样,开发一个npm包,当然也需要一个npm账号,将npm包发布到npm的托管服务器* 注册地址:[http://npmjs.org](http://npmjs.org)* 该实例包含了模块的局部调用和全局调用两种方式 二.开发npm包 1.目录构建* npm init* 项目结构:```javascript.├── bin //命令配置├── README.md //说明文档├── index.js //主

npm包管理工具

# 从官方包仓库中查找forever包的信息 npm search forever # 查看forever包中package.json的信息 npm view forever # 下载,安装forever npm install forever # 全局安装forever npm install -g forever # 查看node.js全局安装路径 npm root -g # 修改node.js的全局包安装路径 npm config set prefix "d:\node" # 查

关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件。更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”。 如果没有安装的: 在系统提示更新的时候注意看一下,如果包含有“更新KB905474”就去掉“更新KB905474”方框前的勾,点击关闭(注意如果没有去掉那个勾得话,会找不到“关闭”,而是“确定”),在不在提示我该消息前打勾。 如果已经安装

关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件.更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”. 如果没有安装的: 在系统提示更新的时候注意看一下,如果包含有“更新KB905474”就去掉“更新KB905474”方框前的勾,点击关闭(注意如果没有去掉那个勾得话,会找不到“关闭”,而是“确定”),在不在提示我该消息前打勾. 如果已经安装的: 1,  搜索“KB 905474”这个文件,删除. 2,  打开注册表,找到 HKEY_LOC

使用cnpm搭建私有NPM仓库 发布npm包

关于如何使用cnpm搭建私有的npm仓库看这里→ http://blog.fens.me/nodejs-cnpm-npm/ 我本人还没有机会真正实践操作过,公司的npm仓库是我老大搭建的,我这里仅仅记录关于如何发布npm包以及在这过程中出现的问题以及解决的方案. 因为官方的npm上的模块是完全开源,但是公司自己项目有些模块与业务或者逻辑以及一些配置模块肯定不能开源啊,所以需要搭建私有的npm仓库. 1.准备工作 首先安装好npm 以及 cnpm . 现在安装node.js 里会一起安装好npm.