8 小时实现迷你版 vuejs - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lihongxun945
V2EX    前端开发

8 小时实现迷你版 vuejs

  •  
  •   lihongxun945 2017 年 11 月 9 日 2571 次点击
    这是一个创建于 2993 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近断断续续在看 Vuejs 源码,版本是 V1.0,因为最开始看的时候 vue 还没出 v2 正式版 =。=

    作者的代码功力很深厚,整个代码看起来非常优雅,对模块的组织和依赖的处理非常值得学习。在看的过程中觉得自己实现一个迷你版的 vue 应该不难,最近三天抽出时间一些时间就实现了一个,但实际上全部时间加起来大概就一整天。

    代码地址: https:/github.com/lihongxun945/tiny-vue

    虽然是 mini 版,但是实现的功能并当然不是一篇博客能说清楚的,这里打算分六篇来详细讲解实现的过程。对于比较资深的工程师,完全可以直接看我的源码,如果有不理解的再回头看博客。对于新手,建议跟着博客一步步来。

    tinyvue 虽然是绝大部分代码是完全重新写的,但是无论是文件、模块还是命名等都和原版的几乎一样,而代码量却减少了 90%以上,看懂 tinyvue 之后再去看 vue 原版代码会很容易上手。

    动手造轮子要比光看的理解会深入的多。

    要实现的功能

    我们希望最终实现的效果是这样的:

    <input v-model="message"/> <button v-on:click="increase">Increase</button>

    <script> new Vue({ el: "#a", data: { message: 1 }, methods: { increase () { this.message += 1 } } }) </script>

    明确一下我们要实现的功能,这也是 vuejs 最核心的两个功能:

    1. 双向数据绑定,或者叫数据响应化
    2. 指令的支持,以及常用的 v-on, v-model, v-text 等内建的指令

    具体点来说,双向数据绑定其实需要实现如下几部分:

    state observer directive 会复杂些,需要实现如下几个类:

    1. Directive
    2. Compile
    3. Dep
    4. Watcher
    5. v-text, v-on, v-model 等几个内置的 directive

    完整的代码参见: https://github.com/lihongxun945/tiny-vue 另外有非常详细的文章手把手教学: http://blog.csdn.net/lihongxun945/article/category/7259172

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5418 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 08:05 PVG 16:05 LAX 00:05 JFK 03:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86