美文网首页web前端
拜读Preact源码有感

拜读Preact源码有感

作者: 侬姝沁儿 | 来源:发表于2019-01-28 14:27 被阅读26次

jsx本质

JSX是一种嵌入式的类似XML的语法,它可以被转换成合法的JavaScript,转换的语义是依据不同的实现而定的。例如react有react的jsx语法和转换器babel-plugin-transform-react-jsx ,vue有vue的jsx语法和转换器babel-plugin-transform-vue-jsx,当然,这也意味你可以开发自己的jsx语法和转换器jsx

react本质

babel-plugin-transform-react-jsx

react通过babel-plugin-transform-react-jsx将jsx语法转换为可以被React.createElement识别的形式,即:

<div id="foo" name="bar">Hello!</div>

// 转换为

React.createElement('div', { id: 'foo', name : 'bar' }, 'Hello!');

也就是说,react的jsx只是React.createElement的语法糖而已,我们看起来在写jsx,实际上babel-plugin-transform-react-jsx已经将我们写的jsx语法转换了。

React.createElement

jsx语法被转换器转换后,变成可以被React.createElement所识别的内容。React.createElement(component, props, ...children) 则将能识别的相应内容解析为虚拟DOM。

React.createElement('div', { id: 'foo', name : 'bar' }, 'Hello!');

// 转换为

{
  $$typeof: Symbol(react.element),
  key: null,
  props: {id: "foo", name: "bar", children: "Hello!"},
  ref: null,
  type: "div",
  _owner: {},
  _store: {}
}

虚拟DOM的本质:(virtual-dom)

虚拟DOM从本质上将就是将复杂的DOM转化成轻量级的JavaScript对象,不同的渲染中却会生成同样的虚拟DOM对象,然后通过高效优化过的Diff算法,比较前后的虚拟DOM对象,以最小的变化去更新真实DOM。

{
  $$typeof: Symbol(react.element),
  key: null,
  props: {id: "foo", name: "bar", children: "Hello!"},
  ref: null,
  type: "div",
  _owner: {},
  _store: {}
}

// Hello 变为 Hello react

{
  $$typeof: Symbol(react.element),
  key: null,
  props: {id: "foo", name: "bar", children: "Hello react!"},
  ref: null,
  type: "div",
  _owner: {},
  _store: {}
}

对比对象我们可以看到,只有 props.children 发生了变化,利用高效的对比diff方法找到不同,并把不同的内容修改,进行一个真实dom上的映射改变。即:

<div id="foo" name="bar">Hello!</div>

// dom映射后

<div id="foo" name="bar">Hello react!</div>

结语

即react的核心思想就是利用jsx转换器,将jsx转换为React.createElement能理解的形式,然后React.createElement又将相应内容解析为虚拟DOM。不同的渲染中却会生成同样的虚拟DOM对象,然后通过高效优化过的Diff算法,比较前后的虚拟DOM对象,最后通过dom的相应方法以最小的变化去更新真实DOM。无外乎是:jsx组件到虚拟DOM的转化、以及虚拟DOM到真实DOM的映射。

相关文章

  • 拜读Preact源码有感

    jsx本质 JSX是一种嵌入式的类似XML的语法,它可以被转换成合法的JavaScript,转换的语义是依据不同的...

  • Preact(React)核心原理详解

    Preact(React)核心原理详解 原创: 宝丁 玄说前端 本文作者:字节跳动 - 宝丁 一、Preact 是...

  • 拜读《史记》有感

    每次拜读经典书籍的时候,崇敬之心油然而生。每一部经典都具备丰富的内涵,而且作者无不是在人生中,遭遇凄惨跌荡中获得写...

  • 拜读曾国藩有感

    米多1:一部教人懂得做人处世智慧的殿堂之作 忙里偷闲又或是闲来无事,紧赶慢赶,总算把曾国藩三部曲中的野焚、黑雨看完...

  • 试试这么读preact源码(二)- render

    旧版本中的 render 方法只做了一件事,就是调起 diff 方法,新版本中的 render 引入了 Fragm...

  • 试试这么读preact源码(一)- createElement

    之前阅读的是 preact 的 v8 版本,官方已经更新到 v10 的测试版了,接下来我们主要对照两个版本之间的差...

  • 80行代码实现Preact-Transition组件

    80行代码实现Preact-Transition组件 Preact是3kb轻量化方案, 但是一些基础组件找起来比较...

  • 文明的WeChat源码拜读

    项目链接 :https://github.com/zhengwenming/WeChat 可以看到的知识点:key...

  • 拜读雨树有感

    诗文精妙笔生花,描绘人间万朵霞。 雨露清风润心扇,清泉溪流泽万家。 胸怀博大生吉利,梅桂馨香更高雅。 长与百花添胜...

  • 拜读雨树有感

    诗文精妙笔生花,描绘人间万朵霞。 雨露清风润心扉,清泉溪流泽万家。 胸怀博大生吉利,梅桂馨香更高雅。 长与百花添胜...

网友评论

    本文标题:拜读Preact源码有感

    本文链接:https://www.haomeiwen.com/subject/fmeajqtx.html