打包时循环依赖(circular dependency)警告

2023-10-28 20:20

本文主要是介绍打包时循环依赖(circular dependency)警告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我在打包构建我的vue3项目的时候,有这么一个警告信息:

Export “useProjectStore” of module “src/store/modules/user.js” was reexported through module “src/store/index.js” while both modules are dependencies of each other and will end up in different chunks by current Rollup settings. This scenario is not well supported at the moment as it will produce a circular dependency between chunks and will likely lead to broken execution order.

这个警告信息表明在你的项目中存在循环依赖的情况,可能会导致执行顺序混乱或出现错误。具体来说,警告信息指出了 useUserStore 在模块 src/store/modules/user.js 中被重新导出,并且同时被模块 src/store/index.js 依赖,而这两个模块可能会被打包到不同的块(chunks)中。

一般项目的依赖,或者是自己写的组件、函数等等向外界暴露接口或服务的时候,都是作为一个封装模块提供给另外的服务一些基础功能,所以在构建项目的时候一般不会碰到循环依赖的情况。

但是某些时候,就像我的项目中,有两个文件,他们有这么一种关系:一个是 pinia 的状态管理文件,管理着用户相关的状态,并含有初始化函数,在初始化函数中发送了请求;另一个是封装 axios 的请求相关文件,需要根据用户状态在请求的时候有一些不同的行为。这两个文件中都有互相需要的东西,所以他们都 import 了对方。

那么为什么在循环依赖的时候,模块可能会打包到不同的块?
在构建工具(如Rollup、Webpack等)处理循环依赖时,它们会尝试将模块拆分到不同的块(chunks)中以确保正确的执行顺序。

循环依赖的情况下,两个模块相互依赖,构建工具需要确保它们之间的依赖关系被正确处理,以避免在运行时出现错误。

为了解释为什么它们可能会被打包到不同的块,让我们来看一个简单的例子:

假设有两个模块,A 和 B,它们相互依赖:

模块 A:

Copy code
import { somethingFromB } from './B';
// ...

模块 B:

Copy code
import { somethingFromA } from './A';
// ...

如果构建工具将它们放在同一个块中,就可能会导致问题。因为在运行时,模块 A 和 B 会在加载时相互等待,造成死锁或者其他执行错误。

将它们放在不同的块中可以避免这种情况。当然,这也会导致新的问题,比如需要确保在加载时正确地解析它们的依赖关系。

在我的代码中,我是这么解决的:
各个 pinia 都导出到同一个 js 文件(index.js),再通过 index.js 统一暴露各个状态管理入口:

- store- modules- user.js // pinia- ... // 其余的 pinia- index.js // 将 modules 下的所有 pinia 都导入到这里再暴露出去

所有地方导入 pinia 只需要从@/store下导入即可,而封装着 axios 的文件在引入的时候,不能直接通过 index.js 引入,而是需要把路径写完整:@/store/modules/user.js

给大家参考一下,这种对函数、状态的封装可能出现循环依赖,组件倒不是很可能出现这种情况。

这篇关于打包时循环依赖(circular dependency)警告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295723

相关文章

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Spring-DI依赖注入全过程

《Spring-DI依赖注入全过程》SpringDI是核心特性,通过容器管理依赖注入,降低耦合度,实现方式包括组件扫描、构造器/设值/字段注入、自动装配及作用域配置,支持灵活的依赖管理与生命周期控制,... 目录1. 什么是Spring DI?2.Spring如何做的DI3.总结1. 什么是Spring D

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav