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的版本有要求。

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

  1. 如何发布一个包到npm && 如何使用自己发布的npm包 && 如何更新发布到npm的package && 如何更新当前项目的包?

    如何发布一个包到npm First 在https://www.npmjs.com注册一个账号. Second 编辑好项目,文件大致如下: 其中,gitignore可以如下: .DS_Store nod ...

  2. 如何开发一个npm包并发布到npm中央仓库

    转自: https://liaolongdong.com/2019/01/24/publish-public-npm.html 如何开发一个npm包并发布到npm中央仓库需求背景:平时在项目工作中可能 ...

  3. 从0到1发布一个npm包

    从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...

  4. 自定义npm包的创建、发布、更新和撤销

    大纲 1.准备2.自定义npm包3.发布自定义npm包4.引用npm包5.更新npm包6.撤销发布的npm包 简书原文 https://www.jianshu.com/p/d737bc5df5b7 1 ...

  5. 记一次发布/更新npm包的过程及包版本管理

    您可以发布包含package.json文件的任何目录.这里如何首次发布程序包以及如何在以后更新程序包. 如何发布包 制备 了解npm政策 在开始之前,如果您对网站礼仪,命名,许可或其他指南有疑问,最好 ...

  6. npm安裝、卸載、刪除、撤銷發佈包、更新版本信息

    利用npm安裝包: 全局安裝:npm install -g 模塊安裝 局部安裝(可以使用repuire(‘模塊名’)引用):npm install 模塊名稱 如果權限不夠,就是用管理員方式安裝. 本地 ...

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

    官网: ======================================================= 没有账号可以先注册一个,右上角点击“Sign Up",有账号直接点击“ ...

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

    如何安装全局包 有两种方式用来安装 npm 包:本地安装和全局安装.选用哪种方式来安装,取决于你如何使用这个包. 如果你想将其作为一个命令行工具,那么你应该将其安装到全局.这种安装方式后可以让你在任何 ...

  9. npm学习(三)之如何安装本地包、更新本地安装的包、卸载本地安装的包

    如何安装本地包 有两种方式用来安装 npm 包:本地安装和全局安装.至于选择哪种方式来安装,取决于我们如何使用这个包. 如果你自己的模块依赖于某个包,并通过 Node.js 的 require 加载, ...

随机推荐

  1. Spring源码学习资料

    未完待续.. github地址 https://github.com/spring-projects 学习地址 https://github.com/code4craft/tiny-spring 推荐 ...

  2. dp之免费馅饼

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. 上传程序Dictionary 字典 哈希--多读一写锁ReaderWriterLock

    //上传程序Dictionary 字典 哈希 /// <summary> /// 车辆控制信息哈斯表,Key是终端号,Value是车辆信息控制对象 /// </summary> ...

  4. 【TensorFlow】tf.nn.softmax_cross_entropy_with_logits的用法

    在计算loss的时候,最常见的一句话就是 tf.nn.softmax_cross_entropy_with_logits ,那么它到底是怎么做的呢? 首先明确一点,loss是代价值,也就是我们要最小化 ...

  5. 【CXF】com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Faul

    在客户端生成代码之后测试出现错误: com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Faul ...

  6. 【C++】解决vs2015经常卡顿的办法

    VS2015经常性的卡顿,参考了zhihu里问答的办法,编译和使用的时候的确快多了 为什么vs2015经常卡顿? https://www.zhihu.com/question/34911426 感谢z ...

  7. 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    [转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...

  8. Windows域帐户

    域的直观优点: 1.域帐户可以在任意一台已经加入域的电脑上登录. 2.将域用户组加入到SQL Server登录里,域用户组内所有人员便都可以使用域用户登录数据库,继承相关权限. 3.域用户登录Team ...

  9. Python3学习笔记17-类与实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类 而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  10. 《TCP/IP 详解 卷1:协议》第 3 章:链路层

    在体系结构中,我们知道:链路层(或数据链路层)包含为共享相同介质的邻居建立连接的协议和方法,同时,设计链路层的目的是为 IP 模块发送和接受 IP 数据报,链路层可用于携带支持 IP 的辅助性协议,例 ...