关于javascript:petitevue源码剖析为什么要读源码

什么是petite-vue?

依据官网解释,petite-vue是专门为非前后端拆散的历史我的项目提供和Vue相近的响应式开发模式。 与残缺的Vue相比最大的特点是,面对数据的变动petite-vue采取间接操作DOM的形式从新渲染。

具体的应用形式请参考GitHub,在这里我想展现两个示例:

示例1 – 在线渲染

<style>
  [v-cloak] {
    display: none;
  }
</style>
<div v-scope></div>

<script type="module">
  import { createApp } from 'https://unpkg.com/petite-vue?module'

  createApp({
    $template: `
    <span v-cloak v-if="status === 'offline'"> OFFLINE </span>
    <span v-else> ONLINE </span>
    `,
    status: 'online'
  }).mount('[v-scope]')
</script>

上述代码最终输入后果为 <div><span> ONLINE </span></div>,但渲染过程是间接在DOM Tree上进行(分为如下4个步骤),当浏览器资源缓和时整个渲染过程将会被用户和盘托出。

  1. 生成模板

    <div>
      <span v-cloak v-if="status === 'offline'"> OFFLINE </span>
      <span v-else> ONLINE </span>
    </div>
  2. 移除v-cloak属性

    <div>
      <span v-if="status === 'offline'"> OFFLINE </span>
      <span v-else> ONLINE </span>
    </div>
  3. 解析v-ifv-else指令

    <div>
      <span v-if="status === 'offline'"> OFFLINE </span>
    </div>
    <div>
    </div>
  4. 最终渲染

    <div>
      <span> ONLINE </span>
    </div>

那么用户很有可能会看到闪屏景象:ONLINE => OFFLINE ONLINE => OFFLINE => EMPTY => ONLINE

示例2 – 组件化

<div v-scope="App"></div>

<script type="module">
  import { createApp } from 'https://unpkg.com/petite-vue?module'

  const App = {
    $template: `
      <div v-scope="Counter(1)"></div>
      <div v-scope="Message()"></div>
    `
  }

  const Counter = initialCount => ({
    $template: `
      <span>{{ count }}</span>
      <button @click="handleAdd">ADD</button>
    `,
    count: initialCount || 0
    handleAdd() {
      this.count += 1
    }
  })

  const Message = () => {
    $template: `<div>{{ Counter.name }}</div>`
  }

  createApp({
    App,
    Counter,
    Message,
  }).mount('[v-scope]')
</script>

petite-vue尽管没有提供明确的组件构建形式,但通过v-scope属性咱们仍然能够采取组件化构建咱们的页面。但上述例子有显著的问题
采取全局组件注册机制,如例子中即便Message组件不须要还是能援用Counter组件,如果注册的不是Counter组件的构造函数,那么Counter的状态将会被意外批改。

createApp({
  Counter: Counter()
})

浏览源码的益处

  1. 通过浏览源码理解解析、调度和渲染过程,针对渲染过程编码即可预防并解决示例1的问题;
  2. 尽管petite-vue针对非前后端拆散的历史我的项目进行优化,但离理论能与LayUI、MiniUI等DOM操作框架合作还有一段距离,这就须要咱们相熟petite-vue的外部机制从而联合我的项目现有技术栈;
  3. petite-vue源码的确很少,联合@vue/reactivity源码食用,非常适宜入门Vue源码。

待续

后续咱们会以利用示例为入口,逐行浏览了解petite-vue和@vue/reactivity,并实现本人的petite-vue和响应式零碎,敬请期待:)

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理