首页 > 其他分享 >前端中循环依赖原因分析及解决方案

前端中循环依赖原因分析及解决方案

时间:2023-09-27 15:55:17浏览次数:31  
标签:ES6 依赖 解决方案 前端 js 循环 引用 模块

前端中循环依赖

什么是循环依赖: 两个以上模块之间互相引用,构成闭环依赖。

保持依赖引入的单向流通性!

示例:
不要觉得自己不会写出这样的代码,当项目庞大后一旦出现这样的问题将会造成无法排查的问题。

// 在a.js 引用 b.js 内容
import {b} from "./b.js"
export const a = () => {
  omit...
}
// 在b.js 引用 a.js 内容
import {a} from "./a.js"
export const b = () => {
  omit...
}

1. 为什么循环依赖会造成报错

循环依赖产生之后报错的原因,通常是由模块执行顺序造成的。

1.1 执行顺序

执行的顺序导致的模块先后加载时,出现未定义未初始化的报错。

  • ES6 modules
    在ES6模块中,模块的加载顺序是由它们在代码中的出现顺序决定的。因此,如果两个模块相互引用,那么先出现的模块将先执行。

  • CommonJS
    在CommonJS模块中,模块的加载顺序是由require函数的调用顺序决定的。因此,如果两个模块相互引用,那么先调用require函数的模块将先执行。

1.2 ES6 和 CommonJS 输出的值是和原始值是什么关系?(修改导出的值是否会影响原始值)

CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。 -- 《ECMAScript 6 入门教程》

  • CommonJS 模块确实输出的是一个值的拷贝。当你使用 module.exports 导出一个值时,这个值是被复制的,而不是被引用的。这意味着,如果你导出一个对象,那么对这个对象的修改不会影响到其他模块。

  • ES6模块使用 export 关键字来导出值,并且默认情况下,这些值是被引用的,而不是被复制的。这意味着,如果你导出一个对象,那么对这个对象的修改会影响到其他模块。但是,有一种情况下,ES6模块会创建一个值的拷贝,那就是当你使用 export 导出一个函数或者类的时候。在这种情况下,函数或者类的代码会被复制,但是任何在函数或者类中引用的外部变量仍然会被引用。

2. 项目如何避免循环引用

本质上如何避免循环引用,就是用监测手段 循环引用 并及时切断。

2.1 集成在webpack等脚手架的循环依赖分析

webpack插件名字 circular-dependency-plugin

2.2 集成在EsLint的循环依赖分析

EsLint插件名字 eslint-plugin-import ,eslint 规则 import/no-cycle

2.3 dpdm 开源插件

插件名字 dpdm 使用 dpdm 定位 JavaScript/TypeScript 中的循环依赖

2.4 TS项目类型

使用 import type {} from './xxx' 模块的类型定义,而不导入实际的模块内容。而不加type则会类型和实际值都被导入

标签:ES6,依赖,解决方案,前端,js,循环,引用,模块
From: https://www.cnblogs.com/wanglei1900/p/17732892.html

相关文章

  • 分布式事务解决方案-Seata01
    分布式事务-使用Seata传统数据库事务A-原子性:①事务中的所有操作,要么全部成功,要么全部失败。②影响事务的操作,一般指的是增删改,也就是一个事务中,有多个增删改的SQLC-一致性:①事务开始前到事务结束后,数据状态需要一致②例如:转账增减金额和支付减去金额+修改订单状态、减库存I-......
  • 揭秘前端滑块验证技术
    大家好,今天我们聊一下现代应用中常见的一种交互验证方式:滑块验证。滑块验证也被称为拼图验证码,是一种用于验证用户是否为人类而不是机器人的常见方法。用户需要完成验证后才能继续往下操作,而机器人通常很难模拟这种人类行为。也因为这样,滑块验证已经成为了网站注册、登录、商品防......
  • 视频融合平台EasyCVR如何使用视频监控系统搭建电商货物可视化追溯解决方案
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 2023年的前端开发框架
    前端开发的框架生态主要包含的工具有:脚手架/构建工具vite服务器端渲染框架next.jsGatsby.jsDocusaurus静态文档跨平台开发框架RNFLutter状态管理Reduxzustandjotairecoil路由ReactRouterReactHooks一系列hook的组合,比如useState,useCallbac......
  • Vue 3.0开发的开源前端项目
    文章来源:https://zhuanlan.zhihu.com/p/587627578 1,PPTistPPTist是一个基于Vue3.x+TypeScript+Pinia+AntDesignVue+Canvas开发的在线演示文稿(幻灯片)应用,还原了大部分OfficePowerPoint的功能,支持文字、图片、形状、线条、图表、表格、视频、音频、公式几种最常......
  • 12-web前端轮播图案例 (小米商城)
    说明:轮播图在前端开发中是一种常见的元素,通常用于展示一系列的图片或者内容,并通过滑动或者点击的方式进行切换。使用JavaScript来实现轮播图有以下几个意义:提升用户体验:轮播图可以在有限的空间内展示更多的内容,为用户提供更多的信息。同时,轮播图也具有较好的视觉效果,可以吸引用......
  • ScanPay - 开源加密货币支付解决方案
    在加密货币领域的不断发展和演变中,ScanPay(GitHub链接:https://github.com/BlockATMOnLine/ScanPay )已经崭露头角,成为商户们的首选支付解决方案。ScanPay是一款开源免费的支付解决方案,为商户提供包括USDT-TRC20、USDT-ERC20等各类加密货币代收代付功能,适应了这一不断变化的数字货......
  • 整洁架构在前端的设计思想与应用实践
    随着业务的发展,前端项目承载了越来越多的职责,也越来越复杂,简单通过cli生成的框架结构越来越无法满足。面对前端项目复杂度的不断提升,我们开始思考前端的架构组织方式怎么才更合理?应该如何设计良好的前端架构?行业是否有比较好的优秀实践?本文先从架构基本概念开始介绍,然后介......
  • ThingsBoard 前端项目背景图片部件开发
    前言ThingsBoard是目前Github上最流行的开源物联网平台(14.4kStar),可以实现物联网项目的快速开发、管理和扩展,是中小微企业物联网平台的不二之选。本文介绍如何在ThingsBoard前端项目中开发背景图片部件。产品需求最近接到产品经理一个需求,在TB仪表板中部件的下面可......
  • 处理日期格式问题:JSON.stringify 导致日期少一天的解决方案
    在前端开发中,经常需要处理日期数据。然而,由于JavaScript日期的表示方式以及JSON格式化日期的一些特性,可能会导致日期数据在传输或存储过程中出现问题。一个常见的问题是使用JSON.stringify对日期进行序列化时,导致日期少一天。在这篇文章中,我们将探讨这个问题,并提供解决方案。......