码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 小程序环境切换自定义组件


    背景:

    最近一直有参与小程序的项目,发现切换环境时经常要上传然后再设置为体验版,比较麻烦,所以尝试做了个切换环境的组件,分享给大家,希望大家能用得上,提点建议

    组件长这个样子

    展开后

    功能: 

    该组件可全局拖拽,点击环境切换后,需重启小程序

    原理:

    利用小程序的storage,储存环境变量的切换,在加载appjs时,先获取环境变量,及时切换环境对应的资源地址

    关键api:

    wx.setStorage

    wx.getStorage

    wx.getStorageSync

    关键代码:

    components\envChange

    1. import {
    2. envKey
    3. } from './../../utils/util'
    4. Component({
    5. data: {
    6. storageKey: envKey,
    7. show: false,
    8. showList: false,
    9. list: [{
    10. label: 'dev',
    11. value: 'develop',
    12. }, {
    13. label: 'test',
    14. value: 'test',
    15. }, {
    16. label: 'sit',
    17. value: 'sit',
    18. }, {
    19. label: 'uat',
    20. value: 'uat',
    21. },
    22. {
    23. label: 'trial',
    24. value: 'trial',
    25. }, {
    26. label: 'release',
    27. value: 'release',
    28. }, {
    29. label: '取消',
    30. value: 'cancel',
    31. }
    32. ],
    33. env: ""
    34. },
    35. methods: {
    36. async init() {
    37. let envWhiteList = ['develop', 'sit', 'test', 'trial', 'uat']
    38. let data = {
    39. show: envWhiteList.indexOf(__wxConfig.envVersion) !== -1 || false,
    40. showList: false,
    41. env: __wxConfig.envVersion
    42. }
    43. try {
    44. let cur = await this.getCurrentEvt()
    45. data.env = cur && cur.label
    46. } catch (error) {
    47. console.error(error)
    48. } finally {
    49. this.setData(data)
    50. }
    51. },
    52. showListFun() {
    53. this.setData({
    54. showList: true
    55. })
    56. },
    57. closeListFun() {
    58. this.setData({
    59. showList: false
    60. })
    61. },
    62. async envChoose(e) {
    63. const {
    64. item
    65. } = e.target.dataset
    66. if (item.value === 'cancel') {
    67. this.setData({
    68. showList: false
    69. })
    70. } else {
    71. await this.setEnv({
    72. key: this.data.storageKey,
    73. value: item.value
    74. })
    75. wx.showToast({
    76. icon: 'none',
    77. title: '请手动重启小程序(点击右上方三个点的气泡按钮里面的重新进入小程序)',
    78. duration: 5000
    79. })
    80. this.init()
    81. }
    82. },
    83. getCurrentEvt() {
    84. try {
    85. return this.getEnv(this.data.storageKey)
    86. } catch (error) {
    87. reject(error)
    88. }
    89. },
    90. setEnv(data) {
    91. return new Promise((resolve, reject) => {
    92. wx.setStorage({
    93. key: String(data.key),
    94. data: String(data.value),
    95. success: (res) => {
    96. resolve(res)
    97. },
    98. fail: (error) => {
    99. console.error(error)
    100. reject(error)
    101. }
    102. })
    103. })
    104. },
    105. getEnv(key) {
    106. return new Promise((resolve, reject) => {
    107. wx.getStorage({
    108. key,
    109. success: (res) => {
    110. const target = this.data.list.find(obj => obj.value === res.data)
    111. resolve(target)
    112. },
    113. fail: (error) => {
    114. reject(error)
    115. }
    116. })
    117. })
    118. }
    119. },
    120. ready() {
    121. this.init()
    122. },
    123. })

    config\modules.js

    1. const develop = require('./develop')
    2. const sit = require('./sit')
    3. const test = require('./test')
    4. const trial = require('./trial')
    5. const uat = require('./uat')
    6. const release = require('./release')
    7. module.exports = {
    8. develop,
    9. sit,
    10. test,
    11. trial,
    12. release,
    13. uat,
    14. }

    config\getConfig.js

    1. import {
    2. envKey
    3. } from './../utils/util'
    4. import modules from './modules'
    5. function getConfig(arg) {
    6. const env = wx.getStorageSync(envKey)
    7. return modules[env || arg]
    8. }
    9. module.exports = getConfig

    config\index.js

    1. const getConfig = require('./getConfig')
    2. module.exports = (function () {
    3. switch (__wxConfig.envVersion) {
    4. case 'develop':
    5. return getConfig(__wxConfig.envVersion);
    6. break;
    7. case 'trial':
    8. return getConfig(__wxConfig.envVersion);
    9. // return require('./trial.js');
    10. break;
    11. default:
    12. return require('./release.js');
    13. break;
    14. }
    15. })()

    全局引用该组件或局部引用都可以,最后别忘了全局引入config

    源码在gittee:mini_program_code_part: 小程序代码片段https://gitee.com/qiu2046/mini_program_code_part.git

    可以优化的点:

    1.添加时间校验,过期删除

    2.加密

    tip:特别需要注意小程序的模块加载顺序和模块引入方式与常见项目的区别

    参考资料:

    pointer-events - CSS(层叠样式表) | MDN**pointer-events **CSS 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件的 target (en-US)。https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events微信小程序自定义服务器环境切换_醉逍遥neo的博客-CSDN博客_小程序多环境切换微信小程序由于生态圈的封闭性,很多功能不支持或者实现起来很繁琐,这次就分享一下项目里对于小程序服务器切换相关的配置及使用心得。首先要解释一下后面会出现的两个变量名:SERVER_MODE: 综合性的切换服务器模式,通过在代码里手动修改配置文件里的服务器模式值,用于测试、预发及上线时的版本切换及环境模式判断,包括各个接口服务器、h5域名服务器、第三方appId、自定义服务器等一键切换。SERVER_DEV_MODE:接口api的切换服务器,通过在特定入口里打开特定页面,在该页面里可选切换api服务器环境https://blog.csdn.net/u010059669/article/details/108979412wepy框架微信小程序api环境切换_穿不过的墙的博客-CSDN博客wepy 小程序开发项目环境(开发环境,测试环境,预发环境,线上环境)原公司小程序环境使用非常奇怪 (测试体验版为测试环境)(正式版体验版为预发环境)现又新增开发环境,那么在使用的时候岂不是每切换一个环境都的重新打包(很麻烦)一般来项目都会封装request请求 那么当前的api环境一般会写在独立的js再去引入,// API_URL为当前的api环境请求地址 if(!!wx.getStorageSync("API_URL")){ switch(wx.getStorageSync("APhttps://blog.csdn.net/weixin_44969815/article/details/106857126【解决方法】微信小程序 module "xxx/xxx.js" is not defined(开发工具正常,真机预览报错)_Bottle的博客-CSDN博客背景小程序开发,写了一个公共模块,方便其他页面使用。开发工具中使用一切正常,但是用真机预览的时候就会报错「module “xxx/xxx.js” is not defined」。查了一圈,基本确定了是小程序 js 加载顺序的问题,那解决思路自然就有了。解决方法将引用的代码放到页面的 onLoad 方法或者 app.js 的 onLaunch 方法中执行。比如我这里就是放到了 app.j...https://blog.csdn.net/zhyl8157121/article/details/105350698Javascript模块化编程(三):require.js的用法 - 阮一峰的网络日志https://www.ruanyifeng.com/blog/2012/11/require_js.html

  • 相关阅读:
    OKHttp3工具类
    5(6)-羧基-X-罗丹明,CAS号:198978-94-8
    IDEA 的模块没有执行本模块的代码
    网络服务器是干什么用的
    云计算学习笔记——第五章 网络虚拟化
    国赛练习(1)
    docker创建自定义网络
    50个html+css+js项目小练习(一:3D小黄人图片旋转样式)
    08-React扩展
    Wlan——无线反制理论与配置讲解
  • 原文地址:https://blog.csdn.net/zxcv19961204/article/details/128062405
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号