以vue依赖统计为核心的框架(函数),mve

初接触vue,惊为天人,它的更新方式极为取巧,但也是人们保持路人的缘由:彷佛没有一个严格的数学证实保证按它的方式能精确更新到DOM。不过脑子里推演的彷佛不会发生失败,并且每次界面都能按预期更新的效果十分动人——这彷佛是目前mvvm中最快最准确的更新方式。css

试用过几次,不满的地方,vue是一个框架,必须、最好按它的方式来编码,xml与jscss混编,使用.vue文件。虽而后来放开可使用template字符串。以及它内聚成字典的写法,xml语法都是我不习惯的地方,我只想用纯粹的js语言来编程。通过一翻网络搜索,勉强明白了依赖更新的实现方式,便尝试着本身去实现一个框架。html

没接触vue以前,我制做了一个叫jsdom的小模块,使用其中一个叫parseElement的函数,接受一个嵌套的字典/数组做参数。由于js的字典/数组声明跟json同样树状嵌套,并且更加灵活(key没必要双引号,value能够是函数),而html/xml也是树状的,即可以模拟html/xml,不用像模板引擎或jquery同样拼凑xml字符串,内部递归调用DOM元素的建立修改方法,也就很好地避免了注入攻击。并且传统的各类界面编程使用各类xml,访问属性调用方法又在源码文件,这种分离很不方便,所以在这种嵌套的Object/Array中内置函数,至少减小了代码,明确了调用。字典中若是有id,将字典解析生成的元素节点放置进me.k这个字典里,用来修改DOM元素,也能够实现局部模块化(jsdom源码也在附的开源代码中,可进入查看)。并且在js这种完整的语言下,也能够对局部片断像模板引擎同样轻松重复。性能,我是没考虑的,但至少安全是保证了的,由于已经快到超过人的感知,并且相信用纯粹一种语言,确定比几种语言混编性能高。vue

//简单示例
jsdom.parseElement({
    type:"div",
    attr:{
        a:1,
        b:2
    },
    style:{
        color:"red",
        "background-color":"green"
    },
    children:[
        {
            type:"div",
            id:"a"
        },
        {
            type:"button",
            text:"点击",
            action:{
                click:function(e){
                    console.log(e);
                }
            }
        }
    ]
},me);

但jsdom.parseElement使用要回写DOM,使用DOM的API修改元素属性,这很麻烦,这也是各家mvvm建立的缘由。若是attr节点,或style节点下的value不是字符串或数字,而是函数,就能动态更新这些属性,这就是我理想中的mvvm方式。现在有vue依赖更新这种技术的存在,我以为找到了可能。jquery

实现mve的过程当中,我发现组件的watch须要在销毁时回收,因而不得不改变mve的调用方式,和jsdom.parseElement不一样。具体能够参见开源代码中的示例。git

后来愈来愈以为js很烦人(即便已经比各面向对象语言方便多了;我一直使用其函数式的部分lambda的部分而不使用其原型式的部分),逗号不少很容易写错,函数声明很烦,字符串必须包含在引号中不免先后空格,字典没有默认顺序。。。。为了优化js的写法,我去研究lisp,而后有了个人另外一个开源项目S-Lisp这套语法方案,越深刻思考愈加现这套方案的威力强大,甚至C++版实现的S-Lisp能够经过引用计数精确回收内存,所以顺带推荐。同时mve下有一个js实现的S-Lisp,及这个S-Lisp实现的mve,然而只是部分实现,children的repeat还未实现。欢迎你们关注,但愿可以帮助到你们,同时也但愿你们若是有什么好的改进,不要吝惜分享出来,共同进步。github

开源地址

github
gitee编程

附:S-Lisp
gitee
githubjson

相关文章
相关标签/搜索