@morjs/utils
Version:
mor utils
176 lines (175 loc) • 5.84 kB
TypeScript
declare type FilePathCallBack = (filePath: string) => void;
/**
* 小程序主包所代表的分组名称, 这里以 空字符串 作为名称
*/
export declare const MAIN_GROUP_NAME = "";
/**
* 根模块名称, 即 root
*/
export declare const ROOT_MODULE_NAME = "root";
/**
* ModuleItem 的 JSON 序列化类型
*/
declare type ModuleJSON = {
filePath: string;
dependencies: string[];
groups: string[];
};
/**
* 模块 分组信息
* 主要用于分包,一个分包对应一个组
*/
export declare class ModuleGroup {
name: string;
modules: Set<ModuleItem>;
constructor(name: string);
addModule(module: ModuleItem): void;
removeModule(module: ModuleItem): void;
hasModule(module: ModuleItem): boolean;
}
/**
* 一个文件是一个 module
* 以 文件的全路径作为 module 标识
*/
export declare class ModuleItem {
filePath: string;
groups: Set<ModuleGroup>;
dependencies: Set<ModuleItem>;
parents: Set<ModuleItem>;
moduleGraph: ModuleGraph;
isRemoved: boolean;
constructor(filePath: string, moduleGraph: ModuleGraph);
linkGroup(group: ModuleGroup): void;
clearAndLinkGroup(group: ModuleGroup): void;
clearGroups(): void;
unlinkGroup(group: ModuleGroup): void;
addDependency(dependency: ModuleItem): void;
addParent(parent: ModuleItem): void;
removeDependency(dependency: ModuleItem, mutual?: boolean): void;
removeParent(parent: ModuleItem, mutual?: boolean): void;
remove(): void;
getAllDependentFiles(files: Set<string>, callback?: FilePathCallBack): void;
}
/**
* 模块依赖图
*
* 主要用于 Entry 构建的依赖关系建立和动态分组
*
* 包含:
* - 一个 mainGroup: 无法被删除, 一般指代 小程序主包
* - 一个 rootModule: 无法被删除, 用于形成带顶端的树状结构, 可减少循环次数及明确父类归属
* - N 个普通 Module: 随 Entry 分析及文件变化动态删减
* - N 个普通 Group: 主要用于 各个分包
* - N 个 无效的 Module: 用于标记被变更或被删除的模块
*
* 其中:
* - 每个 Module 中包含 文件地址、依赖信息、被依赖信息 及 分组信息
* - 每个 Group 中包含 名称以及相关的模块
*/
export declare class ModuleGraph {
mainGroup: ModuleGroup;
private rootModule;
groups: Map<ModuleGroup['name'], ModuleGroup>;
private modules;
private invalidModules;
private prevFiles?;
constructor();
/**
* 判断是否是 rootModule
* @param module - 模块
*/
isRootModule(module: ModuleItem): boolean;
/**
* 判断是否为 主 group
*/
isMainGroup(group: ModuleGroup): boolean;
/**
* 返回当前文件所在组
* 1. 如果文件出现在多个组中,则返回 mainGroup
* 2. 如果文件未出现在任何组中, 则返回 mainGroup
* 3. 其他情况直接返回文件所在组
* @param filePath - 文件地址
*/
getGroup(filePath: string): ModuleGroup;
/**
* 标记文件及其依赖无效
* 原因:
* 1. 当一个文件被改变,那么现有的依赖则不确定依然存在, 会同时被标记为 invalid
* 2. 并且 其 父级别模块对该文件的依赖也存在不确定性, 需要同时标记为 invalid
* 并在当前修改或删除文件被重新解析的过程中,逐步确立并恢复依赖关系
* @param filePath - 文件路径
*/
invalidate(filePath: string): void;
/**
* 是否为无效文件
* @param filePath - 文件路径
*/
isInvalid(filePath: string): boolean;
/**
* 清理无效的模块
* 清理无效的模块会同时清理这个模块中的所有依赖关系、分组信息
* 且 当一个模块在清理依赖关系的过程中出现了不被任何其他模块依赖的情况时, 会删除该模块
* 以此循环往复,直到所有模块被清理完成
*/
clearAllInvalidModules(): void;
/**
* 获取依赖图中所有的文件
* @param callback - 回调函数, 接收 文件路径 作为参数
*/
getAllFiles(callback?: FilePathCallBack): Set<string>;
/**
* 获取 diff 文件变更
* 接收 onAdd 和 onDelete 两个回调函数
* 返回 addedFiles 和 deletedFiles 文件清单
*/
getDiffFiles({ onAdd, onDelete }: {
onAdd?: FilePathCallBack;
onDelete?: FilePathCallBack;
}): {
addedFiles: Set<string>;
deletedFiles: Set<string>;
};
/**
* 在依赖图中添加依赖
* 当没有 父 模块文件路径时 会以 rootModule 作为父模块
* @param parentPath - 父 模块文件路径
* @param dependencyPath - 子 模块文件路径
* @param groupName - 文件所在组
*/
addDependencyFor(parentPath: string | undefined, dependencyPath: string, groupName?: string): ModuleGroup;
/**
* 创建或获取已有模块并将模块标记为正常
* @param filePath 文件地址
*/
createOrFetchModule(filePath: string): ModuleItem;
createGroup(name: string): ModuleGroup;
/**
* 获取文件路径对应的 module
* @param filePath 文件路径
*/
getModuleByFilePath(filePath: string): ModuleItem;
/**
* 通过文件路径删除关联的 module
* @param filePath 文件路径
*/
removeModuleByFilePath(filePath: string): void;
/**
* 删除模块
* @param module 模块
*/
removeModule(module: ModuleItem): void;
/**
* 将 moduleGraph 序列化
*/
toJSON(): ModuleJSON[];
private connectParentAndChild;
/**
* 从序列化中恢复
*/
static restore(modules: ModuleJSON[]): ModuleGraph;
/**
* 重置整个依赖图
*/
reset(): void;
}
export {};