客户端店铺动态模板化方案——用ReactNative替代传统Velocity方案来做服务端动态渲染

传统的动态模板技术

传统动态模板技术一般分为三个模块,分别是设计师模块、服务端转换模块、渲染模块

设计师模块

模板设计后台一般提供给前端工程师,或者外界的美化爱好者,通过拖曳各种控件的方式来实现,并提供一种简单的自定义xml配置方式来提供更深层次的定制化。

语法规范如下:

<floor>
   <container>
       <style>
           <attr name="width" value="-1"/>
           <attr name="height" value="90"/>
           <attr name="backgroundColor"value="#ffffff"/>
       </style>
       <text value="动态文案">
           <style>
                <attr name="fontSize"value="15"/>
                <attr name="fontWeight" value="500"/>
           </style>
       </text>
   </container>
</floor>

首先必须要有根节点,根节点只有一个,如文档中的,代表一个楼层。与HTML不同,所有标签必须要有闭合标签,可以没有标签之间的内容,但是如果标签没有闭合,则是非法的。
在设计师平台中,一个模板就会包含多个组件,例如一个轮播图,一个单图活动或者一个多列的商品列表,每次只能新建、编写一个组件,然后使用多个组件来组合成一个模板。
元素分类:
一个组件和可以由多种元素组合而成,分为两种类型:
1. 容器元素:container、slider、list、grid、simpleTab
2. 基本元素: text、image、line
同时在元素里,我们可以通过value等字段定义好内容数据,或者请求的链接,点击变化的效果。
总之通过拖曳后的直观效果图可以生成xml,或者自定义xml方式实现设计模板的功能。

数据转换模块

通过将设计师模块中的xml转换为json格式,通过SOA调用的方式提供给另外的App数据下发模块

渲染模块

当设计师模块中的xml数据被转换为json后,渲染方式可以有三种

  1. Velocity模板引擎语法解析Json数据,服务端渲染**
    Velocity代码会经过编译,这是典型的服务端渲染,速度较快,体验一般
  2. 通过页面端Ajax js请求的方式得到响应数据,并通过JS得到Json的层次,得到元素、容器属性后,根据html css语法逐个递归转换
    Js的效率较差,页面端渲染,如果性能差,可能会有卡顿的感觉,当然对于一般不超过几十个楼层的动态模板,足够了!
  3. 通过Android、Ios原生Http请求得到渲染的Json,从中得到容器层次、元素,并逐个实现多种容器例如slider轮播,list列表和基本元素,并提供属性接口,最终拼接。
    这种方式因为是App客户端渲染,带来的原生体验,所以效果较好,但是因为所有容器、元素和他们属性很难设计完美,所以会带来许多问题。

ReactNative来做动态模板

ReactNative是由Facebook推出的开源Hybrid方案,相比较于传统的Cordova方案,ReactNative主要是采用了不同于Cordova JS桥接的模式,通过C语言实现高效的JsCore,来实现ECMAScript语法规范的React Js调用原生端,并完整地实现了Android/IOS平台的多种View例如ListView等,同时因为ReactNative便于升级,所以让热更新变得可能,至于ReactNative等插件化的升级方案,我们会在后续介绍。

技术方案实现

设计师模块依旧沿用传统方案,因为虽然RN是基于React语法,但是小白设计师并不懂前端,所以还需要沿用xml或者所见即所得的方式让用户实现店铺模板,而转换的模块需要经过以下几个步骤:

1.遍历xml元素,生成React样式的动态JS
我们先来看一段ReactNative代码

render: function() {
    return (
        <View style={styles.container}> <Text style={styles.welcome}> React-Native入门学习 </Text> <Image style={styles.pic} source={{uri: 'https://avatars3.githubusercontent.com/u/6133685?v=3&s=460'}}> </Image> </View> ); }

是不是和我们的xml定义的格式有点类似呢!我们通过深度遍历树状的xml定义的样式和数据,将其转换为ReactNative的Render模块,将原来的布局,转换通过React的Flex布局来实现排版。
2. 通过Babel编译1中生成的JSX
因为1中转换的JS可能是ES6、JSX等多种混合格式,所以需要通过Babel来编译转码生成最终兼容ReactNative JSCore的语法
3.在线增量混淆、打包
通过RN的混淆打包工具实现压缩打包,压缩打包后的文件放在CDN上,增量混淆打包,会通过Babel监控文件改动,实现实时打包。
4.客户端通过JSCore引擎加载ReactNative打包文件
5.后期View更新 后期设计师模板市场如果增加了新的容器和基本元素,例如新的公司统一格式加载圈,可以通过增加原有的React Componet API来实现,API更新后通过App强制升级的方式下发给客户端。 React Native通过JS调用原生View渲染的方式实现了类原生的渲染,同时React采用虚拟Dom技术让渲染效率更高。在这个方案里更值得一提的时,React Native实现了类原生的基本容器和元素,并可以通过ECMA Script来定时各种View,基本的View元素还是原生渲染。所以这样就实现了View可以随时更新。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom