快速小程序开发之微信小程序内嵌 H5

avatar
UX @京东
原文链接: mp.weixin.qq.com

简介:微信小程序中可以直接运行 web 页面,这一新组件 web-view 的产生,可能直接导致小程序数量迎来一波高峰。本篇博文将从业务选型,微信小程序后台配置,使用 web-view 完成登录业务以及在实战中如何调试,一次性带你感受小程序内嵌 H5 的风采,帮你更有底气的使用微信小程序新组件 web-view。

一、技术选择:

1.H5 转成小程序方案路线优缺点对比:

上表是从原有 H5 转相似业务逻辑的微信小程序的方案路线优缺点对比,基于时间的限制以及当前主流多端编译的可靠性考量,最终团队认为通过使用小程序组件 web-view 内嵌 H5 的方式比较适合当前的开发需求。 web-view 的兼容性问题主要是要在基础库在1.6.4+及以上才可以用,而微信官方统计基础库在1.6.4+ 的覆盖率已达 95% 以上,这个指标也符合产品大人的要求,于是便愉快的选择了 web-view 内嵌 H5 的技术方案。

2.H5 和小程序技术对比:

从上表中可以对比出 H5 相较于小程序的优缺点,方便各位前端大大评估需求。尤为重要的是因为小程序封装的比较严重所以小程序开发的灵活性没有 H5 那么高,这就要我们注意对交互设计的评估。

二、web-view 微信小程序配置系列问题

1、配置域名

注意:

  • 业务域名中配置的就是小程序以及 H5 和 H5 中引用 iframe 的域名。这里要特别注意的是假如 H5 中有内嵌的 iframe 也要配置进去

  • 这里需要服务端的朋友配合一下,将校验文件放置在将要嵌套的业务域名的根目录。所以要注意后端是否可以支持,否则会有各种扯皮的问题

2、选择基础库 开发的时候不要忘记配置微信小程序的基础库,注意 web-view 要在基础库1.6.4以上的版本库才能使用

3、H5 中引入微信的 js 引入的 js 写的是 H5 跳转微信小程序的 API 实现,这个在H5首页中引入即可,如下图示例

三、web-view 与小程序的通信

官方给出了两种通信方法(如下图所示) 1、postMessage 通信 在 H5 中需要先用 wx.miniProgram.postMessage 接口,把需要分享的信息,推送给小程序。 在用户点击了小程序后退、组件销毁、分享这些特殊事件之后,小程序页面通过 bindmessage 绑定的函数读取 post 信息。 2、设置 web-view 组件的 URL 通信 H5 跳转小程序:

  1. toWeixin() {

  2.  wx.miniProgram.navigateTo({url: '/pages/myWelfare/myWelfare'});

  3. }

小程序跳转 H5: 首先在 .wxml 中引入 web-view 组件

  1.    <view>

  2.      <web-view src="{{url}}" ></web-view>

  3.    </view>

之后在小程序的 js 文件中设置通过 URL 以问号传参的方式传入参数到 H5 中

  1.    if(!option.page){

  2.      this.setData({

  3.        url: `${this.data.url}?${test}`

  4.      });

  5.    } else {

  6.      this.setData({

  7.        url: `${this.data.url}${option.page}?${test}`

  8.      });

  9.    }

四、小程序内嵌 H5 登录实例

1、小程序登录实现方案流程图:

如上图所示:整个登录的 cookie 的传递经历了四个步骤:

  • 在小程序登录后获取到后端传递的 cookie 并保存

  • 通过 web-view 中的 url 传递到 H5 中

  • 在 H5 中得到传递的值并写到 cookie 中

  • 在访问接口的时候带上 cookie 2、从微信小程序响应头中获得 cookie 存到 storage 中:

首先在登录页获取到响应头中的登录 cookie 放到 storage 中

  1.  wx.setStorageSync('cookie', res.header["Set-Cookie"]);

在微信小程序中每次请求接口的时候,将 storage 中的 cookie 取出来,放到请求头中,如果传入不正确或者没有传入 cookie 值,后台将返回 errorCode 为 3002 ,此时前端跳转到登录页面。

  1. +   var headerCookie = wx.getStorageSync('cookie');

  2.   wx.request({

  3.            url: murl,

  4.            data: parameter.data || {},

  5.            header: {

  6. +               'Cookie': headerCookie

  7.            },

  8.            method: parameter.method || 'POST',

  9.            success: function(res) {

  10. +                if(res.data.code == 3002) {

  11. +                    wx.redirectTo({

  12. +                        url: '../login/login'

  13. +                    });

  14.                } else {

  15.                    parameter.success && parameter.success(res);

  16.                }

  17.            },

3、获得 cookie 并拼接到 URL 中

首先在 web-view 页面获取 cookie ,并匹配到需要传递的字段,之后将此字段放到 url 中通过问号传参的方式传递到 H5 中:

  1.    try {

  2.      var value = wx.getStorageSync('cookie');

  3.      if (value) {

  4.        test = value.match(new RegExp("(^| )"+"jxi-m-sid"+"=([^;]*)(;|$)"))[2] ;

  5.      }

  6.    }

  1.    url: 'https://www.xxx.com#',

  2.    if(!option.page){

  3.      this.setData({

  4.         //在这里放入传递的字段(如test)

  5. +        url: `${this.data.url}?${test}`

  6.      });

  7.    } else {

  8.      this.setData({

  9.         //在这里放入传递的字段,也可以拼接更多的信息(如option.page)

  10. +        url: `${this.data.url}${option.page}?${test}`

  11.      });

  12.    }

4、获取 cookie 并在 H5 中使用 在 H5 中获取 cookie 值,并带入 cookie ,注意 domain 和 path 的设置,这两个值必须都有:

  1.  let isDebug = (window.location.href).indexOf('myf') > -1;

  2.  let host = isDebug ? 'jd' : 'jdf';

  3. //获得传递的字段

  4. + let c =window.location.href.split('?')[1];

  5. //设置cookie

  6. + document.cookie = `jxi-m-sid=${c};domain=${host};path=/`;

五、小程序内嵌 H5 调试解决方案

1、关于调试效果缓存的问题 小程序的更新机制即当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是 5 分钟)会被微信主动销毁。 小程序销毁后再重新启动时如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次销毁后再重新启动时才会应用上。 2、内嵌 H5 调试问题 因为微信小程序开发者工具中并没有提供内嵌 H5 的调试工具,所以我们可以采取以下方法调试

  • 在 H5 开发的时候,我们可以在微信小程序开发者工具中找到 web-view 传递给 H5 的 URL 链接将此链接黏贴到浏览器中即可像平时开发 H5 一样调试

  • 对于手机端 H5 的测试调试可以在 H5 中引入 vconsole 这个插件来调试程序,他可以让我们看到接口情况以及 H5 中的日志。

六、总结

看到这里,我们分别从

  • web-view 技术的优缺点

  • web-view 微信小程序配置系列问题

  • web-view 与小程序的通信

  • 小程序内嵌 H5 登录实例

  • 小程序内嵌 H5 调试解决方案

五个方面梳理了关于微信小程序 webview 组件的使用。当然,微信小程序组件 web-view 还并不完善,其中很难实现一些特殊的交互,比如返回按钮返回的页面只能是上一级不能是任意自定义的页面等问题,这就需要我们更好的沟通以及规划交互设计,同时反馈并等待微信小程序官方的更新和支持。最后,欢迎关注“全栈探索”微信公众号,我们将每周推送好的文章。

扩展阅读

[1] 微信小程序 web-view 官方文档: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html [2] 小程序 web-view 应用实践: https://juejin.cn/post/6844903681121484807 [3] 关于微信、app 等内嵌 web-view 开发调试技巧: https://segmentfault.com/a/1190000014402129 [4] 使用小程序做交互的技巧: https://juejin.cn/post/6844903682828402696 [4] 关于微信小程序 web-view 的使用: https://segmentfault.com/a/1190000012250564