因为使用peerDependencies而引发的bug

简介: 因为使用peerDependencies而引发的bug

前言


前几天有个人跟我反馈说,她fork了我右键菜单那个开源项目,一直无法打包成功。我寻思着应该不可能吧,当我尝试打包时,果然翻车了🤡。


经过了一番调试后,终于找到了问题所在,本文就跟大家分享下这个问题从发现到解决的整个过程,欢迎各位感兴趣的开发者阅读本文。


排查问题


因为我电脑重装过几次系统,一些放在github上的项目我就没有备份,我把项目(https://github.com/likaia/vue-right-click-menu-next/)重新clone到本地,安装依赖项后运行了build命令,意想不到的事情发生了:它报错了😿


ERROR  Failed to compile with 4 errors                                                                                                                                                                        11:02:26 AM
error  in ./src/components/right-menu.vue
Module parse failed: Unexpected token (1:0)
File was processed with these loaders:
 * ./node_modules/eslint-loader/index.js
You may need an additional loader to handle the result of these loaders.


640.png

                               image-20210912110303981


上述报错的意思是找不到处理vue文件的相关loader,我就纳闷了,这不可能啊,几个月前插件写好时还能打包的,现在咋就突然不能打包了呢。


可能是node版本的问题


难道是我node版本的问题?插件写好到现在代码一直没动过,唯一变化的就是我升级了node版本,降级node版本太麻烦,于是我安装了node版本管理工具n。


因为我的系统是macos,我可以直接用brew来安装它,命令如下:


brew install n


如果你是windows系统,你可以通过npm包的形式来安装它,命令如下:


npm install -g n


安装完成后,我去找了下我写这个项目时所发布的node版本v14.14.0,我们用n工具来安装并切换它:


n 14.14.0


我们运行node --version命令看下是否成功。


640.png

                             image-20210912112948408


一切准备就绪,我寻思着应该不会出现问题了吧😼,结果运行后,我傻眼了,仍然报着同样的错误🤧


640.png

                                   image-20210912110303981


node版本管理工具有挺多的,除了文中说的n还有nvm、npx,感兴趣的开发者可自行了解。


发现猫腻(yarn.lock)


当我一筹莫展发呆时,突然发现目录树中的yarn.lock变色了,看来是有改动了,我寻思着不可能啊,我没动package.json中的依赖项啊,怎么会发生变化呢?


640.png

                                 image-20210912115021573


重新创建个项目试试


既然lock文件发生了变化,那我重新创建个项目试试,把相关依赖项拷过去再打包看看。


我们继续使用Vue CLI作为插件搭建环境,对此不熟悉的开发者请移步我的另一篇文章:使用CLI开发一个Vue3的npm库


vue create test-vue3-project


项目创建完成后,我把相关文件拷贝了过去,修改了package.json中的build命令。


{
  "build": "vue-cli-service build --target lib --name vueRightMenuPlugin src/main.ts"
}


运行命令后,它居然打包成功了🌝


640.png

                                      image-20210912120532953


找到问题


经过前面的一番折腾,创建了一个新的项目他就好了,那我比对下这俩项目有啥不同之处,那么问题就迎刃而解了。


经过比对后,我发现了package.json中的不同之处:


"dependencies": {
    "core-js": "^3.6.5",
    "vue": "^3.0.0"
  }
"peerDependencies": {
    "core-js": "^3.6.5",
    "vue": "^3.0.0"
  }


区别就在于,vue和core-js这两个包的位置,问题应该就出在这里了。


我们来验证下吧,将dependencies中的那两个包放到peerDependencies中,重新install下,再build看下。


不出意料,果然报错了。


640.png

                             image-20210912131448829


那么为啥我的项目之前能跑,现在却没法跑了,我想应该是因为之前改了后,我没有重新install的缘故吧🌝。


解决问题


那么,既然找到问题了,我们反过来,把右键菜单的peerDependencies下的两个包放到dependencies下,再看看问题能否得到解决。


当我满怀信心的执行build命令后,结局却让我很失望。


是的,他换了个错误🌚


640.png

                               image-20210912132222990


看报错是类型无法自动推导,这就很怪异了。那么就只能尝试下我的三板斧了:


  • 重启软件
  • 重启电脑
  • 删除项目,重新clone,重新install依赖


前两个尝试过后,发现并无卵用,只好用了最后一个方法。


重新install后,执行了build命令,成功解决了这个问题。


640.png

                                      image-20210912132919200


为什么呢


问题是解决了,那么为什么要那样做呢?接下来就带大家深入研究下dependencies和peerDependencies。


dependencies


dependencies是package.json中的一个属性,里面放运行代码时所需的依赖,在install时这些包会被安装,打包项目时,这里面的包也会被打包进去。


peerDependencies


peerDependencies也是package.json中的一个属性,这个单词翻译过来是对等依赖的意思,这里面的包在install时并不会安装,打包项目时,这里面的包也不会被打包进去。


两者存在的问题


如果将依赖包放在dependencies下,那么当别人在他的项目中引入你的插件时,会出现下述情况:


  • 他项目里没有引入你所需的依赖包,那么你插件所依赖的包会被安装
  • 他项目里引入了你所需的依赖包:
  • 版本号一致,那么你所需的依赖包不会被安装,插件将共用项目里的依赖包
  • 版本号不一致,那么你所需的依赖包就会被安装,项目里就存在了两套不同版本的依赖


版本号一致那还好,万事大吉。版本号不一致时,你插件所依赖的那个包需要的功能与调用者项目里安装的那个版本的包并无区别,那么调用者的项目将变得臃肿起来,又多安装了一份依赖。


如果将依赖包放在peerDependencies下,对插件开发者是不友好的,会出现下述问题:


  • install的时候,所需的依赖不会安装,使用ide开发时会报错找不到相关依赖。

image-20210912140550142

  • build的时候,因为依赖未安装,导致无法打包(文章开头提到的报错)

这么看的话,peerDependencies这个属性,好像没啥用了。当然存在即合理,如果大家有什么更好的看法,欢迎在评论区留言讨论。


解决方案


知道他们各自的优点和缺点后,我也就知道了如何解决这个问题。


既然dependencies中的依赖包只要和调用者的版本号一致,就不需要重新安装依赖,那我们把它的版本号放开,给个范围,这样不就可以了😁


在package.json中的版本号可以带下述符号:


  • ~波浪号,匹配最新补丁版本号,即版本号的第三个数字,例如~3.0.0就会匹配3.0.x版本,将在3.1.0停止
  • ^插入符号,匹配次要的版本号,即版本号的第二个数字,例如^3.0.0就会匹配任何3.x.x版本,将在4.0.0停止
  • >、<、>=、<=比较运算符,匹配的就是这个区间的版本,例如>3.0.0 <= 3.1.4,就会匹配这个区间的版本号


如果不带符号,那么它就是精确匹配。


本文中,用的是^3.0.0,满足了我们插件的使用场景,因此不需要更改。


写在最后


至此,文章就分享完毕了。


我是神奇的程序员,一位前端开发工程师。


  如果本文帮到了你,那就点个“在看”吧。

相关文章
|
存储 Cloud Native Linux
C++ QT 实时进行网络监测
C++ QT 实时进行网络监测
|
JavaScript 前端开发
Vue3解析markdown解析并实现代码高亮显示
Vue实现博客前端,需要实现markdown的解析,如果有代码则需要实现代码的高亮。 Vue的markdown解析库有很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等。这些库都大同小异。这里选用的是marked,代码高亮的库选用的是highlight.js。
2178 0
Vue3解析markdown解析并实现代码高亮显示
|
11月前
|
存储 人工智能 自然语言处理
构建AI智能体:二十三、RAG超越语义搜索:如何用Rerank模型实现检索精度的大幅提升
本文介绍了重排序(Rerank)技术在检索增强生成(RAG)系统中的应用。Rerank作为初始检索和最终生成之间的关键环节,通过交叉编码器对初步检索结果进行精细化排序,筛选出最相关的少量文档提供给大语言模型。相比Embedding模型,Rerank能更精准理解查询-文档的语义关系,显著提高答案质量,降低Token消耗。文章详细比较了BGE-Rerank和CohereRerank等主流模型,并通过代码示例展示了Rerank在解决歧义查询(如区分苹果公司和水果)上的优势。
2445 5
|
8月前
|
Java 应用服务中间件 开发者
Spring Boot 4.0官宣: 弃用 Undertow:Tomcat笑麻了
Spring Boot 4.0.0 M2 正式移除 Undertow 内嵌支持,主因是其未适配 Servlet 6.1 规范,而 Spring Boot 4 强制依赖该规范。本文解析技术动因、迁移影响及平滑过渡方案(推荐切回 Tomcat 或改用 Jetty),助力开发者顺利升级。(239字)
1507 1
Spring Boot 4.0官宣: 弃用 Undertow:Tomcat笑麻了
|
8月前
|
安全 Java API
SpringBoot 4 黑科技:接口组 ——10 行代码管理 100+ API 客户端
Spring 7 新增「HTTP接口组」特性,告别重复`@Bean`声明与手动配置。通过`@ImportHttpServices`按业务分组(如github、stackoverflow),支持统一超时、Token、baseUrl等配置,Java代码+YAML双驱动,大幅降低配置冗余,提升可维护性与开发效率。(239字)
587 3
|
8月前
|
XML IDE Java
Spring Boot 4 王炸新特性:Bean 注册新姿势 BeanRegistrar,少写一半代码
Spring Boot 4 正式推出 `BeanRegistrar`——动态注册 Bean 的终极解法!告别冗长 `@Bean` + `@Conditional` 套娃,12 行代码精准按配置注册(如 Email/SMS),启动仅加载所需 Bean,性能提升、可读性飙升。从“声明”迈向“编程式容器”,减负不止 50%。
560 2
|
存储 前端开发 JavaScript
Web前端主题色更换实现方式全解析(一)
Web前端主题色更换实现方式全解析(一)
733 1
|
JavaScript 数据可视化 Docker
简易制作MCP服务器并测试
本文介绍了如何简易制作并测试MCP服务器,包括环境搭建、代码实现及Docker部署。首先通过uv包创建项目,在main.py中定义MCP服务器及其工具和资源函数。接着详细说明了在Windows上安装uv、配置Docker镜像加速、生成requirements.txt文件以及编写Dockerfile的过程。最后,通过构建和运行Docker容器部署MCP服务器,并使用Node.js工具测试其功能,确保服务器正常工作。此教程适合初学者快速上手MCP服务器的开发与部署。
5207 63
|
决策智能 数据库 开发者
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
本项目旨在解决智能体的“超级入口”问题,通过开发基于意图识别的多智能体框架,实现用户通过单一交互入口使用所有智能体。项目依托阿里开源的Qwen2.5大模型,利用其强大的FunctionCall能力,精准识别用户意图并调用相应智能体。 核心功能包括: - 意图识别:基于Qwen2.5的大模型方法调用能力,准确识别用户意图。 - 业务调用中心:解耦框架与业务逻辑,集中处理业务方法调用,提升系统灵活性。 - 会话管理:支持连续对话,保存用户会话历史,确保上下文连贯性。 - 流式返回:支持打字机效果的流式返回,增强用户体验。 感谢Qwen2.5系列大模型的支持,使项目得以顺利实施。
5366 8
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案

热门文章

最新文章