小程序的设计并没有完全遵循 Web 规范,导致小程序生态和传统 Web 开发生态之间的割裂,海量优秀的 Web 物料并不能直接用于小程序开发。因而 Taro 在相当一段时间内生态都相对薄弱,UI 框架选择不多的问题更是深深困扰着开发者。
另一方面,业界有着存量的 H5 应用,中短期内 H5 应用适配到小程序端的需要还会存在。我们希望能减少 H5 应用迁移到小程序端的成本,甚至能够直接运行在小程序端。
Taro 团队一直在思考如何最大限度地在小程序环境中复用 Web 生态,直到 Taro 3.0 诞生后,这种想法有了落地的可能。下文将介绍基于 Taro 3.0 实现 H5 同构的思路与问题,以及我们尝试适配了三大移动端 UI 框架 WEUI 、 Ant Design Mobile 、 VantUI 的实验结果。
Taro 3.0 是一款重运行时的跨端框架,它通过模拟实现浏览器的 BOM 和 DOM API 实现了对 React、Vue 等 Web 开发框架的兼容。
既然已经有了浏览器环境的 BOM 和 DOM API,Taro 应用和 Web 应用之间的鸿沟在于小程序组件和 HTML 标签之间的差异。
Taro3 的渲染数据流如下:
前端框架 ->Taro DOM ->小程序 data
HTML 标签和小程序组件的标签名、属性、事件是有差异的,而前端框架无需感知这些差异。
因此前端框架适配层、Taro DOM 层不需要改动,只要在 Taro DOM 序列化为小程序 data 这一步作映射即可。
HTML 标签相对小程序组件封装程度更低、功能更简单,可以看作是小程序组件的子集。因此可以按一定的规则,把 HTML 标签映射为小程序组件,如:
完整的标签名映射规则请看: RFC 附录一
如果 HTML 标签的属性能在对应小程序组件的属性上找到对应,则进行映射,如:
完整的属性名映射规则请看: RFC 附录二
把 HTML 特有的事件在小程序端找到相似的事件进行映射,如:
完整的事件映射规则请看: RFC 附录三
前文介绍了我们会把 HTML 标签映射为小程序组件,但是 H5 应用中使用到的 CSS 标签选择器就会失效。
因此 Taro 使用了类名去进行模拟:
Taro 提供两种内置的浏览器默认样式,可以直接引入生效:
理想很美好,但现实却略显骨感。即使 Taro 能实现 BOM、DOM API,支持使用 HTML 标签等,同构方案还是存在着一些框架层面抹平不了的差异。以下列举出若干主要限制:
在 H5 中我们可以调用 DOM API 同步获取元素的尺寸:
但是在小程序中,获取元素尺寸的 API 是异步的:
因此不能兼容那些使用了同步 DOM API 去获取元素尺寸的组件。
<canvas>、 <video>、 <audio> 等标签在 H5 端可以直接调用 HTMLElement 上的方法:
但是在 Taro 中,要调用组件上的原生方法,必须先创建对应的 Context :
部分样式或 CSS 选择器在小程序中不支持,如:
首先需要安装 v3.3 的 CLI 工具:
然后进入项目,把 package.json 文件中 taro 相关依赖的版本修改为 ^3.3.0-alpha.2 ,再重新安装依赖(建议先把 node_modules 文件夹删除)。
为了节省项目空间,同构功能是可选的,以 Taro 插件的形式提供。
首先开发者需要安装插件 @tarojs/plugin-html :
然后配置使用此插件:
为了验证同构功能的可用性和效果,我们对 CSS 样式库 WEUI 、React 组件库 Antd Design Mobile 、Vue2 组件库 VantUI 的所有组件进行了测试。
测试效果比较理想,甚至稍微超出我们的预期,配合各组件库自身的按需加载能力,能以小巧的体积使用丰富的组件,相信各位开发者会喜欢这个功能。
仓库地址: taro-weui
WEUI 是一个 CSS 的样式库,与框架无关,兼容性比较高,大部分组件能直接使用。
仓库地址: taro-antd-mobile
能直接兼容使用的组件大概为 80%,主要问题在于:
仓库地址: taro-vant
VantUI 的组件十分丰富,能直接兼容使用的组件大概为 70%。部分开发者会在 Taro 中配合使用 Vant Weapp,但 Vant Weapp 只能运行在微信小程序,因此对 VantUI 的直接适配是一个很好的补充。
适配过程主要遇到的问题有:
同构方案还在持续优化中,部分实现还没有最终定稿。欢迎各位开发者到我们的论坛下留言,提出您的宝贵意见~: 同构方案 RFC 。
欢迎关注凹凸实验室
前端三大框架,是Angular、React、Vue,这三个框架现在是最为流行也是最多人用的框架。React:
1.声明式设计:React采用声明范式,可以轻松描述应用。
2.高效:React通过对DOM的模拟,最大限度地减少与DOM的交互。
3.灵活:React可以与已知的库或框架很好地配合。
优点:
1.速度快:在UI渲染过程中,React通过在虚拟DOM中的微操作来实现对实际DOM的局部更新。
2.跨浏览器兼容:虚拟DOM帮助我们解决了跨浏览器问题,它为我们提供了标准化的API,甚至在IE8中都是没问题的。
3.模块化:为你程序编写独立的模块化UI组件,这样当某个或某些组件出现问题是,可以方便地进行隔离。
4.单向数据流:Flux是一个用于在JavaScript应用中创建单向数据层的架构5.同构、纯粹的javascript:因为搜索引擎的爬虫程序依赖的是服务端响应而不是JavaScript的执行,预渲染你的应用有助于搜索引擎优化。6.兼容性好:比如使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。它们使得那些艰难的任务不再让人望而生畏。缺点:React本身只是一个V而已,并不是一个完整的框架,所以如果是大型项目想要一套完整的框架的话,基本都需要加上ReactRouter和Flux才能写大型应用。
Vue:
Vue是尤雨溪编写的一个构建数据驱动的Web界面的库,准确来说不是一个框架,它聚焦在V(view)视图层。
它有以下的特性:
1.轻量级的框架
2.双向数据绑定
3.指令
4.插件化
优点:
1.简单:官方文档很清晰,比Angular简单易学。
2.快速:异步批处理方式更新DOM。
3.组合:用解耦的、可复用的组件组合你的应用程序。
4.紧凑:~18kbmin+gzip,且无依赖。
5.强大:表达式无需声明依赖的可推导属性(computedproperties)。
6.对模块友好:可以通过NPM、Bower或Duo安装,不强迫你所有的代码都遵循Angular的各种规定,使用场景更加灵活。
缺点:
1.新生儿:Vue.js是一个新的项目,没有angular那么成熟。
2.影响度不是很大:google了一下,有关于Vue.js多样性或者说丰富性少于其他一些有名的库。
3.不支持IE8。
Angular:
Angular是一款优秀的前端JS框架,已经被用于Google的多款产品当中。
它有以下的特性:
1.良好的应用程序结构
2.双向数据绑定
3.指令
4.HTML模板
5.可嵌入、注入和测试
优点:
1.模板功能强大丰富,自带了极其丰富的angular指令。
2.是一个比较完善的前端框架,包含服务,模板,数据双向绑定,模块化,路由,过滤器,依赖注入等所有功能;3.自定义指令,自定义指令后可以在项目中多次使用。
4.ng模块化比较大胆的引入了Java的一些东西(依赖注入),能够很容易的写出可复用的代码,对于敏捷开发的团队来说非常有帮助。
5.angularjs是互联网巨人谷歌开发,这也意味着他有一个坚实的基础和社区支持。
缺点:
1.angular入门很容易但深入后概念很多,学习中较难理解。
2.文档例子非常少,官方的文档基本只写了api,一个例子都没有,很多时候具体怎么用都是google来的,或直接问misko,angular的作者。
3.对IE6/7兼容不算特别好,就是可以用jQuery自己手写代码解决一些。
4.指令的应用的最佳实践教程少,angular其实很灵活,如果不看一些作者的使用原则,很容易写出四不像的代码,例如js中还是像jQuery的思想有很多dom操作。
5.DI依赖注入如果代码压缩需要显示声明。
web前端开发入行门槛低,前景好,如今web前端开发是众多年轻人的选择之一,毕竟现在互联网的迅速发展,使得这门行业不断走俏,web前端越来越得到企业的重视,很多企业都会用到这门技术开发,但当下经验丰富的web前端开发工程师的人才不多。
当前web前端相关职位空缺相当大,发展前景广阔,初级web前端岗位起步月薪在6K-10K左右,在技术增长、业务熟练之后往往可以达到20K-30K,而且市场的供不应求导致大前端岗位薪资水涨船高。特别是在一线城市北上广深,招聘需求特道别大,相对来说好找工作一些,总的来说是一线城市急需web前端人才,二线城市紧随其后。
其次就是web前端人次可选工作岗位很多,可选行业也很多,岗位可回选APP开发工程师、答小游戏开发工程师、JS开发工程师、全栈工程师、H5开发工程师、小程序开发工程师、web前端工程师、web开发工程师等,学完web前端课程基本都可胜任以上岗位。