打包时循环依赖(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

相关文章

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。

PHP7扩展开发之依赖其他扩展

前言 有的时候,我们的扩展要依赖其他扩展。比如,我们PHP的mysqli扩展就依赖mysqlnd扩展。这中情况下,我们怎么使用其他扩展呢?这个就是本文讲述的内容。 我们新建立一个扩展,名字叫 demo_dep , 依赖之前的say扩展。 在demo_dep扩展中,我们实现demo_say方法。这个方法调用say扩展的say方法。 代码 基础代码 确保say扩展的头文件正确安装到了php

Go 依赖注入库dig

简介 今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。 快速使用 第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装: $ go g

Android 项目依赖

先上个简单的压压惊: 导入三方项目供自己使用: 由于Google重AndroidStudio  轻 Eclipse ,致使现在很多 开元的项目 都是AndroidStudio 版本了;那么如何把别人的项目导入到AndroidStudio 用于自己使用参考呢? 很简单:下载好别人的项目后 ;首先改下 配置信息; 作为配置参数的参考:首先大家应该有一个自己的在AndroidStudio 上