referral组件化方案
更新记录
2021-6-2
- 暂时不用考虑通过配置展示组件
Overview
旧的 referral banner
https://docs.google.com/document/d/1Q5HFbfxmQsHNvaT–AKhdMuytENR7wanN5mrKakQ-1s/edit#
这次的需求
目前的 referral api
https://docs.google.com/document/d/13J8nulRH685vAgfn4FgSYNynp22V8MvSu6FHO1x7Ppk/edit#
Project diagram
- referral banner api 提供原始数据
- configure data 提供如何展示
- 组件模版
1 | // configure data |
1 | // raw data |
此需求包括 nodenewweb, email render, app(android/ios) 等不同平台,也可以兼容未来可能需要兼容的 vue,nuxt 等项目框架
Compatible with node new web service
首先先介绍下 nodenewweb 服务的基本情况,为了方便描述,下面称这个服务为 new web 项目。
我们的组件化方案将在 koa 中引入 mkt 组件包并且注册组件,其中 mkt 组件包提供所需要的 html string generator,然后在想要引用 mkt 组件的模版中引入组件模版,下面我们详细说一下在 new web 中如何集成 mkt 组件。
hello world
1 | // hbs_helper |
define props
1 | // referral-banner-component.js |
这里我们的组件需要外界提供参数,scope 来确定是在哪里显示的 feferral banner, 以及活动名字, 最终的显示效果。
inte with JSON
为了提供未来的灵活性和根据 api 下发数据以及展示,从而真正的减少代码发布,通过 admin 管理新的需求,我们需要根据 JSON 来确定如何展示数据。
mweb/web
对 mweb 和 web 分别提供组件
Compatible with email renderer service
email renderer 和 new web 类似,邮件客户端解析样式的能力比较弱,前端经常需要用 table 布局,需要把 flex 布局解析成客户端可以理解的 table。
Compatible with app
这部分暂时不在这个文档里面讨论
Project strcture
针对 node 层场景做 playground,待完善
优化方向
问:目前针对 new web 或者 nuxtnodenewweb 服务,需要写两套代码,探索一套代码编译生成不同包, 答:
- 一个问题是,提供给 new web 的是一个 html string provider(返回 html string 的函数), 提供给 nuxtnodenewweb 的是一个 vue component,两者有很大的不同。vue 的语法比 handlebars 强大非常多
比如 new web 包的占位符主要是组件的入参
vue component 包的占位符可能是入参,还有可能是 computed, method 等各种形式
举例在 vue component 包的模版可能是
1 | hello {computedVariabl} |
这样在 new web 服务中实际上无法识别除了入参之外的其他参数的(只能识别到 props)
所以暂时得针对不同的服务写不同的代码
- 还有一种可能的方案是,我们限制项目中 vue component 的能力,比如我们规定不能使用 computed
1 | // vue component |
这样的话我们的代码就可以在 new web 和 vue 中同时运行,但是这样会减少很多 vue 的功能和灵活度
如何在 new web 项目中对外通信
如何减少样式冲突?