IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue3编译器原理 -> 正文阅读

[JavaScript知识库]vue3编译器原理

1.执行代码

<script src="../../dist/vue.global.js"></script>
<div id="app">
  <div>vue3 compiler principle</div>
  <div>{{count}}</div>
</div>
<script>
  var { createApp } = Vue
  var app = createApp({
    data() {
      return {
        count: 1
      }
    }
  })
  app.mount('#app')
  console.log(app._instance.render);
</script>

打印出渲染函数render

  1. 静态缓存:_hoisted_1<div>vue3 compiler principle</div>给缓存起来,因为不需要处理
  2. sfc playground
(function anonymous(
) {
const _Vue = Vue
const { createElementVNode: _createElementVNode } = _Vue

const _hoisted_1 = /*#__PURE__*/_createElementVNode("div", null, "vue3 compiler principle", -1 /* HOISTED */)

return function render(_ctx, _cache) {
  with (_ctx) {
    const { createElementVNode: _createElementVNode, toDisplayString: _toDisplayString, Fragment: _Fragment, openBlock: _openBlock, createElementBlock: _createElementBlock } = _Vue

    return (_openBlock(), _createElementBlock(_Fragment, null, [
      _hoisted_1,
      _createElementVNode("div", null, _toDisplayString(count), 1 /* TEXT */)
    ], 64 /* STABLE_FRAGMENT */))
  }
}
})

2.vue为什么需要编译器

  1. 编译器是将一门语言转换另一门语言
  2. vue是声明式渲染
  3. 编译器会将template编译为render函数( js )
  4. 前端程序员,更加喜欢用html描述视图,开发效率高
  5. 性能优化
    1. 静态分析

3.vue template 和 react jsx异同?

  1. 异曲同工
    1. 都是为了生成虚拟dom
    2. js、jsx、ts、tsx
    3. 提高前端程序员视图开发效率
    4. jsx:babel转换工具将create函数的调用,最后转换为vdom
    5. template:compile编译模板后生成render函数,在未来某个时间执行生成vdom
  2. 执行时刻
    1. vue
      1. 预编译(版本 和 执行环境) :webpack sfc vue-loader
      2. 运行时(global,browser):template选项,挂载阶段
    2. react
    3. 转译transpile
  3. 性能优化:vue3执行编译期优化,可以静态分析

4.编译器执行时刻

  1. 预编译:vue版本esm结合打包工具webpack等,结合sfc
  2. 运行时编译
    1. vue版本global、esm-browser、挂载时编译
    2. vue/src/index.ts 的 compileToFunction
    3. 在执行setupComponent
    4. 会执行finishComponentSetup
    5. 进一步会触发compile
    6. 也就是执行了compileToFunction

最开始备份compileToFunction

registerRuntimeCompiler(compileToFunction)
let compile
function registerRuntimeCompiler(_compile) {
  compile = _compile // 在这里把compileToFunction 存到 compile
  installWithProxy = i => {
    if (i.render!._rc) {
      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers)
    }
  }
}
function compileToFunction(
  template
  options
) {
  if (!isString(template)) { // 这种的是 用户直接传入节点
    if (template.nodeType) {
      template = template.innerHTML
    } else {
      return NOOP
    }
  }
  const key = template
  const cached = compileCache[key]
  if (cached) {
    return cached
  }
  if (template[0] === '#') {
    const el = document.querySelector(template)
    template = el ? el.innerHTML : ``
  }
  const { code } = compile( // 把模板给编译一下
    template,
    extend(
      {
        hoistStatic: true
      options
    )
  )
  const render = ( // 使用new 转换上面的code为一个函数
    __GLOBAL__ ? new Function(code)() : new Function('Vue', code)(runtimeDom)
  )
  render._rc = true
  return (compileCache[key] = render)
}

执行compile就是执行备份的compileToFunction

function finishComponentSetup(
  instance,
  isSSR,
  skipOptions
) {
	Component.render = compile(template, finalCompilerOptions)
}

5.编译器是如何运行的

  1. parse: 解析template为AST
  2. transform:AST => AST
  3. generate:AST转换为render函数
function compileToFunction(template,options) {
  const { code } = compile( template )
}
export function compile(
  template: string,
  options: CompilerOptions = {}
): CodegenResult {
  return baseCompile(
    template,
    extend({}, parserOptions, options, {
      nodeTransforms: [
        ignoreSideEffectTags,
        ...DOMNodeTransforms,
        ...(options.nodeTransforms || [])
      ],
      directiveTransforms: extend(
        {},
        DOMDirectiveTransforms,
        options.directiveTransforms || {}
      ),
      transformHoist: __BROWSER__ ? null : stringifyStatic
    })
  )
}
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 18:55:53  更:2022-06-29 18:59:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:55:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码