2021-10-28 02:00:14
高德JS依赖分析工程通过AST解析、文件地图构建、图结构建模和栈遍历算法,实现了对复杂Bundle化架构中文件级依赖关系的精准管控,确保依赖符合设计规则并支持逆向影响分析。 以下是具体实现步骤与关键原理:
一、使用AST提取依赖路径Import声明:直接提取路径字符串。
函数调用表达式:区分require(直接调用)和require.resolve(属性调用),通过节点类型判断处理。
动态依赖:对变量形式的动态路径进行上下文语义分析,替换常量为字符串,但无法处理Ajax返回等运行时动态路径(通过流程管控限制此类写法)。
扩展名省略:遍历可能的扩展名(如.js、.ts)补充路径后查找。
本Bundle文件引用:直接写文件名时,通过文件地图以O(1)时间复杂度定位相对路径。
公用Bundle引用:使用@${bundleName}/${fileName}格式,通过文件地图解析实际路径。
冗余数据:同一文件被多个文件依赖时,树结构会重复存储节点(如utils.js同时被page.jsx和comp.jsx引用)。
循环依赖:树结构无法处理文件间的循环引用(如A依赖B,B又依赖A),会导致无限递归。
邻接链表:先创建节点(存储文件名和子节点索引),再建立关系(通过索引关联子节点),避免循环引用问题。
序列化优化:为节点添加唯一ID字段,避免数组下标变动导致的数据错乱,提升算法扩展性。
压栈:遍历新节点时将其索引压入栈。
弹栈:返回时移除栈顶索引。
检测环:进入节点前检查索引是否已存在栈中,若存在则回退。
通过上述方法,高德JS依赖分析工程有效解决了Bundle化架构中的复杂依赖问题,为大型项目质量把控提供了关键工具。