iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue编译器分析compile源码
  • 623
分享到

Vue编译器分析compile源码

2023-07-02 17:07:32 623人浏览 薄情痞子
摘要

这篇文章主要介绍“Vue编译器分析compile源码”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue编译器分析compile源码”文章能帮助大家解决问题。引言在 compileToFunctio

这篇文章主要介绍“Vue编译器分析compile源码”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue编译器分析compile源码”文章能帮助大家解决问题。

引言

在 compileToFunctions 方法中:

// compilevar compiled = compile(template, options);

而真正的编译工作是依托于 compile 函数,接下来我们详细解析 compile 。

解析 compile

上述代码在调用 compile ,其中模板字符串 template ,选项参数 options 第二个参数传递给 compile 函数,在章节三种我们知道,这里传递过去的options如下:

{shouldDecodeNewlines,shouldDecodeNewlinesForHref,delimiters,comments,warn }

compile 源码

接下来我们看下 compile 的源码。

function createCompilerCreator(baseCompile) {return function createCompiler(baseOptions) {function compile(template,options) {var finalOptions = Object.create(baseOptions);var errors = [];var tips = [];finalOptions.warn = function(msg, tip) {(tip ? tips : errors).push(msg);};if (options) {// merge custom modulesif (options.modules) {finalOptions.modules =(baseOptions.modules || []).concat(options.modules);}// merge custom directivesif (options.directives) {finalOptions.directives = extend(Object.create(baseOptions.directives || null),options.directives);}// copy other optionsfor (var key in options) {if (key !== 'modules' && key !== 'directives') {finalOptions[key] = options[key];}}}var compiled = baseCompile(template, finalOptions); {errors.push.apply(errors, detectErrors(compiled.ast));}compiled.errors = errors;compiled.tips = tips;return compiled}return {compile: compile,compileToFunctions: createCompileToFunctionFn(compile)}}}

·首先可以看到:

var finalOptions = Object.create(baseOptions);

配置选项

finalOptions 所有的配置选项最终都会挂载在这个对象上,baseOptions包含编译器在运作的时候所需的配置选项。

var baseOptions = {expecthtml: true,modules: modules$1,directives: directives$1,isPreTag: isPreTag,isUnaryTag: isUnaryTag,mustUseProp: mustUseProp,canBeLeftOpenTag: canBeLeftOpenTag,isReservedTag: isReservedTag,getTagNamespace: getTagNamespace,staticKeys: genStaticKeys(modules$1)};

属性分别解析

  • 第一个属性: expectHTML 被设置为 true 。

  • 第二个属性:modules

var modules$1 = [klass$1,style$1,model$1];var klass$1 = {staticKeys: ['staticClass'],transfORMnode: transformNode,genData: genData};var style$1 = {staticKeys: ['staticStyle'],transformNode: transformNode$1,genData: genData$1};var model$1 = {preTransformNode: preTransformNode};

我们用到了在细讲。

  • 第三个属性:directives 值是三个属性 (model、text、html) 的对象,且属性的值都是函数。

  • 第四个属性:isPreTag 它是一个函数,其作用是通过给定的标签名字检查标签是否是 'pre' 标签。

  • 第五个属性:isUnaryTag 是一个通过makeMap生成的函数,该函数的作用是检测给定的标签是否是一元标签。

  • 第六个属性:mustUseProp 它是一个函数,其作用是用来检测一个属性在标签中是否要使用props进行绑定。

  • 第七个属性:canBeLeftOpenTag 一个使用makeMap生成的函数,它的作用是检测非一元标签,但却可以自己补全并闭合的标签。比如 div 标签是一个双标签,你需要这样使用<div> text </div>,但是你依然可以省略闭合标签,直接这样写:<div> text ,且浏览器会自动补全。但是有些标签你不可以这样用,它们是严格的双标签。

  • 第八个属性:isReservedTag 它是一个函数,其作用是检查给定的标签是否是保留的标签。

  • 第九个属性:getTagNamespace 它也是一个函数,其作用是获取元素(标签)的命名空间。

  • 第十个属性:staticKeys 它的值是通过以 modules 为参数调用 genStaticKeys 函数的返回值得到的。 其作用是根据编译器选项的 modules 选项生成一个静态键字符串。

现在我们粗略的介绍了下baseOptions 中各个属性的作用,当我们用到时候再来详细讲解他们的源码。

继续往下看:

var errors = [];var tips = [];finalOptions.warn = function(msg, tip) {(tip ? tips : errors).push(msg);};

很简单

finalOptions添加warn 方法

在 finalOptions上添加了 warn 方法,该方法接收两个参数:

  • msg 错误或提示的信息

  • tip 用来标示 msg 是错误还是提示。

warn选项主要用在编译过程中的错误和提示收集,如果收集的信息是错误信息就将错误信息添加到前面定义的errors数组里,如果是提示信息就将其添加到 tips 数组里。

继续:

if (options) {// merge custom modulesif (options.modules) {finalOptions.modules =(baseOptions.modules || []).concat(options.modules);}// merge custom directivesif (options.directives) {finalOptions.directives = extend(Object.create(baseOptions.directives || null),options.directives);}// copy other optionsfor (var key in options) {if (key !== 'modules' && key !== 'directives') {finalOptions[key] = options[key];}}}

这段代码检查 options 是否存在,这里的 options 就是使用编译器编译模板时传递的选项参数,或者可以简单理解为调用 compileToFunctions 函数时传递的选项参数。

而baseOptions理解为编译器的默认选项或者基本选项,options 是用来提供定制能力的扩展选项。而上面这段代码的作用,就是将 options 对象混合到 finalOptions 中。

两个特殊的属性处理

  • modules: 如果 options.modules 存在,就在 finalOptions 对象上添加 modules 属性,其值为 baseOptions.modules 和 options.modules 这两个数组合并后的新数组。

  • directives: 对于directives 采用原型链的原理实现扩展属性对基本属性的覆盖。

继续:

var compiled = baseCompile(template, finalOptions); {errors.push.apply(errors, detectErrors(compiled.ast));}compiled.errors = errors;compiled.tips = tips;

上面的代码调用了 baseCompile 函数,并分别将字符串模板(template),以及最终的编译器选项(finalOptions)传递了过去。

compiled 是 baseCompile 对模板的编译结果所以上面这段代码的作用是用来通过抽象语法树来检查模板中是否存在错误表达式的,通过 detectErrors 函数实现,将compiled.ast 作为参数传递给 detectErrors 函数,该函数最终返回一个数组,该数组中包含了所有错误的收集,最终通过这句代码将错误添加到errors。

将收集到的错误(errors)和提示(tips)添加到compiled上并返回。

baseCompile 函数是在 createCompilerCreator 函数调用时传递的实参。

// `createCompilerCreator` allows creating compilers that use alternative// parser/optimizer/codegen, e.g the SSR optimizing compiler.// Here we just export a default compiler using the default parts.var createCompiler = createCompilerCreator(function baseCompile(template,options) {var ast = parse(template.trim(), options);if (options.optimize !== false) {optimize(ast, options);}var code = generate(ast, options);return {ast: ast,render: code.render,staticRenderFns: code.staticRenderFns}});

关于“Vue编译器分析compile源码”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Vue编译器分析compile源码

本文链接: https://www.lsjlt.com/news/343466.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue编译器分析compile源码
    这篇文章主要介绍“Vue编译器分析compile源码”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue编译器分析compile源码”文章能帮助大家解决问题。引言在 compileToFunctio...
    99+
    2023-07-02
  • Vue编译器optimize源码分析
    目录引言optimize 源码之旅markStatic$1源码isStatic源码复杂点的回归到markStatic$1markStaticRoots 源码引言 接上文 p...
    99+
    2024-04-02
  • vue原理Compile之optimize标记静态节点源码分析
    这篇文章主要介绍“vue原理Compile之optimize标记静态节点源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue原理Compile之optimize标记静态节点源码分析”文章能帮...
    99+
    2023-07-02
  • vue解析指令compile源码层面使用解析
    目录概述compile测试代码结果延伸及重点讲解1. 类数组对象2. RegExp.$13. nodeType概述 上篇文章我们已经介绍了Vue的响应式原理,并实现了对数据的监听,监...
    99+
    2024-04-02
  • 编译.NET Core 源码的示例分析
    小编给大家分享一下编译.NET Core 源码的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一:Windows 编译VS 2019 16.6(不要安装预览版)Win 10 专业版,最新版本 (1903/2004)...
    99+
    2023-06-14
  • 【投屏】Scrcpy源码分析一(编译篇)
    Scrcpy源码分析系列 【投屏】Scrcpy源码分析一(编译篇) 【投屏】Scrcpy源码分析二(Client篇-连接阶段) 【投屏】Scrcpy源码分析三(Client篇-投屏阶段) 【投屏】Sc...
    99+
    2023-09-13
    android 音视频
  • Nginx源码编译安装的示例分析
    这篇文章将为大家详细讲解有关Nginx源码编译安装的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。rpm包安装比较简单,这里不做说明。对于大多数开源软件,如果找不到安装包,可以使用源码安装方式,源...
    99+
    2023-06-25
  • 使用idea+gradle编译spring5.x.x源码分析
    目录一、编译环境二、安装gradle1、下载2、配置2.1、gradle下载后不需要安装,直接解压到磁盘2.2、配置gradle环境变量2.3、配置gradle默认的本地仓库2.4、...
    99+
    2024-04-02
  • Ceph源码编译与打包的示例分析
    小编给大家分享一下Ceph源码编译与打包的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1clone repository源码打包docker 7u机器:lvjian100081200005.et15sqagit ...
    99+
    2023-06-04
  • Vue3 编译流程-源码解析
    前言: Vue3 发布已经很长一段时间了,最近也有机会在公司项目中用上了 Vue3 + TypeScript + Vite 的技术栈,所以闲暇之余抽空也在抽空阅读 Vue3 的源码。...
    99+
    2024-04-02
  • vue使用源码分析
    本篇内容主要讲解“vue使用源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue使用源码分析”吧!生命周期0版本1.哪些生命周期接口initCreatedbeforeCompileCom...
    99+
    2023-07-04
  • .NET Core 源码编译的问题解析
    引言: .NET Core 源码编译 https://github.com/dotnet git clone https://github.com/dotnet/runtime.gi...
    99+
    2024-04-02
  • 云服务器编译android源码
    一、云服务器编译 云服务器编译是指将源代码编译成可执行的二进制文件,通常称为"编译后代码"。云服务器编译可以通过在本地运行的Linux系统上执行命令行来实现。 在本地执行命令行 在本地执行命令行是云服务器编译的关键步骤。本地执行命令行...
    99+
    2023-10-28
    源码 服务器 android
  • Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App
    目录 一、Android 编译1. 编译流程2. Soong 介绍3. build.sh 二、Android.mk 解析三、Android.bp 解析1. 模块类型2. 模块属性 四、...
    99+
    2023-09-14
    android android studio
  • vue parseHTML函数源码分析
    本文小编为大家详细介绍“vue parseHTML函数源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue parseHTML函数源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-02
  • c#源码怎么编译
    编译 c# 源码包含以下步骤:安装 .net sdk;创建项目;通过命令行或 ide 编译源代码;运行生成的程序集。 如何编译 C# 源码 要编译 C# 源码,需要以下步骤: 1. 安...
    99+
    2024-04-04
    c# 编译错误
  • Android 源码编译方法
    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、查看项目所在分支二、切换到目标分支三、查看当前所在分支四、编译Android源码五、source Android 编译环境六、...
    99+
    2023-09-22
    android
  • PHP源码编译安装
    目录 编译环境编译过程运行配置运行环境1. 创建php.ini文件2. 创建 php-fpm.conf文件3. 创建 www.conf文件4. 配置连接socket为文件(可选)5. 配置ng...
    99+
    2023-09-21
    php sqlite ubuntu
  • Android 系统源码编译
    文章目录 一、环境准备二、下载Android源码(1) 安装python(2)安装Git & 配置Git信息(3)安装curl(4) 下载repo(5)创建源码存放目录(6)初始化仓库(7) ...
    99+
    2023-09-14
    移动安全 工具 技术
  • Golang HTTP编程源码分析
    这篇文章主要介绍“Golang HTTP编程源码分析”,在日常操作中,相信很多人在Golang HTTP编程源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang H...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作