拥抱大前端——weex实践

Situation

2018-03-15公众号《移动开发前线》发布了一篇文章。讲述了《移动开发前线》将与《前端之巅》合并。为何选择与前端合并?《移动开发前线》创立者徐川这样说:

2015 年,我在 QCon 上听了鬼道的演讲《Native 与 Web 的融合》,后来还专门弄到他的书《跨终端 Web》学习,我认识到终端 Web 化是不可避免的趋势,虽然在智能移动设备上,这个进程更加曲折。但从 Hybrid、React Native、PWA 的演进来看,这个过程没有停止。2017 年,我写了《当我们在谈大前端,我们谈的是什么》,组织的第二届 GMTC 大会的主题也正式定为大前端,吹响了进军大前端的号角。
现在到了 2018 年,小程序达到 10 亿用户、苹果全面拥抱 PWA、谷歌收紧非公开 API 使用,一切迹象都表明,移动 Web 的时代全面到来了。很多移动开发者在过去两年可能会有点迷茫,感觉没有出路,大前端是我向大家建议的一个方向。我们需要去拥抱大前端,就像我们最开始拥抱移动开发一样。

Confliction

在5年前,我还是前端开发。我们尝试了Sencha Touch+PhoneGap和Titanium来开发跨平台的移动端App。因为性能达不到要求,开发成本,生态环境,硬件性能等等原因。最终,我们全面转向了移动(Native)开发。而我转型成为了iOS开发。

现在的整体的技术趋势是大前端。似乎需要移动(Native)开发者也能具备前端开发的能力,成为大前端开发者。但是令人忧心的是,有不少移动(Native)开发者之前根本没有开发前端经验。那我们应该如何拥抱变化,拥抱大前端呢?

Answer

选择weex开发一个实际简单的项目是一个很好的开始。

接下来的内容,我将尽量站在纯移动(Native)开发者的角度,通过几个问题和一个实际项目,来描述如何通过开发weex来帮助大家拥抱大前端。

为什么是weex?

Weex是阿里自研的、高性能、跨平台、移动开发框架,最大的特点是解决了频繁发版和多端研发两大痛点, 一套代码适配Android、iOS、 移动WebPC Web等多端,极大地解放开发者的同时又保证了用户体验。从2016.6月开源,之后又捐给了Apache基金会。如果你没听过weex,那你已经落伍了。

但是Weex令人诟病的问题也很多:担心有人生没人养、文档不全、文档不够友善、坑多、Issue没人解决、生态环境等。

文档不全那是你要找对地方https://weex.apache.org/并且语言选择看英语。Issue看这里。坑确实有一些,不过你要是学会看源码了解原理也不成问题。生态环境确是需要慢慢培养,可用的轮子相对有点少,所以现在还是Apache孵化项目。

但最重要的是weex可以使用Vue作为DSL开发。Vue中文文档齐全,学习曲线相对平缓,简单容易上手。也能使用Vue开发诸如移动WebPC Web、公众号、小程序等。能做到learn once, write anywhere甚至能write once, run anywhere。值得一提的是,weex也可以选择Rax来作为DSL开发。Rax和React的关系相当于,preactreact的关系。所以你想入门react,weex也可以是一个很好的起点。

另外weex也需要大量的native实现,作为native开发者在native您有很强的参与感。

PS:如果你对以上专有名词不是很了解也没关系,那不影响你开发,暂时忘记这些。

如何开始weex?

虽然说Vue学习曲线相对平缓,简单容易上手。

但是,但是,但是还是得要学习的。

关于语言,学习js(es6),这个就够了http://es6.ruanyifeng.com/。先不要着急弄清TS和JS什么关系,也不要管JS和ES6啥关系,也不要急着开始用TS开始写。

关于Vue,官方文档不能再好了https://cn.vuejs.org/v2/guide/

关于Weex,看官方文档https://weex.apache.org/跟着能跑起项目就可以了。

其实以上这些都不着急,可以通览一遍,跟着实际项目边学边做,边做边学。这个问题下的核心答案其实是,确定一个合适的简单的实际项目来开始您的星辰大海。

如果不是一个实际项目,很难检验学习成果。

什么实际项目是适合的简单的呢?

我们用weex来做一个App吧?是新App,还是旧App重做呢?这显然太大了。不如把旧App的某些页面,比如有动态化需求或者本来就是h5做的改成weex吧,从一两个页面开始。这个我认为是合适的。

选择的页面本身业务不能太复杂,需要尽量简单作为一个开始。这个我认为是简单的。

因为是现有App项目的实际页面,那必然是一个实际项目,且还有一个非常明确的目标:体验和功能要和原来Native的一致。

实际项目

大概介绍下,希望能够帮助您评估工作量:有时3人,有时5人,一个月上线简单的首页,无加班。大概平均每人每天3小时,大部分时间还是在做native其他业务。其中只有我1人有过前端开发经验,iOS和android开发者都有。

简单的首页

iOS表现

android表现

碍于篇幅和能力的限制,我并不想把本文写成一个非常详细的教程。想讲的的是思路,思考,感想,过程。毕竟别人说的再详细,还是得要实践出真知。


确定目标

  • 首页体验和功能和native版保持一致
  • 首页动态化:能够动态改变入口,配合活动和各种节日动态更新
  • 能够灵活的跳转App内的其他native页

调研

  • 对首页功能进行分析
  • 跑起weex官方demo和文档
  • 了解简单的原理和基本概念
  • 了解flex布局
  • 了解平台的差异
  • 了解weex支持Vue哪些功能

(以上官方文档足够)

重要的结论:

  • weex官方功能大部分都能涵盖,可能需要fork一份改源码。比如我们能够看到首页适配里的滚动图,weex对应的官方组件里有slider
  • weex在native层的三个重要概念
    • components UI组件
    • modules 功能模块
    • protocol/adapter 部分功能需要接口实现或扩展
  • 为了夸平台
    • native层面需要iOS和android各自实现相同功能
    • 需要iOS和android的Native开发者都参与
  • Vue部分并不是很困难,Native开发者也可以搞定

跑起Vue的项目

使用weex-toolkit,按照教程创建运行。weex-toolkit是有人积极维护的,可以去提Issue。

跑起项目以后会有一个网页,上面有二维码。使用官方App Demo扫码能够执行。

值得一提的是,支持hot load。

真实的bundle JS地址为
http://ip:port/dist/index.js

参考官方naitve代码,在自己的native项目里创建viewcontroller和activity

你可以写死js的url,但最好的方式是把官方扫码demo搬过来

不考虑使用scss、less、pug等,直接写css、html、es6

摆弄您的代码,先把UI做成首页的样子。当中可能会遇到很多问题,那些不是坑,而是您可能对前端不了解。克服这些问题,您才能再进一步。

值得一提的是:
需要考虑好高度的适配。比如iPhoneX的刘海,比如status bar,比如navigation bar,比如tab bar。按照我们首页的例子,我们的weex页面等同于整个屏幕,我们使用js代码动态的留出了顶部和底部区域,理由是这样最为灵活。

需要理解weex中css特殊单位:wx。参考这篇

遇到问题多看源码。

使用调试工具

您可能不幸会遇上weex debug装不上,参考weex-debugger的issue应该能帮您解决。

开始写业务代码

  • 一定要了解promise
  • 可以不使用async/await
  • 学以致用Vue、css、css animation、ES6
  • 网络请求一个好的推荐weex-axios
  • 如果有点追求的话,建议加上ESLint
  • 在js中断点你可以在代码中写debugger

摆弄您的代码,实现原来的功能。当中可能会遇到很多问题,那些不是坑,而是您可能对前端不了解。克服这些问题,您才能再进一步。

发现问题,解决问题

  • 比如您可能会发现图片加载不出,原来是需要在native实现一个协议/接口
  • 比如有些UI样式或组件weex不支持,我们可以扩展components
  • 比如我有分享功能该怎么实现?你可以使用您原来native的分享代码,使用module封装给js使用
  • 比如埋点怎么埋?native包装,或者js自己实现,或者js加载一个可用的库
  • 比如native暴露的异步方法和同步方法的区别
  • 比如线程问题,看看源码你就明白了
  • 比如一些组件想复用,你可以学习Vue的组件开发方式,自己封装
  • 一些轮子或者代码上的参考可以参考weex-ui。也可以去weex market试试运气。到后期你甚至可以像weex-ui一样发布自己的weex UI组件或者weex plugin。
  • 比如解决嵌套滚动手势问题等。解决不了,改源码吧。本来在native层面也是老大难问题,所以不要想weex就帮你简单搞定了。
  • 比如要改源码。源码是一定要改的。不是因为weex烂,而是很多东西是你们自己业务特有的,人家也想不到。改源码的话,尽量扩展吧。然后要保留官方git remote,将来还有机会升级。

这个时候您发现需要在双端写大量的代码,或者封装原来的代码,实现接口已达到双端一致的效果。

注意,如果你想要做到三端复用,web端也得实现。但这不是我们的目标。虽然能做到,但是需要花费大量的工作量。

想好路由跳转怎么做,实现相关协议

关心的是:

  • native to weex
  • weex to weex
  • weex to native

针对业务的特殊性,去扩展module,注册自己的协议等

比如我们的请求需要对请求参数都要做md5校验,校验的签名需要放到请求头中。怎么做才能最快实现了呢?原本native就有相关代码,我们注册了自己的网络请求实现,在当中调用原来的native代码逻辑。iOS和android都一样。

值得一提的是:
为了高性能,要尽量避免weex和native通信。module尽量不要使用同步方法暴露。

准备上线了,代码下发怎么做?

可以参考的东西不少,全在网上。bundle包放在哪里,目录结构是怎么样的,都可以自定。

代码下发服务是我们自己做的。对的,使用node写的。这才叫真正的全面拥抱吧。

更高追求?

  • 降级方案
  • 三端复用
  • 增量更新
  • JS framework复用(减少bundle包大小)

总结

最后发现,我们写了不少iOS,写了不少android,写了Vue,工作量是1+1+1=3。但是随着时间,项目更迭,components和module还有Vue组件的积累。最终工作量会变成1。

在一个实际的简单而又不简单的项目中,作为native开发者您有自己的用武之地,也能有机会逼迫自己离开自己的舒适区去一个陌生领域学习,并且学以致用。以weex开发经历为基础去了解更多更广泛的前端知识,比如:webpack,TS,scss,stylus,less,babel,css3,pug,eslint,npm,karma,vue,react,angular等等。

很重要的一点是:拥抱大前端,不代表native开发过气了,没用了。希望大家都能拥抱变化,拥抱大前端。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Weex在达人店的一年实践 本文来自尚妆移动端团队路飞发表于尚妆github博客,欢迎订阅! 尚妆达人店接入wee...
    尚妆产品技术刊读阅读 3,394评论 3 38
  • 引子 这篇文章是笔者近期关于Weex在iOS端的一些研究和实践心得,和大家一起分享分享,也算是对学习成果的总结。文...
    一缕殇流化隐半边冰霜阅读 12,027评论 53 165
  • 2016年4月21日,阿里巴巴在Qcon大会上宣布开源跨平台移动开发工具Weex,Weex能够完美兼顾性能与动态性...
    晴天咚咚阅读 2,883评论 1 15
  • 【与泽齐新】数理妈妈思维营践行d21 抓棉花糖,猜有几个,凑五。 摆东西,摆的要比对方多。 比一比,谁多谁少。 读...
    嗨新新新阅读 65评论 0 0
  • 1、函数形参的默认值 在ES5中函数定义了参数,如果要设置默认值,则需要在函数内进行判断处理,例如: 而在ES6中...
    Zip_Wang阅读 497评论 0 50