晕,大家好,好久不见!最近因为看了一些be小说,整个人都挺郁闷的::>_<::就在昨天,花了一天时间写了fre,又一个小而美的前端MVMM框架。也许你会想,有了它Vue和React,就没必要再写一个了::>_<::我想我应该想办法找到它的存在。让我们先看看API:import{useState,html,mount}from'fre'functioncounter(){conststate=useState({count:0})returnhtml`
${state.count}
{state.count++}}>+{state.count--}}>-`}mount(html`<${counter}/>`,document.body)hooks风格的组件方案应该是第一个看到hooks的。虽然和react的hooks不一样,fre的hooks是通过Proxy劫持来实现的,而react是通过两个对应的数组来实现的。没错,fre是因为hooks而写的。Hooks让函数有状态,其实是另一种组件化的解决方案。市面上常见的组件化方案:react方案、class+extend+hoc+renderprops、依赖JSXvue的方案、模板引擎、依赖vue-loaderangular的方案,(不知道是什么,没研究过,不过这里应该可以对web-components进行分类)上面,可以说各大框架实现组件化的方式不同,react和vue都需要babel,web-components是浏览器原生支持的,但是自身的局限性是还有很多(比如scopedcss,直接剥夺了css复用的能力),所以fre取长补短,采用了新的方案:fre的方案,function+taggedtemplate+JSX(可选)。是的,虽然英文名改了,但是是ES6原生支持的templatestring(⊙o⊙)...taggedtemplate模板解决方案一直在找能在浏览器、web中运行的某种写法-components被拒绝了,taggedtemplate是最好的选择?想来,taggedtemplate不仅接近JSX开发体验,还有很多惊喜:html标准,比如
简写,总之html5的各种写法都可以隔离js,通过两个反射引用,你再也不用担心calss和className了。当然,最重要的是,不编译浏览器直接运行有什么好处?它允许后端语言像jq一样使用fre,但是它具有组件化和响应式数据驱动的dom。我曾经说过,大家都在写前端框架,各种react-like、vue-like、小型化、进阶进化……但是解决不了痛点。前端框架其实有很多痛点,比如SSRSSR的很多局限性。并不是webpack的配置太麻烦,而是它的局限性让我们失去了很多可能。首当其冲的是node以外的语言不能根据自身的能力进行同构。所以我写了fre,从某种角度来说,它也是针对其他后端语言的。Proxy和vdomdiff的数据更新方案已经讨论很久了,就是数据更新方案,通常有很多种angular,dirtycheck(没研究过,不知道是ng1还是ng2)vue,objecthijacking+vdomdiff,vue2Object.definepropertyreact,vdomdiffsan,set(xxx,xxx)个人因为比较关注vue和react,所以也比较推荐objecthijacking+vdomdiff。所以fre也是一样,通过Proxy劫持,劫持会触发rerender,对于vdomdiff的内容,只能说个人喜欢,各种方案都有。这取决于作者。顺便提一下diff。事实上,有相当多的diff算法。大致有两种:react-led,两组vdom进行比对,生成patch,命中realdom,preact主导,一组vdom直接与realdom进行比对,直接运行realdom是前者。因为有代理,其实vdom是可有可无的,充其量只是一个抽象层而已。既然是抽象的,就应该像react一样透彻。之后diff的优化就只是两个对象的事情了~望天,写了那么多::>_<::最后放上github地址,欢迎尝试和star!https://github.com/132yse/fre