当前位置: 首页 > news >正文

重庆建设网站的公司简介千锋教育培训多少钱费用

重庆建设网站的公司简介,千锋教育培训多少钱费用,wordpress幻灯箱插件,专业的网站建设联系方式前言 在Vue.js 2.0中,模板编译是通过将模板转换为渲染函数来实现的。渲染函数是一个函数,它返回虚拟DOM节点,用于渲染实际的DOM。Vue.js的模板编译过程可以分为以下几个步骤: 将模板解析为抽象语法树(AST&#xff09…

前言

在Vue.js 2.0中,模板编译是通过将模板转换为渲染函数来实现的。渲染函数是一个函数,它返回虚拟DOM节点,用于渲染实际的DOM。Vue.js的模板编译过程可以分为以下几个步骤:

  • 将模板解析为抽象语法树(AST);
  • 对AST进行静态分析,找出其中的静态节点和动态节点;
  • 生成渲染函数,包括生成静态节点的渲染函数和动态节点的渲染函数。

接下来,我们将重点介绍以上三个步骤。

将模板解析为抽象语法树(AST)

将模板解析为抽象语法树是模板编译的第一步。抽象语法树是一种树形结构,它将模板转换为语法树,便于后续的静态分析和代码生成。Vue.js使用了HTML解析器和指令解析器来解析模板,并生成AST。

HTML解析器的主要任务是将模板解析为标签节点和文本节点,同时记录标签节点之间的嵌套关系。指令解析器的主要任务是解析指令,例如v-bind、v-if、v-for等指令,并将其转换为AST节点。

以下是Vue.js中HTML解析器的相关代码:

// 解析模板,生成AST节点
function parse(template) {const stack = [] // 用于记录标签节点的栈let currentParent // 当前标签节点的父节点let root // AST树的根节点// 调用HTML解析器解析模板parseHTML(template, {// 处理标签节点的开始标记start(tag, attrs, unary) {// 创建标签节点const element = {type: 1, // 节点类型为标签节点tag, // 标签名attrsList: attrs, // 属性列表attrsMap: makeAttrsMap(attrs), // 属性列表转换成属性mapparent: currentParent, // 父节点children: [] // 子节点}// 如果AST树还没有根节点,则将当前标签节点设置为根节点if (!root) {root = element}// 如果存在父节点,则将当前标签节点加入父节点的子节点列表中if (currentParent) {currentParent.children.push(element)}// 如果不是自闭合标签,则将当前标签节点压入栈中if (!unary) {stack.push(element)currentParent = element // 当前标签节点设置为父节点}},// 处理标签节点的结束标记end() {// 弹出栈顶的标签节点,当前标签节点设置为其父节点const element = stack.pop()currentParent = stack[stack.length - 1]},// 处理文本节点chars(text) {// 创建文本节点,并将其加入当前标签节点的子节点列表中const element = {type: 3, // 节点类型为文本节点text,parent: currentParent}if (currentParent) {currentParent.children.push(element)}}})// 返回AST树的根节点return root
}

对AST进行静态分析,找出其中的静态节点和动态节点

 

// 静态节点的类型
const isStaticKey = genStaticKeysCached('staticClass,staticStyle')// 判断一个节点是否为静态节点
function isStatic(node) {if (node.type === 2) { // 表达式节点肯定不是静态节点return false}if (node.type === 3) { // 文本节点只有在它的值是纯文本时才是静态节点return true}return !!(node.pre || ( // 有v-pre指令的节点也是静态节点!node.hasBindings && // 没有绑定数据的节点也是静态节点!isBuiltInTag(node.tag) && // 不是内置标签的节点也是静态节点isStaticKey(node) // 属性只包含静态键的节点也是静态节点))
}// 标记静态节点
function markStatic(node) {node.static = isStatic(node)if (node.type === 1) {// 处理子节点for (let i = 0, l = node.children.length; i < l; i++) {const child = node.children[i]markStatic(child)if (!child.static) {node.static = false}}// 处理属性节点if (node.ifConditions) {for (let i = 1, l = node.ifConditions.length; i < l; i++) {const block = node.ifConditions[i].blockmarkStatic(block)if (!block.static) {node.static = false}}}}
}// 找出AST中的静态节点和动态节点
function optimize(root) {markStatic(root) // 标记静态节点// 优化静态节点function markStaticRoots(node) {if (node.type === 1) {if (node.static && node.children.length && !(node.children.length === 1 && node.children[0].type === 3)) {node.staticRoot = truereturn} else {node.staticRoot = false}}}// 遍历整个ASTfunction dfs(node) {if (node.children) {for (let i = 0, l = node.children.length; i < l; i++) {const child = node.children[i]markStaticRoots(child)dfs(child)}}}dfs(root)return root
}

 在静态分析的过程中,我们需要标记出哪些节点是静态节点,哪些节点是动态节点。静态节点的特点是在渲染过程中不会发生变化,而动态节点则可能发生变化。因此,对于静态节点我们可以采用优化的手段,例如提取静态节点的生成代码,减少渲染过程中的重复计算。

将AST转换为渲染函数

在对AST进行静态分析后,接下来的任务是将AST转换为渲染函数。渲染函数就是一个函数,接收一个上下文对象作为参数,返回一个VNode节点。因此,我们需要将AST转换为一个函数,然后再将这个函数返回的VNode节点渲染出来。

将AST转换为渲染函数的过程是一个比较复杂的过程,涉及到许多细节。在Vue.js的源码中,这个过程是由createCompiler函数来完成的。createCompiler函数接收一个选项对象,包含了编译器的所有配置项,返回一个对象,包含了编译器的所有方法。

在createCompiler函数中,我们首先需要创建一个parse函数,用于将模板字符串解析为AST。在Vue.js中,我们使用了另外一个库——parse5,来解析HTML字符串。解析完成后,我们得到了一个AST,接下来就是对AST进行处理。

在对AST进行处理时,我们需要考虑以下几个问题:

  • 如何处理指令和事件绑定
  • 如何处理插槽
  • 如何处理动态属性和静态属性
  • 如何处理插值表达式
  • 如何处理文本节点和HTML节点

这些问题的处理方式比较复杂,我们在这里不做详细的介绍。在Vue.js的源码中,这些问题的处理都是由不同的函数来完成的,最终将所有的函数组合起来,形成一个完整的编译器。

以下是createCompiler函数的实现:

export function createCompiler(baseOptions: CompilerOptions): Compiler {// 通过createCompiler函数,生成一个编译器Compiler对象function compile(template: string,options?: CompilerOptions): CompiledResult {// 创建一个空的finalOptions对象const finalOptions = Object.create(baseOptions)// 创建一个空数组errors,用于存储编译过程中的错误信息const errors = []// 创建一个空数组tips,用于存储编译过程中的提示信息const tips = []// 定义finalOptions的warn方法,用于处理编译过程中的警告信息finalOptions.warn = (msg, tip) => {(tip ? tips : errors).push(msg)}// 将传入的options对象合并到finalOptions中if (options) {// 合并自定义模块if (options.modules) {finalOptions.modules =(baseOptions.modules || []).concat(options.modules)}// 合并自定义指令if (options.directives) {finalOptions.directives = extend(Object.create(baseOptions.directives || null),options.directives)}// 复制其他选项for (const key in options) {if (key !== 'modules' && key !== 'directives') {finalOptions[key] = options[key]}}}// 调用baseCompile函数进行编译,返回编译结果compiledconst compiled = baseCompile(template, finalOptions)// 将编译过程中的错误信息和提示信息存储到compiled中compiled.errors = errorscompiled.tips = tipsreturn compiled}// 返回一个对象,包含compile和compileToFunctions两个方法return {compile,compileToFunctions: createCompileToFunctionFn(compile)}
}

以上是createCompiler函数的注释说明,我们在注释中解释了createCompiler函数的作用和实现细节,让读者更好地理解该函数的作用和用法。

http://www.yayakq.cn/news/59989/

相关文章:

  • 做片头网站秦皇岛的网站建设公司
  • 专业做网站团队手机app 网站
  • 地方网站有何作用汕头seo建站
  • 寺庙网站开发建设方案曹县网站建设
  • 网络网站推广选择乐云seo开发一个软件需要什么过程
  • 网站注册价格免费注册网站有哪些
  • 织梦做淘宝客网站环球网最新国际新闻
  • 网站做任务挣钱做垂直网站
  • 免费无限建站手机百度安装下载
  • 网站建设推广服务商ci框架建设网站
  • 小江高端网站建设可视化响应式网站建设
  • 企业网站建设流程图本地云主机搭建wordpress
  • 外贸服装接单网站政务信息公开与网站建设报告
  • wordpress简体中文版下载地址惠州企业网站seo公司
  • php网站游客试用怎么做网站专题制作 公司
  • 网站头部代码渭南韩城
  • 东莞做网站推广网站备案被注销吗
  • 镇江网站优化免费团购网站模板
  • 2024微信最新版本下载广告seo是什么意思
  • 平台网站建设在哪里免费网站2022年能用的网址
  • 手机网站建设哪家好dw做网站时怎么改为绝对路径
  • 做网站成为首富的外国人凡客诚品还经营吗
  • 大型门户网站开发费用徐州市建筑工程交易网
  • 河南网站建设官网南宁自助建站软件
  • 怎么做定位钓鱼网站wordpress3.8.3
  • 邯郸网站建设产品介绍包装设计公司哪个好
  • 简单手机网站开发软件哈尔滨网络优化公司
  • 微信做网站顺德网站建设如何
  • ftp给网站上传图片后图片的链接地址被改了长宁区网站设计建设
  • 苏州网络营销及网站推广淮南微信网站建设