拜读Preact源码有感

本文探讨了jsx的本质,指出jsx是不同框架如React和Preact的语法糖,通过转换器如babel-plugin-transform-react-jsx转译成框架可识别的形式。接着讲解了React.createElement的作用,它解析jsx生成虚拟DOM。虚拟DOM作为轻量级的JavaScript对象,通过Diff算法高效地更新实际DOM。文章总结了React和Preact的核心思想,强调jsx到虚拟DOM再到真实DOM的转换和更新过程。
摘要由CSDN通过智能技术生成

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的映射。

提示:后面还有精彩敬请期待,请大家关注我的CSDN博文:侬姝沁儿,或者我的专题:web前端。如有意见可以进行评论,每一条评论我都会认真对待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值