如何在一个项目中兼容Wepy和Taro?
背景交待
NJ 项目启动初期,团队技术栈主要是基于 Vue,技术选择上就选择了类 Vue 的 wepy。迭代几个版本后 mpvue 出来了,简单调研了下,准备基于 mpvue-simple 开发部分页面,如果可行再慢慢切换其它页面,尝试后遇到一些问题,就暂时搁置了,还是沿用的 wepy 继续开发。
Taro 初现
在不久之后 Taro 横空出世,按照团队的情况简单对比了一下 wepy、mpvue、taro、原生组件开发。
LB 项目初期的情况是有一部分 wepy 沉淀,但是基本可以摆脱历史包袱,重新启动新业务项目,对于项目本身仅仅是一个活动小程序项目,不会做多端情况的考虑,在技术选择上因为各个技术方案基本解决的问题是多端开发以及在开发过程的舒适度上的提升。对于团队目前的情况来看,在几个小伙伴一起讨论后,还是基于 wepy 的方案来开发。
如何迁移 Taro 到 Wepy
NJ 项目本身还是基于 wepy,在迭代功能的时候,产品提出要做一个活动页面,这个活动可能在商城小程序中也会使用到,然后 NJ 继续迭代功能,需要考虑的是怎么复用商城项目组开发好的活动页面(商城项目基于 taro)。
- 跳转到商城小程序参加活动 [pass]
- 拷贝活动页面编译后的文件到 wepy 中直接使用 [cool]
如图,上述文件以及不需要的页面均可以直接删除,然后配置路由到 wepy project 的 app.json 。实际可能也有一些父级逻辑放置在 app.js 中,这个看自己的业务情况来定,我们项目还引入来 dva ,在 wepy 的 app.js 中增加来一个处理 dva 的文件。这个迁移过程总体来说简单容易很多,暂时不做过多描述。
如何迁移 Wepy 到 Taro
为来更为简单的迁移,这中间写了一个插件来处理公共业务,对于业务逻辑可以在回调中单独处理,具体可以参考 wepy-plugin-migratetotaro
NJ 项目经过长期迭代在线上稳定运行。同时另外一条业务线是基于 Taro 开发,也在疯狂开发迭代中。起因一次活动,XX 项目开发活动内容,NJ 项目正常需求开发,但是开发上线时需要复用 XX 项目开发好的活动页面。
由于 Wepy2 目前仍处于 alpha ,1.7.x 在开发中也遇见了不少的问题。问题虽然最终都能解决,而且作者很好沟通,咨询过几次问题也都能耐心指导解答,笔芯感谢。
再说项目实际情况,在迁移后要保证脱离 Taro 相关项目 Wepy 独立编译能够正常运行。
目录结构约定
- Taro
- src
- Wepy
- src
代码管理在 taro project 以子模块的形式管理 wepy project
git submodules
# 添加子模块项目
> git submodule add <taro project url>
# 初始化本地 .gitmodules 文件
> git submodule init
# 同步远端 submodule 源码
> git submodule update
.gitmodules 示例
[submodule <submodule_name>]
path = <local_directory>
url = <remote_url>
branch = <remote_update_branch_name>
迁移过程
默认配置 wepy 编译后的目录(这里建议配置到 taro 编译目录同级目录下的子目录。下文均以 Taro 编译目录 dist 为例,wepy 编译到 dist/wepy 目录下)
- 编译目标路径配置 wepy.config.js target
- 安装插件 wepy-plugin-migratetotaro (待开发整理发布)
- 加载机制 require('app.js') $instance (BASE)
- 页面自动配置所有,可以手动配置需要引入的 pages,但是编译还是会编译所有的,编译过程不可控。暂时部分页面引入控制略有问题,这里建议开发过程中以页面为维度来管理页面资源,编译后不需要的页面可以手动删除。
- 路由处理 页面路径配置按照编译路径最后一级文件夹自动更新引入路径中的 pages 的跳转路径 (BASE)
- 所有路径添加到子模块路由中或者主模块中 路由配置两种模式,pages 模式 和 subPackages/pages 模式。对应的配置位置不一致,这一点由插件编译处理。
- taro 组件在 wepy 中使用,在配置中新增 needComponents 配置需要使用组件的组件和页面。
迁移过程中问题分析
① annot read property '$pages' of undefined
// 页面初始化的时候 $createPage 中 this.$instance 不存在
if (typeof pagePath === "string") {
this.$instance.$pages["/" + pagePath] = page;
}
// this.$instance 来源于 $createApp
let app = new appClass();
if (!this.$instance) {
app.$init(this, appConfig);
this.$instance = app;
this.$appConfig = appConfig;
}
// appClass 来源于参数 对应 app.wpy
// 如果页面要单独执行必须加载一下 app.wpy 但是插件处理的是编译后的文件,这里只能在每个页面 page 中单独加入 require(wepy/app.js)
② 资源引用,建议图片视频等资源使用相对路径引用,如果项目已有绝对资源路径可以通过插件回调手动替换处理
③ Taro 组件共享,见后续 taro 组件共享使用方法
如何在 wepy 中使用 taro 写的组件
这种略待代码侵入的感觉,可以使用环境变量来处理,只是使用迁移编译时才生效插件的引入。我们使用插件引入这种是在自定义底部 tabbar 后有一个页面需要。
wepy page 中引入 taro 项目中的 demo 组件
config = {
... usingComponents: {
'demo': '/components/demo/index'
} ...
}
template 中使用组件
... <demo compid="demo"></demo> ...
父页面向子组件传递参数(配合插件配置 needComponents 使用,如果原生小程序或者其它框架需要使用 taro 组件可以使用类似方案)
// 按照实际情况修改 props 和 compId
taro.propsManager.set(
{
...props
},
compId
);
思索
wepy taro 解决的问题是什么?对于我而言。
一部分是追求与团队当前技术栈相契合的类似方案。
一部分是多端需求(最新的这个小程序是多个产品的数据整合,其中之前一个产品是 H5 对外可能微信小程序不是合适的选择,一个是小程序,如果统一到一起,后续小程序部分页面可能也会直接转 H5,后续还可能数据要整合到已有 APP,如此转 RN 等也是未来的需求),这一块是为以后做的考虑,如若不然还是原生的来的自然。
这中间更多的应该是思考,我们其实只是针对当前的产品选择一个适合自己的技术方案,不抱着某一种方案自始自终,也不抵触技术的更新,更多的还是需要在这业务堆积过程中不断沉淀出一些东西,然后不断更新自己的知识仓库,这个才是接下来自己要坚持完善的部分。
参考资料
wepy-plugin-migratetotaro
这是一个不相关的参考资料,可以微信扫码浏览一下就走
如何在一个项目中兼容Wepy和Taro?的更多相关文章
- 如何在一个项目中同时包含mvc建站、webapi接口
项目做得多了..就会发现有些小项目不想建太多的项目..现在思明在这里和大家分享一下如果再一个项目中同时包含mvc建站以及实现webapi接口 1.新建项目 aps.net web 应用程序 2 新建模 ...
- SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
要搭建的项目的项目结构如下(使用的框架为:Spring.SpingMVC.MyBatis): 2.pom.xml中的配置如下(注意,本工程分为几个小的子工程,另外两个工程最终是jar包): 其中 ...
- vue项目中兼容ie8以上浏览器的配置
1.首先需要在根目录的index.html文件加入如下代码 <meta http-equiv="X-UA-Compatible" content="IE=edge& ...
- 完美解决asp.net core 3.1 两个AuthenticationScheme(cookie,jwt)共存在一个项目中
内容 在我的项目中有mvc controller(view 和 razor Page)同时也有webapi,那么就需要网站同时支持2种认证方式,web页面的需要传统的cookie认证,webapi则需 ...
- 【Atom】在一个中/大型项目中,那些好用而强大的atom功能
作为一个学生党,一开始使用atom时候并没有意识到atom一些小功能的巨大作用,直到自己实习参与了项目,才知道这些功能在一个项目中是能极大提高工作效率的开发利器 下面是一位不愿意透露其姓名的彭 ...
- 转:C++项目中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __c ...
- C++项目中的extern "C" {}
from:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html C++项目中的extern "C" {} 20 ...
- 项目中logger、message错误信息的配置
申明:在一个项目中必不可少的是Logger和错误信息的配置,现在给出在我们常用的处理方法. —.创建一个ConfigUtils类和他对应的rah.properties文件和Test测试类 Config ...
- 【C++模版之旅】项目中一次活用C++模板(traits)的经历
曾经曾在一个项目中碰到过一个挺简单的问题,但一时又不能用普通常规的方法去非常好的解决,最后通过C++模板的活用,通过traits相对照较巧妙的攻克了这个问题.本文主要想重现问题发生,若干解决方式的比較 ...
随机推荐
- 让bootstrap表格自动出现水平滚动条
<div class="table-responsive"><!--表格自动出现水平滚动条-> <table id="tb_departme ...
- nginx 简单应用
从源代码编译 Nginx 把源码解压缩之后,在终端里运行如下命令: $ ./configure $ make $ sudo make install 默认情况下,Nginx 会被安装在 /usr/lo ...
- 知识的内化:学习、实践、输出(与Focus Feedback FixIt的原理是一致的)
一个人的能力分三个层次: 资源,比如知识.技能.经验.时间.精力.金钱.人脉等 应用流程,即使用资源解决问题的能力,包括做事的方法.流程.策略等,它是你整合应用资源创造价值的能力. 价值取向,即你觉得 ...
- DUI-模态对话框的实现
模态对话框要求自己实现自己的消息循环,当然,建议它还是处于主线程中,所以最好是由它再调用主线程的消息循环函数,此时主线程自身的消息循环函数被阻塞,等待模板对话框的消息循环函数退出 参考代码如下: 1 ...
- UILabel范例实现代码如下
#import "TWO_ViewController.h" #define SCREEN_Width [[UIScreen mainScreen] bounds].siz ...
- 事务 ( 进程 ID 60) 与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品
Select * FROM [TableName] With(NoLock) .....
- flask相关使用
一.手动创建一个干净的含有蓝图的flask项目目录 在init.py中 from flask import Flaskmy_app=Flask(__name__)def create_app() ...
- 零基础配置Hadoop集群——Ambari安装及配置详解
1. 准备工作 1.1. 系统环境 主机列表: IP地址 HostName 描述 192.168.610.153 ambari.server Ambari服务器 192.168.10.152 had ...
- hgoi#20190517
T1-Mike and gcd problem Mike给定一个n个元素的整数序列,A=[a1,a2,...,an],每次操作可以选择一个i(1≤i<n),将a[i],a[i+1]变成a[i]- ...
- 阿里云部署Redis服务器远程连接问题
昨天在阿里云免费领了一个月的云服务器,就着最近学的SpringBoot,准备做一个SpringBoot与Redis的整合. 因为以前用的Redis都是安装在本地的,使用过程中没遇到什么大问题,可是一旦 ...