如何在前端编码时实现人肉双向编译

如何在前端编码时实现人肉双向编译

React+flux是目前最火的前端解决方案之一,但flux槽点颇多,例如store比较混乱,使用比较繁琐等,于是出现了很多第三方的基于flux优化的架构。

有人统计了目前主流的flux实现方案,感兴趣的可以看这里:Which Flux implementation should I use?

其中redux是目前githubstar最多的一个方案,该方案完全独立于react,意味着这套理念可以作为架构层应用于其他的组件化方案。同时官方也提供了react-redux库,帮助开发者直接使用react+redux快速开发。

个人理解它的主要特性体现在以下几点:

  1. 强制使用一个全局的storestore只提供了几个简单的api(实际上应该是4个),如subscribe/dispatch(订阅、发布),getState,replaceReducer
  2. store负责维护一个唯一的叫做state树的对象,其中state存储了应用需要用到的所有数据。
  3. store和顶层组件使用connect方法绑定,并赋给props一个dispatch方法,可以直接在组件内部this.props.dispatch(action)。 简单一点说,就是去掉了flux中组件和storeunbind/bind环节。当state变化时,自动更新components,不需要手动操作。
  4. 提供了applyMiddleware方法用于异步的action,并且提供了加入中间件的能力,例如打印日志追踪应用的所有状态变化。
  5. 对全局的数据state的操作,由多个reducer完成。每个reducer都是一个纯函数,接收两个参数stateaction,返回处理后的state。这点类似管道的操作。

接下来我们可以回答标题的问题了,即:如何在前端编码时实现人肉双向编(zi)译(can)。

其实就是使用coffee来编写react+redux应用。

我们来写个简单的hello world玩玩。

view部分

这部分和redux/flux无关,纯粹react的实现,使用jsx的话,render部分的代码大概长这样:


  1. render:function(){ 
  2.     return ( 
  3.         <div> 
  4.             <div class="timer">定时器:{interval}</div> 
  5.             <div>{title}</div> 
  6.             <input ref="input"><button>click it.</button> 
  7.         </div> 
  8.     ) 

那如何使用coffee写这段代码呢? 我们需要先将jsx编译这类似这样的js代码,请注意是用大脑编译:


  1. render:function(){ 
  2.     return React.createElement('div',null, 
  3.         React.createElement('div',{className:'timer'},'定时器'+this.props.interval), 
  4.         React.createElement('div',null,this.props.title), 
  5.         React.createElement('input',{ref:'input'}), 
  6.         React.createElement('button',null,'click it.') 
  7.     ); 

然后将js代码逆向编译为coffee。

这里我们可以用$代替React.createElement简化代码(终于可以用jQuery的坑位了),得益于coffee的语法,借助React.DOM可以用一种更简单的方式实现:

{div,input,button,span,h1,h2,h3} = React.DOM

这里就不单独放render部分,直接看完整代码:


  1. {Component,PropTypes} = React = require 'react' 
  2. $ = React.createElement 
  3. {div,input,button} = React.DOM 
  4.  
  5. class App extends Component 
  6.     clickHandle:-> 
  7.         dom = this.refs.input.getDOMNode() 
  8.         this.props.actions.change(dom.value) 
  9.         dom.value = '' 
  10.     render:-> 
  11.         {title,interval} = this.props 
  12.         div className:'timer', 
  13.             div null,'定时器:' + interval 
  14.             div null,title 
  15.             input ref:'input' 
  16.             button onClick:@clickHandle.bind(this),'click it.' 
  17.  
  18. App.propTypes = 
  19.     title: PropTypes.string 
  20.     actions: PropTypes.object 
  21.     interval: PropTypes.number 
  22.  
  23. module.exports = App 

如果你能看到并看懂这段coffee,并在大脑里自动编译成js代码再到jsx代码,恭喜你。

连接store

这个环节的作用,主要是实现view层和store层的绑定,当store数据变化时,可自动更新view。

这里需要使用redux提供的createStore方法创建一个store,该方法接受2个参数,reducer和初始的state(应用初始数据)。

store.coffee的代码如下:


  1. {createStore} = require 'redux' 
  2. reducers = require './reducers' # reducer 
  3. state = require './state' # 应用初始数据 
  4.  
  5. module.exports = createStore reducers,state 

然后我们在应用的入口将store和App绑定,这里使用了redux官方提供的react-redux库。


  1. {Provider,connect} = require 'react-redux' 
  2. store = require './store' 
  3. $ = React.createElement 
  4. mapState = (state)-> 
  5.     state 
  6. rootComponent = $ Provider,store:store,-> 
  7.     $ connect(mapState)(App) 
  8. React.render rootComponent,document.body 

可能有人会问,mapState和Provider是什么鬼?

mapState提供了一个类似选择器的效果,当一个应用很庞大时,可以选择将state的某一部分数据连接到该组件。我们这里用不着,直接返回state自身。

Provider是一个特殊处理过的react component,官方文档是这样描述的:


  1. This makes our store instance available to the components below. 
  2. (Internally, this is done via React undocumented “context” feature,  
  3. but it’s not exposed directly in the API so don’t worry about it.) 

所以,放心的用就好了。

connect方法用于连接state和App,之后即可在App组件内部使用this.props.dispatch()方法了。

添加action和reducer

最后我们添加一个按钮点击的事件和定时器,用于触发action,并编写对应的reducer处理数据。

在前面的App内部已经添加了this.props.actions.change(dom.value),这里看下action.coffee的代码:


  1. module.exports = 
  2.     change:(title)-> 
  3.         type:'change' 
  4.         title: title 
  5.     timer:(interval)-> 
  6.         type:'timer' 
  7.         interval:interval 

再看reducer.coffee


  1. module.exports = (state,action)-> 
  2.     switch action.type 
  3.         when 'change' 
  4.             Object.assign {},state,title:'hello ' + action.title 
  5.         when 'timer' 
  6.             Object.assign {},state,interval:action.interval 
  7.         else 
  8.             state 

至此,代码写完了。

一些其他的东西

这里只介绍一个中间件的思想,其他的特性例如异步action,或者dispatch一个promise等原理基本类似:


  1. dispatch = store.dispatch 
  2. store.dispatch = (action)-> 
  3.     console.log action # 打印每一次action 
  4.     dispatch.apply store,arguments 

作者:yisbug

来源:51CTO

时间: 2024-09-08 16:57:26

如何在前端编码时实现人肉双向编译的相关文章

人肉反编译使用yield关键字的方法

我认为这是一个真命题:"没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序 员"..NET Reflector强大的地方就在于可以把IL代码反编译成可读性颇高的高级语言代码,并且能够支 持相当多的"模式",根据这些模式它可以在一定程度上把某些语法糖给还原,甚至可以支持简单的 Lambda表达式和LINQ.只可惜,.NET Reflector还是无法做到极致,某些情况下生成的代码还是无法还原 到易于理解--yield关键字便是这样一个典

【前端模板之路】二、人肉非智举,让代码帮我们写代码才是王道

写在前面 在前面一篇文章<[前端模板之路]一.重构的兄弟说:我才不想看你的代码!把HTML给我交出来!>中,我们举了一个人肉各种createElement的例子,那繁琐程度绝对是惨绝人寰.人生本就苦短,每天加班又占据了不少时间,这么折腾下去,还让人怎么活.面对这种场景,我们该怎么做. 无需复杂的构建工具,仅几个简单的工具函数,帮我们告别重复意义的劳动:让代码帮我们写代码! 从最简单的例子说起 让代码帮我们写代码,似乎很豪迈的话,但相信部分童鞋听着还是有些丈二和尚摸不着头脑.那我们暂且抛开这句不

评论:人肉搜索的法律边界在哪里

一个受到爱情伤害的女子,在设计好了自己的归宿之后,却把一个巨大的问题抛给了社会.人肉搜索的狂飙,让她预设的目的,已经超额达到.我们不知道,她是想以这种"预设"好的社会舆论来惩罚伤害她的人,还是想以牺牲自己来唤醒社会对道德的重建. 姜岩泉下有知的话,不知道对自己以生命为代价的最后一击,所产生的效果,是欣慰还是困惑. 一则死亡博客,把一个沉重而尖锐的话题,留给了整个社会,那就是,人肉搜索的法律边界,到底在哪里? 死亡博客推开人肉搜索之门 一切都要从"死亡博客"说起,这个

“人肉搜索第一案”怎么判

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 京消息 记者前天从北京市朝阳区人民法院获悉,继"人肉搜索第一案"在京三度开审后,北京朝阳法院日前召开高级法官联席会议,54名高级法官就"人肉搜索第一案"展开热烈研讨. 女子自杀前写下死亡博客 "人肉搜索第一案"又被称为"网络暴力第一案".该案中的北京女白领姜岩于2

“叫床达人”醒醒:人肉闹钟App,早安!陌生人!

现在的匿名社交竞争越来越大,产品细分也是五花八门.有约饭,约运动,约看电影的,现在连闹钟叫床都不放过了. 优趣科技的"醒醒"在13年11月份开始推出内测版本,当时叫做"叫床达人",在没有做任何推广的情况下,这个有些恶搞却也直白道出http://www.aliyun.com/zixun/aggregation/17626.html">核心功能的名字带来了总共获得了超过2万次的下载量,日活跃用户数量(DAU)最高时达到2000.其中,70%的用户是来自社

“人肉营销”火爆“淘客族”收入数千上万

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在工作之余,每天花几个小时上网,推荐人家进网店买东西,每个月就可以有少则上千元.多则上万元的收入,这样的好事你相信吗?昨天,有热心读者为记者推荐了一位网购淘客.淘宝网购网站主人"自由人生"的电话,记者随即对这位淘客进行了连线,也撩开了这个新兴的网络低成本投资赚钱的神秘面纱. 低成本建网站导购 客户购物成功可提成 "

人肉搜索:一只老虎打N个武松

中介交易 SEO诊断 淘宝客 云主机 技术大厅 "一个普通人,所有的一切突然之间在网络上成为关注的焦点了,是为什么?" "他成名了.或者说,他出事了."马建斌(化名)说,"最大可能,是被'人肉搜索'引擎盯上了." 在网上,马建斌有一个很"暴力"的网名:西方不败.说这话时,他正忙碌于游荡于天涯.猫扑网中,和其他进行"人肉搜索"的网友一道, 将艳照中每个层面的细节,包括内衣的价钱.艺人所用的饰品.不同摄影器材及

江西防总办官员遭人肉搜索压力之下精神恍惚

南都讯 记者张东锋 "平主任被人肉了,有人举牌要其走人.接匿名电话.精神恍惚.不敢回家.妻子哭泣.孩子不能上学."---近日都在江西采访抗洪的央视主播李小萌,昨天早上发了这样一条微博. 平主任是江西防总办副主任平其俊,他的同事向南都记者证实了李小萌的说法.江西防总办公室主任祝水贵在接受南都记者采访时也表示这次事件不会影响平的工作,并解释当时决口刚发生,确实没有现场数据"换了谁也回答不上来". 有市民举牌要求平主任下课 "平主任被人肉了."昨天一大

导演婚外情被人肉被泡女演员并非秦海璐

叶京成为 网友怀疑对象 秦海璐:我还没结婚 新快报记者 贺雅佳 前有导演鄢颇为李小冉被砍至重伤,今有知名导演与已婚女演员搞婚外情被打.消息一出,很多人把矛头指向偶像剧导演赵宝刚,而昨天微博有网友爆料,其实被打的导演是叶京,女演员则是在他拍摄的电视剧<再过把瘾>里担任主角. 婚外情遭女方老公报复 朝阳检察院披露受害人是北京的一位导演,曾因拍摄多部青春偶像剧而为观众熟知.2010年9月的一天下午,受害人在北京市东坝乡附近的高尔夫球场打完球到停车场开车时,突然冲上来几名陌生男子,上来便对其一顿拳打脚