微信小程序webview 脚手架使用详解


Posted in Javascript onJuly 22, 2019

项目地址

https://github.com/fangkyi03/wechat-webview-template

项目介绍

1.wechat

使用taro创建的初始化项目

2.react-ssr-h5

使用nextjs创建的项目 已经做好完整的兼容处理 使用vw vh为单位

简单介绍

因小程序对于webview通信做出的限制 从webview发起的postMessage并不会实时的被小程序端接受到

详情可见 :https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

登录 分享 支付 视频上传 这几块是没法使用webview来实现的 必须用小程序原生来写

所以如果想使用小程序内嵌webview的朋友 这里要提个醒

webview跳转小程序

webview - 通过jumpRouter - 跳转到小程序的other页面

实际转换:

Taro.navigateTo({ url: ../../pages/otherView/index?viewName=${routerName}& + createRouterParams(routerParams) })

通过这种方式 就会在小程序原生router中push一个路由 从而达到跟小程序打开原生页面一致的效果

在webview中发起的任何一个postMessage 也都会在这个otherView中进行统一的处理

提醒

下面使用到的apitool都是对应项目里面的 而不是共用一个

wechat api

小程序项目中跳转页面并传参
  jumpNativeRouter
  使用方式:
  apitool.jumpNativeRouter(routerName,params : object)
替换小程序网页页面
  replaceRouter
  使用方式:
  apitool.replaceRouter(routerName,params : object)
获取临时缓存区数据
  getTemp
  使用方式:
  Object apitool.getTemp()
  备注:
  请见缓存区说明
销毁临时缓存区
  clearTemp
  使用方式:
  apitool.clearTemp()
  备注:
  请见缓存区说明

react-ssr-h5 api

获取小程序分享以后的路径 转换成obj的格式
  getSharePath
  使用方式:
  Object apitool.getSharePath(this)
获取路由参数
  getRouterParams
  使用方式:
  Object apitool.getRouterParams(this)
获取转换以后的尺寸
  getSize
  使用方式:
  String apitool.getSize(size)
  备注:
  因为ssr项目里面使用了postcss-px-to-viewport的关系在less里面写的px会自动转换成vw 但是行内样式不行 所以你需要使用这个来转换一下
获取当前运行环境
  getIsWxClient
  使用方式:
  apitool.getIsWxClient({success,fail})
  备注:
  成功或者失败都会调用对应的回调 但是这里只判断了MicroMessenger是否存在 无法得知当前是微信小程序在用还是微信内打开网页 所以如果你是直接从公众号迁移 要保证公众号功能都正常使用的话 这边还得做个判断
将路由参数转换成string
  createRouterParams
  使用方式:
  String apitool.createRouterParams(obj)
跳转到小程序other原生页面
  jumpRouter
  使用方式:
  apitool.jumpRouter(routerName:String,routerParams:Object)
  备注:
  请看上面注意中写的介绍
跳转小程序原生页面
  jumpNativeRouter
  使用方式:
  apitool.jumpNativeRouter(routerName:String,routerParams:Object)
  备注:
  这个可以用来跳转分享 支付 登录等小程序pages下面的原生页面
跳转原生登录页面
  jumpLogin
  使用方式:
  apitool.jumpLogin()
从webview发起请求到小程序
  postMessage
  使用方式:
  apitool.postMessage({type:'xxx',data:{}})
  备注:
  具体详情请看后面介绍
返回页面
  backRouter
  使用方式:
  apitool.backRouter()
跳转tab
  jumpTab
  使用方式:
  apitool.jumpTab(tabName:String || 'home')
创建临时缓存区
  createTemp
  使用方式
  apitool.createTemp(obj)
  备注:
  请看缓存区说明
动态更新webview标题
  updateTitle
  使用方式:
  apitool.updateTitle(string)
  备注:
  微信小程序中使用的标题是根据当前页面的webview标题来的所以如果你想进入页面的时候显示对应的商品名称 就调用这个即可

缓存区说明

因小程序对于webview限制的原因 所以如果你有以下场景 那么可以考虑用缓存区来传递数据

比如从支付中跳转到地址选择或者优惠券选择等webview选择页面的时候 如果想要回显webview页面选中的东西 因为小程序webview的限制 没法两者之间直接通信 所以就需要创建一个缓存区来获取数据

登录为何使用原生?

起初我项目中也是使用webview配合jssdk的授权方式来做登录 但是这个方案会有几点问题

1.使用jssdk授权 必须使用80端口

2.使用jssdk处理登录的话 在小程序里面 体验不好 会导致你页面有可能会出现频繁的跳转 难以控制

3.后台必须为此写一个接口来生成对应的签名

登录说明

登录这边有一点必须注意的是 必须使用webview保存的token 绝对不要尝试在小程序里面去保存token

因为当你删除小程序的时候 微信只会清空小程序的缓存数据 但是不会清空对应的webview的缓存数据

这会导致你小程序那边没登录 但是webview那边还是登录的状态 所以一般都是在跳转页面到小程序那边的时候直接传递一个token过去来解决这个问题

webview页面刷新

场景:

比如你新增了某条数据或者编辑删除了某条数据 想让上一个页面刷新的话

只需要在wechat - otherView中将你想要刷新的routerName添加进去即可

const { viewName } = this.$router.params
  // 强制指定页面刷新
  if ([这里就是你想要刷新的路由名字].indexOf(viewName) !== -1 && this.init) {
   Taro.redirectTo({ url: `../../pages/otherView/index?viewName=${viewName}&` + util.tranParams(this.$router.params) })
  }

页面分享

如果你想要你的页面有分享功能 那么只需要在webview端发起一个apitool.postMessage即可

如果你想要控制分享的标题与内容的话

可以按照这种格式进行发送

apitool.postMessage({type:'share',data:{
  title:'分享标题',
  path:'分享路径',
  shareUrl:'分享的图片url'
}})

其他处理

如果你想要让你的应用具备更多的扩展性的话 可以在wechat - otherView - onMessage中增加对应的判断

nodeServer

在react-ssr-h5根目录下面有个nodeServer的文件

这个文件是一个js授权的本地服务器版本 如果你想用jssdk的一些功能来进行授权的话可以在项目中执行npm run wechat来开启这个服务

appid跟secret都被我删除了 你需要自己手动替换一下

页面授权在_app.js文件中

postcss.config说明

react-ssr-h5使用的是vw vh为单位 所以设计搞那边如果宽高不是750 * 1334的话 需要postcss.config.js中对对应的修改

"postcss-px-to-viewport": {
      viewportWidth: 750,   // (Number) The width of the viewport.
      viewportHeight: 1334,  // (Number) The height of the viewport.
      unitPrecision: 3,    // (Number) The decimal numbers to allow the REM units to grow to.
      viewportUnit: 'vw',   // (String) Expected units.
      selectorBlackList: ['.ignore', '.hairlines'], // (Array) The selectors to ignore and leave as px.
      minPixelValue: 1,    // (Number) Set the minimum pixel value to replace.
      mediaQuery: false    // (Boolean) Allow px to be converted in media queries.
    },

react-ssr-h5提醒

这个项目在启动或者export的时候都做了处理

你只需要在pages里面添加内容即可

不需要在server中再去编写指定的路由 也无需在export的时候编写路由

你对pages做的改动都会实时刷新

服务端渲染建议

1.不要在网页中引入antd库 尤其不要使用带有icon的组件 如input
引入这个将会导致你的体积直接增加140k 因为antd的图标是全量引入的

2.使用swiper之类的库 可以采用cdn的方式引入而不是npm 这样可以使你的打包体积变得更小

3.建议使用webp而非png只需要在url中?webp即可 已经安装了对应的插件库

4.尽量全部使用css module而非全局样式

海报图

小程序海报图可以使用Painter生成

链接如下: https://github.com/Kujiale-Mobile/Painter

这是taro引入Painter的demo

https://github.com/Kujiale-Mobile/Taro-Painter-Demo

项目地址

https://github.com/fangkyi03/wechat-webview-template

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js特殊字符转义介绍
Nov 05 Javascript
AngularJS模块管理问题的非常规处理方法
Apr 29 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
Sep 22 Javascript
分享两款带遮罩的jQuery弹出框
Dec 30 Javascript
百度地图给map添加右键菜单(判断是否为marker)
Mar 04 Javascript
js 获取经纬度的实现方法
Jun 20 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
Vue.js实战之Vuex的入门教程
Apr 01 Javascript
简单谈谈axios中的get,post方法
Jun 25 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
Jun 15 Javascript
9102年webpack4搭建vue项目的方法步骤
Feb 20 Javascript
javascript前端实现多视频上传
Dec 13 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 #Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 #Javascript
在小程序中推送模板消息的实现方法
Jul 22 #Javascript
javascript自定义日期比较函数用法示例
Jul 22 #Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 #Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
Jul 22 #Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 #Javascript
You might like
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
js function定义函数使用心得
2010/04/15 Javascript
js中判断控件是否存在
2010/08/25 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
详解python中的 is 操作符
2017/12/26 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
法人委托书的范本格式
2014/09/11 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
汽车转让协议书
2015/01/29 职场文书
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS