nanachi是Qunar开发的多端小程序转译框架。使用React语法开发,实现一处编写、多端运行,极大地提升了咱们的开发效率。目前Qunar已经使用该框架成功上线各大小程序、快应用平台,nanachi成为公司小程序开发标准技术框架。html
nanachi官网: rubylouvre.github.io/nanachi/ind…前端
npm install nanachi-cli -g # 全局安装nanachi转译器
nanachi init your_project_name # 初始化模板项目
cd your_project_name && npm install
nanachi watch # 编译项目,默认编译微信,其余平台须要传入对应参数,如watch:ali、watch:bu、watch:h5...
复制代码
编译分为build和watch模式,watch模式会自动监听代码变化从新构建。webpack
H5编译的watch模式会在本地启动webpack-dev-server,方便实时调试。git
用nanachi的方式编写React SPA应用,与传统浏览器开发相比,有如下优点:github
若是已使用nanachi开发了小程序应用,H5方案适用于如下场景web
H5方案代码编译过程分为三个阶段:shell
小程序中存在不少标签,在浏览器端没有对应的原生实现,咱们首先要对这些标签进行转译。npm
对一些基础标签,会进行直接的标签替换:小程序
对一些复杂的组件,咱们实现了一套组件库,schnee-ui,用来抹平浏览器和微信原生标签的差别。微信小程序
schnee-ui官网: qunarcorp.github.io/schnee-ui/i… 编译时咱们会自动导入组件依赖:
![]()
开发太小程序的同窗知道,小程序分为App、Page、Component三级结构,对于页面(Page)组件,咱们对代码进行以下处理:
对于App组件,代码处理以下:
在App中挂载PageWrapper组件,这是咱们整个应用的容器,主要职责是渲染页面栈。
咱们在浏览器端实现了一套和微信小程序兼容的API,而且同时支持Callback和Promise的方式接收回调信息。
组件的设计方面,咱们也保持和微信小程序写法彻底一致。除了一些基础的按钮、选择器、switch开关等,还包括了一些通用的复杂业务组件,好比城市选择器、轮播图、日历等。
实现了浏览器端没有的标题栏和tab栏:
React方案里缺乏一些小程序端的生命周期,咱们会在浏览器端模拟实现,在特定的时机触发对应的钩子:
小程序的页面堆栈行为是各平台管理的,到浏览器端咱们就须要本身维护一套页面管理方案,同时要和微信端保持一致。 咱们会在内部定义一个__currentPages数组,用来存储页面的React实例,并实现本身的路由方法,管理这些实例。
同时模拟了小程序的最大页面数概念,对微信来讲目前能保持最多10个页面。咱们每次调用navigateTo方法时会检查当前页面栈长度是否达到最大值,达到则先推出数组的第一个元素,再存入新页面实例。
路由管理的实现过程主要遇到两方面的问题:
如何更新地址栏
须要在调用路由方法时同时改变地址栏,对navigateTo咱们调用history.pushState,redirectTo调用history.replaceState方法,实现地址栏的更新
如何保证调用API返回与浏览器原生返回事件行为一致
咱们知道浏览器原生返回操做会触发popstate事件,因此能够监听这个事件而后调用咱们内部的API方法,达到行为一致。设计方案以下:
小程序的样式是自然具备局部做用域的,到浏览器端样式会变为全局样式,必然出现样式污染问题,解决方案有如下几种:
咱们采起的是最后一种方案,计算样式文件和它对应的js文件共同父级目录的MD5值,做为关联二者的惟一hash,分别添加到jsx标签和style文件的标签选择器上,实现局部样式效果。
nanachi做为多端转译框架,已经成为Qunar小程序的开发标准,其跨端特性极大地提升了开发效率。对H5端的支持也让咱们能够快速上线与小程序功能一致的touch应用。相较传统React开发,咱们维护了与微信高度一致的组件和API,开发者不用再去引入各类第三方组件库来实现一些复杂功能;同时路由行为也由框架层维护,进一步减轻开发负担;最后能够实现零配置打包上线,也支持业务自定义各类Webpack配置,简单灵活。
最后欢迎你们试用nanachi,帮咱们提issue、PR,咱们会第一时间解决或提供支持。
项目地址: github.com/RubyLouvre/…