首页IT科技uniapp内嵌h5解释器(uniapp+h5混合开发)

uniapp内嵌h5解释器(uniapp+h5混合开发)

时间2025-06-15 01:50:43分类IT科技浏览4628
导读:为了减少app频繁上架,频繁更新,决定放弃纯uniapp开发,改用uniapp(后续简称uni +h5的方式进行混合开发。...

为了减少app频繁上架            ,频繁更新                      ,决定放弃纯uniapp开发       ,改用uniapp(后续简称uni)+h5的方式进行混合开发            。

技术选型:

整个app架子用uni(vue3)         ,h5采用vue3+vant4                     ,然后使用uni的webview进行页面控制                      。由于我们是由vue2升级到vue3           ,所以之前的一些代码需要做调整      ,这里自己去看一下vue2和vue3的区别       。在技术选型上也本着一个原则                    ,如遇技术冲突               ,就以uniapp为主   ,h5只做页面展示         。

其中还有几个点在这次升级中也提出来了                   ,考虑到篇幅问题                   ,这里只贴关键代码

1            、页面跳转问题,uni有路由管理               ,h5也有路由管理                      ,由于所有的h5界面都采用web-view方式访问   ,所以h5界面在开发的时候规定了不允许使用window.open(在ios系统中有可能出现无法使用的情况)和location.href方式跳转            ,也禁用了h5的路由方式跳转                      ,代码如下: //uni获取webview访问路径 //该页面名称vuePage <template> <view> <web-view :src="indexUrl" @message="getMessage" @onPostMessage="getPostMessage"> </web-view> </view> </template> onLoad(param) { let _this = this let url=decodeURI(param.vuePage) url=base64.decode(url); //"/app_dyg"+url 前端路由地址 _this.indexUrl = 前端访问地址+"/app_dyg"+url }, /** * 保留当前页面       ,跳转到vue界面         ,这种方式不需要全路径                     ,只需要页面的路由 * @param url */ const navigateToVueView = (url) => { url = Base64.toBase64(url) window.uni.webView.navigateTo({ url: ../vuePage/vuePage?vuePage= + encodeURI(url) }) }

这种方式就是h5界面调用uni提供的路由跳转接口进行页面跳转           ,需要注意的是h5界面需要引入uni.webview.1.5.2.js      ,具体引入方式可参考官方文档                    ,就不过多赘述                     。这里只列举了一种               ,如有其他需要可参考这段代码进行编写   ,下图是uni提供的部分接口

2                      、页面返回之后h5界面没有刷新数据问题 由于所有的h5界面都是采用的webview方式访问的                   ,页面都是存在uni页面栈里面的                   ,所以返回之后h5的勾子函数会失效,但是uni的onShow()是有效的               ,所以在页面返回之后通过evalJS传值的方式来触发h5页面的刷新                      ,代码如下: onShow() { // #ifdef APP-PLUS if(typeof this.$mp!=undefined && typeof this.$mp.page!=undefined){ var currentWebview = this.$mp.page.$getAppWebview(); var wv = currentWebview.children()[0] if (typeof wv != undefined) { setTimeout(function() { wv.evalJS(appMsg()) }, 50); } } // #endif },

由于appMsg使用频率较高   ,为了方便使用            ,我将它注册到了window下面                      ,方便在开发过程中进行调用

//将appMsg注册到window下面 declare interface Window { uni: any tracking: any appMsg: any } //在需要刷新数据的界面进行调用 window.appMsg = () => { getData() }

3       、重要信息缓存问题 在使用过程中       ,我们会将用户信息         ,token等重要信息缓存起来                     ,尤其是token这种数据           ,生命周期比较短      ,在我们系统中只有5分钟                    ,就需要在uni不断的刷新token               ,如果多端进行数据维护也比较麻烦   ,所以在开发过程中h5端只调用uni缓存的信息                   ,代码如下

if (window.plus) { setData(); } else { document.addEventListener(plusready, setData, false); } function setData() { sessionStorage.setItem(token, plus.storage.getItem(token)) sessionStorage.setItem(userInfo, plus.storage.getItem(user)) sessionStorage.setItem(appApiUrl, plus.storage.getItem(appApiUrl)) }

uni访问h5界面的时候都会触发该方法                   ,所以h5界面会将uni缓存的最新数据进行存储,保证数据的一致性           。这里在开发过程中遇到这样一个问题               ,目前主要是ios系统中发现了这个问题                      ,就是数据缓存和页面加载不同步   ,也就是页面加载完了            ,但是token等数据还没有缓存好                      ,所以在h5的路由配置的时候是做了一个延迟加载的处理

router.beforeEach((to: any, from, next) => { if (to.meta.title) { document.title = to.meta.title } if (to.matched.length === 0) { next(/404) } else { setTimeout(function () { next() }, 300) } })

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
国内阿里云服务器绑定域名不备案(快速上手 阿里云免备案服务器使用指南) window10和linux双系统安装(Window Linux双系统安装 超详细教程)