一、概述
- 是什么:
- @vue/compiler-core是vue3里的一个核心模块
- 干什么:
- 负责处理模板编译的核心逻辑,将模板编译成渲染函数
- 模块目录结构:
- package.json:
- 包含模块的相关信息
- index.js:
- 模块的入口文件
- _tests_文件夹:
- 包含模块的单元测试代码,用于确保模块的正确性
- src文件夹:(核心)
- 包含模块源代码
- ast.ts
- 包含与抽象语法树(AST)相关的类型和工具函数
- AST用于在编译过程中表示模板的抽象结构
- 包含与抽象语法树(AST)相关的类型和工具函数
- babelUtils.ts - 提供了与Babel相关的实用工具,用于在编译过程中与Babel进行交互
- codegen.ts - 包含用于将AST节点生成JS代码的逻辑
- compile.ts
- 包含编译器的主要逻辑,负责将模板转换为渲染函数
- errors.ts
- 定义了在编译过程中可能抛出的错误类型
- index.ts
- 模块的主入口文件,导出了模块的公共接口
- options.ts
- 包含与编译选项相关的类型和逻辑,允许用户配置编译过程的行为
- parse.ts
- 包含解析器的逻辑,负责将模板解析为 AST
- runtimeHelpers.ts
- 提供了运行时辅助函数,被生成的渲染函数调用以实现模板的正确执行
- transform.ts
- 包含了与AST变换相关的逻辑,允许开发者在编译过程中对AST进行自定义的转换
- utils.ts
- 提供了各种工具函数,用于在编译过程中处理不同的逻辑
- validateExpression.ts
- 包含了验证表达式的逻辑,确保它们符合语法规范
- ast.ts
- 包含模块源代码
- package.json:
一、文件重要部分
- ast.ts:
- 创建、处理虚拟节点:
- 虚拟节点:
- 用于表示模板中的元素或组件,并在渲染过程中构建实际的DOM元素或组件实例
- 相关函数实现:
- createVNodeCall()
- getVNodeHelper()
- getVNodeBlockHelper()
- 虚拟节点:
- createVNodeCall():创建虚拟节点的函数
export function createVNodeCall( context: TransformContext | null,//获取有关编译环境的信息 tag: VNodeCall['tag'],//表示要创建的元素或组件的类型 props?: VNodeCall['props'],//表示VNode的属性 children?: VNodeCall['children'],//表示VNode的子节点 //表示VNode的patch标志,用于标识如何更新VNode patchFlag?: VNodeCall['patchFlag'], //表示动态属性的列表,用于表示哪些属性是动态的 dynamicProps?: VNodeCall['dynamicProps'], //表示指令的列表,用于表示在元素上应用的指令 directives?: VNodeCall['directives'], isBlock: VNodeCall['isBlock'] = false,//表示是否将VNode包装为块级别的节点 //表示是否禁用节点的跟踪 disableTracking: VNodeCall['disableTracking'] = false, //表示是否创建一个组件类型的 VNode isComponent: VNodeCall['isComponent'] = false, loc = locStub//表示节点的位置信息 ): VNodeCall { //首先检查是否传递了上下文对象 if (context) { //如果有传递: //则使用上下文中的信息生成一些 帮助函数(用于处理VNode的创建) if (isBlock) { context.helper(OPEN_BLOCK) context.helper(getVNodeBlockHelper(context.inSSR, isComponent)) } else { context.helper(getVNodeHelper(context.inSSR, isComponent)) } if (directives) { context.helper(WITH_DIRECTIVES) } } //返回一个表示VNode的对象 return { type: NodeTypes.VNODE_CALL, tag, props, children, patchFlag, dynamicProps, directives, isBlock, disableTracking, isComponent, loc } }- getVNodeHelper():创建虚拟节点的帮助函数
export function getVNodeHelper(ssr: boolean, isComponent: boolean) { //ssr:表示是否在服务器端渲染(SSR)模式下 //isComponent:表示是否创建一个组件类型的VNode return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE }- getVNodeBlcokHelper():创建虚拟节点的帮助函数
export function getVNodeBlockHelper(ssr: boolean, isComponent: boolean) { return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK } - 创建、处理虚拟节点:
-----续更. . .