作者:闲鱼技能——古尘

前语

本文从KUN在闲鱼落地为起点,介绍如何经过KUN完成Web和Flutter技能增强你的移动运用程序。

在结合了Web和Flutter的各自优势,以及它们背面良好的生态和社区支撑,你能用它来掩盖你的一切上层事务,达到更佳的动态化作用。

介绍KUN

KUN 是一个让开发者运用 Javascript,HTML,CSS进行开发,运用Flutter进行增强的跨端开发结构。

KUN 应用开发流程【实用教程】

为什么挑选KUN

首先咱们分析下Flutter与H5的情况

  • Flutter:
    • 长处:UI达到像素级跨端水平,事务逻辑一致性得到确保
    • 缺点:工程打包本钱较高,仍依靠发版,缺乏页面级动态性
  • H5:
    • 长处:页面动态性强,发版迅速
    • 缺点:体会性较差,复杂交互完成困难

KUN是结合闲鱼技能在flutter技能领域的天然优势,去混合衔接 JS 生态 & Flutter 生态,经过愈加开放 & 愈加轻量化的设计,在功率、体会、通用性上去取的最佳平衡。

KUN工程化体系

KUN很好的复用前端的工程化体系

  • KUN完成了标准W3C的子集,能很好的接入前端体系。这样能够让事务同学”零”学习本钱就能够上手 KUN 的开发,一起运用 Web 技能开发的运用也能很容易地迁移到 KUN 上。

  • 作为世界上最活泼的开发者群体 — Web 开发者,以及庞大的前端生态体系,KUN允许开发者运用社区中已有的 100W+ npm 包来协助事务进步开发功率

  • 老练的前端配套开发东西,你能够运用 VSCode、WebStrom 进行代码的编写,运用代码提示和 ESLint 规矩检测来确保代码质量,运用 jest 等单元测试东西来,运用 webpack 进行代码的打包等等。

KUN对原有前端工程化的改变

  1. 为KUN容器完成新的脚手架,用于创立KUN的前端运用
  2. 在发布产品渠道/离线包预置渠道添加 KUN产品 (JSBundle/ByteCode)
  3. 在前端监控体系添加KUN容器反常监控
  4. 在功能渠道添加计算KUN容器发动时长、白屏率、加载失败率等数据

KUN在闲鱼的落地

闲鱼超市/我发布的/闲鱼号

KUN 应用开发流程【实用教程】

读者能够下载最新版闲鱼客户端翻开闲鱼超市/我发布的/闲鱼号,体会KUN容器带来的体会升级。

后续KUN将会接入更多闲鱼中心事务。今年闲鱼双十一会场会运用KUN容器。这是一次对KUN的机遇和应战。

回到主题,为了确保前端事务在KUN容器中落地,KUN打通了闲鱼的前端开发链路。

下面介绍下如何运用KUN进行开发

开发流程

1.准备工作

  • 装置前端依靠
    • 装置 NodeJS
    • 装置 DEF 前端集成开发环境

DEF 是由 淘宝前端团队 建议的工程化前端开发生态体系。经过配套的标准、东西、流程界说、权限管理以及数据日志进步前端开发功率,确保团队开发过程的一致性和可仿制性,进步代码质量和安全。

$ npm install tnpm -g --registry=http://registry.npm.alibaba-inc.com
$ tnpm install @ali/def@next -g
  • 装置 Rax 套件

Rax 是阿里巴巴运用最广泛的跨端解决方案,支撑开发者经过类 React DSL 编写 Web、小程序、Flutter 等不同容器的跨端运用。

  • 恳求发布环境
    • Def(前端代码发布渠道)(后边计划接入闲鱼自研前端发布渠道-魔鱼)
      • 库房发布类型挑选 跨端发布
      • 项目创立运用闲鱼CLI创立
      • 其他详见Def发布流程
    • ZCache(客户端资源离线包缓存)

ZCache 能够让前端在 ZCache 发布渠道将页面运用的 html、js、css 等资源打包,客户端会在合适的机遇下载或许直接预置的方法将资源保存到本地,使得用户在阅读页面的时分不需求再去下载资源,有效进步 Web、Weex 、Kun等页面的加载功能,改善用户体会。

2.接入闲鱼KUN根底库

将闲鱼前端根底库改造适配KUN容器

比如:@ali/pcom-fin-windvane,代码中添加isKun(在KUN容器运行时存在全局变量kun),因为KUN容器完成了80%+集团动态化标准,因而只需求改动部分库来适配KUN容器

@ali/pcom-fin-windvane 是封装了客户端供给给前端的JSAPI的前端根底库

var isKun = typeof kun !== 'undefined'; //判断当时环境是否为KUN容器

@ali/pcom-fin-windvane:

KUN 应用开发流程【实用教程】

事务中运用KUN后,需求改动的库:

"alias": {
    "@ali/pcom-fin-mtop": "node_modules/@ali/pcom-fin-mtop",
    "@ali/pcom-fin-api-fallback": "node_modules/@ali/pcom-fin-api-fallback",
    "@ali/pcom-fin-user": "node_modules/@ali/pcom-fin-user",
    "@ali/pcom-fin-windvane": "node_modules/@ali/pcom-fin-windvane",
    "@ali/pcom-fin-umidware": "node_modules/@ali/pcom-fin-umidware",
    "@ali/pcom-fin-tracker": "node_modules/@ali/pcom-fin-tracker",
    "@ali/uni-user": "node_modules/@ali/uni-user"
  },

3. 开发

前端

开发环节不在本篇文章赘述,Rax 遵循 React 的语法,概况能够检查 Rax 文档 自行学习或上网查阅 React 资料专项学习,这儿只做开发流程说明。

build.json 是整个Rax运用构建相关的装备文件

需求将inlineStyle设置为true,KUN容器目前只支撑JS产品/ByteCode产品,KUN计划在S2完成Html+CSS+JS三种产品方法,将开发体会对齐H5开发。

{
  "targets": ["kun", "web"],
  "kun": {
    "mpa": true
  },
  "web": {
    "mpa": true
  },
  "plugins": ["@ali/build-plugin-rax-app-def", "@ali/hmr-watch-node-modules"],
  "inlineStyle": true
}

客户端

假如完成复杂&体会好的组件,比如我发布的页面的降价面板的刻度尺(读者能够经过闲鱼我发布的页面点击降价按钮进行体会),这个就需求在客户端进行组件界说。

KUN 应用开发流程【实用教程】

  • 界说刻度尺组件

KUN 应用开发流程【实用教程】

  • 组件完成 完成一个刻度尺Widget,这儿能够将闲鱼沉积的组件界说到KUN容器,让前端体会能够获得更复杂的交互(如 左滑删除、视频组件、嵌套滚动、Lottie、相册等)

KUN 应用开发流程【实用教程】

  • 前端调用 组件界说的特点是与前端同学约好,为后续完成一码多端组件

一码多端组件是支撑H5和KUN容器的组件,确保前端事务能够完成降级H5展现

KUN 应用开发流程【实用教程】

4. 调试

  • 运用devtools(与Chrome Devtools才能对齐)
    • 阅读器拜访devtools://devtools/bundled/inspector.html?ws=x.x.x.x:9222 x.x.x.x表示当时手机IP
    • devtools完成日志输出/节点检查/样式调试/检查源文件/滚动联动/网络恳求等才能
      KUN 应用开发流程【实用教程】

为了解决获取手机IP的问题,前端同学开发了@ali/rax-kun-devtools插件,在扫码的一起,主动翻开阅读器拜访devtools。原理是rax-app为插件扩展了运行时定制的才能。before.start.runafter.start.compile

before.start.run — 调用机遇:webpack履行之前 after.start.compile –调用机遇:编译结束,每次从头编译都会履行 详细可见rax-app运行时定制才能

KUN 应用开发流程【实用教程】
KUN 应用开发流程【实用教程】

  • alert,依照前端开发习气,KUN容器也完成了弹框显现的才能
  • 运用Android Studio检查JS日志和客户端 Flutter日志,用dart devtools排查页面在容器中的功能。【引荐】客户端同学开发KUN页面运用

5. 埋点

  • 接入Flutter埋点库,经过桥接方法将方法暴露给JS侧。
  • Flutter实践调用的是Android/iOS封装的methodChannel,与客户端埋点对齐 接入flutter封装的埋点库,事务数据计算口径一致依照客户端方法进行拉取

KUN 应用开发流程【实用教程】

依照不同详细事务场景,KUN容器也供给了容器报表数据,从router时刻/loadBundle时刻/evalBundle时刻/mtop时刻/白屏时刻/首屏加载时刻多个维度分析

KUN 应用开发流程【实用教程】

6. 发布

  • DEF发布渠道,在预发/正式进行发布
  • 运用Zcache离线包缓存拉取机制,进步离线包产品加载的成功率,目前离线包下载成功率在99%左右。经过不同的离线包装置方法确保加载成功率。

ZCache 包主要有以下三种装置方法:

  1. 拜访时装置:在用户初次拜访后装置,之后每次守时更新时会尝试更新到新版别。假如用户长时刻未运用就会将这个 ZCache 包淘汰掉,并移除一切本地文件。

  2. 闲时装置:不需求用户拜访,就会在守时更新期间主动装置。

  3. 发动装置:采用发动装置的方法,提前推送和预热资源,进步用户体会。

KUN 应用开发流程【实用教程】

7. 反常监控

  • JS触发Error事件,在quickjs内部会回抛反常出来,将该反常数据一致上签到flutter高可用itrace中,进行实时反常监控。并设置5分钟反常钉钉告警

iTrace Flutter 高可用能够全面监控Flutter运用线上的运行情况,观察用户真实体感,让用户体会进步更简略。

KUN 应用开发流程【实用教程】
KUN 应用开发流程【实用教程】

  • KUN容器完成了window.onerror和window.onunhandledrejection,前端能够运用前端自己的反常监控体系进行监控(JSTracker

JSTracker是端到端的前端监控与数据分析渠道,掩盖用户体会、安全出产等方向,打造实时监控、多端掩盖、智能化的数据渠道

KUN 应用开发流程【实用教程】

8. 降级

触发降级的场景

KUN 应用开发流程【实用教程】

URL中带降级链接 kun_downgrade_url为降级链接

降级链接中会添加kun_downgrade=true,来表示是KUN降级过来https://xxx?kun_downgrade=true&…

XXX.html?kun=true&kun_downgrade_url=XXXX

前端控制版别降级

/* global __kun_downgrade__ */
import { isKun } from 'universal-env';
export const downgrade = () => {
  if (isKun) {
    const config = {
      url:'XXX', // 指定降级URL
      //装备支撑区别渠道ios、android
      ios: {
        //能够依据体系版别、手淘版别、kun版别、设备类型承认降级条件
        osVersion: '',
        appVersion: '<7.8.6',
        kunVersion: '',
        deviceModel: []
      },
      android: {
        osVersion: '',
        appVersion: '<7.8.6',
        kunVersion: '',
        deviceModel: []
      }
    };
    __kun_downgrade__(config);
  }
};

跋文

本篇文章简略总结了KUN 从准备、开发、调试、监控、发布的流程,让咱们对KUN的开发流程有所了解。在此提下KUN的初衷

咱们期望在面向中小规划的大前端/大终端的安排中,找到一种真实合适的、长期性的、通用型解决方案。解决包含咱们闲鱼技能团队在内的,大前端/大终端所面对的前端用户体会低、客户端效能低、团队技能分裂、技能协作本钱高等一系列问题。

随着KUN在闲鱼事务中的逐步落地,大前端/大终端变得不再悠远。 最后引KUN的开篇文章那句话:

KUN是一个新物种,让咱们尽力去完善它

参考资料

【1】Rax官网

【2】这一年,我对终端安排与技能架构的思考

【3】大终端领域的新物种-KUN