微信小程序打包多主题方案

背景

曾经项目里遇到这样一个需求,最近回想起来想着把这个方案做一个记录。

由于我们的系统需要提供给多个租户方使用,系统的业务逻辑大体是相同的,并由一套小程序代码实现。而每个租户方希望得到的界面主题是不同的。这与在项目运行中切换主题不同,希望的是系统在发布后只有一个主题。

设计思路

  • 定义多个主题色class的样式

首先,我们需要定义多个主题class的样式,这些样式可以包括颜色、字体、背景等。由于本次需求的主题样式内容不多,因此我们将样式写在一份文件里,通过class区分。

css 复制代码
/* 红色主题 */
.red {
  /* 主色调RGB数值 */
  --R: 233;
  --G: 86;
  --B: 86;
  /* 全局主色  */
  --mainBgColor: #fb7059;
  /* 全局特殊副色  */
  --mainBgColor-Inactive: #f5b0b0;
  /* 其他色调 */
}

/* 金色主题 */
.golden {
  /* 主色调RGB数值 */
  --R: 201;
  --G: 159;
  --B: 90;
  /* 全局主色  */
  --mainBgColor: #c99f5a;
  /* 全局特殊副色  */
  --mainBgColor-Inactive: #e5bf80;
  /* 其他色调 */
}


/* 蓝色主题 */
.blue {
  /* 主色调RGB数值 */
  --R: 94;
  --G: 133;
  --B: 248;
  /* 全局主色  */
  --mainBgColor: #5E85F8;
  /* 全局特殊副色  */
  --mainBgColor-Inactive: #7a99f5;
  /* 其他色调 */
}
  • 配置主题标识与 键(appId)的关系

由于租户方和对应的主题是确定的,因此创建一个配置文件config.js,在配置文件中定义一个Map数据格式实现主题与appId的关系,并通过appId获取对应配置,导出配置模块供app.js引用。

javascript 复制代码
const configList = new Map([
  ['wx_appid1', {
    theme: 'red',
    // 其他配置
  }],
  ['wx_appid2', {
    theme: 'golden',
    // 其他配置
  }],
  ['wx_appid3', {
    theme: 'blue',
    // 其他配置
  }],
  // ...
])

const accountInfo = wx.getAccountInfoSync();
const appId = accountInfo.miniProgram.appId;
const config = configList.get(appId)
module.exports = {
  config
}

在 app.js 中引入此配置模块并设为globalData

javascript 复制代码
const config = require('/config');
App({
  globalData: {
    config
  }
})
  • 绑定页面class

在页面中,通过getApp().globalData获取全局数据,并拿到相关配置及主题标识。最终,将主题标识作为class绑定到页面元素中。

html 复制代码
<view class="{{theme}}"></view>

总结

通过以上步骤,我们实现了一个简单的微信小程序多主题方案。在实际开发中,可能还需要考虑主题切换的动画效果、主题的动态下载与更新等高级功能。但基本的思路是一致的:定义主题、配置主题、获取主题、应用主题。这样的设计可以让小程序更加灵活,满足多平台的个性化需求。

相关推荐
Hilaku33 分钟前
我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)
前端·javascript·github
IT_陈寒33 分钟前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
快手技术34 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱36 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
全栈前端老曹44 分钟前
【包管理】npm init 项目名后底层发生了什么的完整逻辑
前端·javascript·npm·node.js·json·包管理·底层原理
HHHHHY1 小时前
mathjs简单实现一个数学计算公式及校验组件
前端·javascript·vue.js
boooooooom1 小时前
Vue3 provide/inject 跨层级通信:最佳实践与避坑指南
前端·vue.js
一颗烂土豆1 小时前
Vue 3 + Three.js 打造轻量级 3D 图表库 —— chart3
前端·vue.js·数据可视化
青莲8431 小时前
Android 动画机制完整详解
android·前端·面试
iReachers1 小时前
HTML打包APK(安卓APP)中下载功能常见问题和详细介绍
前端·javascript·html·html打包apk·网页打包app·下载功能