尤雨溪的5KB petite-vue源码解析

本文详细解析了尤雨溪创建的仅5KB的petite-vue源码,从项目启动、入口函数、模板解析到DOM操作,深入浅出地介绍了该框架的核心原理。通过分析`createApp`、`mount`函数及指令处理,揭示了如何在无虚拟DOM的情况下实现Vue的模板语法转换。
摘要由CSDN通过智能技术生成
写在开头
  • 近期尤雨溪发布了5kb的petite-vue,好奇的我,clone了他的源码,给大家解析一波。

  • 最近由于工作事情多,所以放缓了原创的脚步!大家谅解

  • 想看我往期手写源码+各种源码解析的可以关注我公众号看我的GitHub,基本上前端的框架源码都有解析过

正式开始
  • petite-vue是只有5kb的vue,我们先找到仓库,克隆下来

https://github.com/vuejs/petite-vue
  • 克隆下来后发现,用的是vite + petite-vue + 多页面形式启动的

  • 启动命令:

git clone https://github.com/vuejs/petite-vue
cd /petite-vue
npm i 
npm run dev

  • 然后打开http://localhost:3000/即可看到页面:


保姆式教学
  • 项目已经启动了,接下来我们先解析下项目入口,由于使用的构建工具是vite,从根目录下的index.html人口找起:

<h2>Examples</h2>
<ul>
  <li><a href="/examples/todomvc.html">TodoMVC</a></li>
  <li><a href="/examples/commits.html">Commits</a></li>
  <li><a href="/examples/grid.html">Grid</a></li>
  <li><a href="/examples/markdown.html">Markdown</a></li>
  <li><a href="/examples/svg.html">SVG</a></li>
  <li><a href="/examples/tree.html">Tree</a></li>
</ul>

<h2>Tests</h2>
<ul>
  <li><a href="/tests/scope.html">v-scope</a></li>
  <li><a href="/tests/effect.html">v-effect</a></li>
  <li><a href="/tests/bind.html">v-bind</a></li>
  <li><a href="/tests/on.html">v-on</a></li>
  <li><a href="/tests/if.html">v-if</a></li>
  <li><a href="/tests/for.html">v-for</a></li>
  <li><a href="/tests/model.html">v-model</a></li>
  <li><a href="/tests/once.html">v-once</a></li>
  <li><a href="/tests/multi-mount.html">Multi mount</a></li>
</ul>

<style>
  a {
    font-size: 18px;
  }
</style>
  • 这就是多页面模式+vue+vite的一个演示项目,我们找到一个简单的演示页commits:

<script type="module">
  import { createApp, reactive } from '../src'

  const API_URL = `https://api.github.com/repos/vuejs/vue-next/commits?per_page=3&sha=`

  createApp({
    branches: ['master', 'v2-compat'],
    currentBranch: 'master',
    commits: null,

    truncate(v) {
      const newline = v.indexOf('\n')
      return newline > 0 ? v.slice(0, newline) : v
    },

    formatDate(v) {
      return v.replace(/T|Z/g, ' ')
    },

    fetchData() {
      fetch(`${API_URL}${this.currentBranch}`)
        .then((res) => res.json())
        .then((data) => {
          this.commits = data
        })
    }
  }).mount()
</script>

<div v-scope v-effect="fetchData()">
  <h1>Latest Vue.js Commits</h1>
  <template v-for="branch in branches">
    <input
      type="radio"
      :id=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值