uni-app 通过后缀名区分不同渠道版本
同一套微信小程序代码根据需求要打包成两款小程序,主要逻辑页面一致,主题色不一致,部分页面布局不,逻辑不一致。
script命令
先在package.json的script新增命令,根据不同的命令生成对应的环境变量,方便后续判断当前适用的版本。
pages.json配置
查询文档发现page.js可以定制pages.json的返回。所以在根目录新增page.js,
内容如下:
/**
如果要热部署,可以引用uni-pages-hot-modules
**/
try {
var version_a= require('./config/version_a.js');
var version_b= require('./config/version_b.js');
module.exports = (pagesJson, loader) => {
console.log('------------------当前开发版本为:'+process.env.NODE_CF_ENV)
if (process.env.NODE_CF_ENV == 'version_a') {
return version_a
} else if (process.env.NODE_CF_ENV == 'version_b') {
return version_b
}
}
} catch (e) {
console.log(e)
}
页面布局、代码逻辑
使用webpack loader在读取时判断读取文件, 比如有两个文件为:home.vue home.version_b.vue,在webpack执行时会根据环境变更输出不同的代码
loader配置:根目录新增 vue.config.js
module.exports = {
chainWebpack: config => {
// 访问到vue的规则配置,添加自己的loader相关逻辑,具体api自行参考https://github.com/neutrinojs/webpack-chain
config.module
.rule('vue')
.use('./packages/platformSpecificLoader')
.loader('./packages/platformSpecificLoader')
.end();
//如果不清楚最终的webpack配置,可以输出一下,根据自己的需求,通过api调整最终规则
// console.log(config.toString());
},
configureWebpack: config =>{
plugins: [
]
}
}
loader代码
const path = require('path')
const utils = require('loader-utils')
const qs = require('querystring')
const loaderUtils = require('loader-utils')
var fs = require("fs")
module.exports = function(source, map) {
try{
const loaderContext = this;
const platformEnv = process.env.NODE_CF_ENV;
const stringifyRequest = r => loaderUtils.stringifyRequest(loaderContext, r)
const {
target,
request,
minimize,
sourceMap,
rootContext,
resourcePath,
resourceQuery
} = loaderContext
const rawQuery = resourceQuery.slice(1)
const inheritQuery = `&${rawQuery}`
const incomingQuery = qs.parse(rawQuery)
const options = loaderUtils.getOptions(loaderContext) || {}
const isServer = target === 'node'
const isShadow = !!options.shadowMode
const isProduction = options.productionMode || minimize || process.env.NODE_ENV === 'production'
const filename = path.basename(resourcePath);
const ext = path.extname(filename);
const context = rootContext || process.cwd()
const sourceRoot = path.dirname(path.relative(context, resourcePath))
var platformFileName = filename.replace(ext, `.${platformEnv}${ext}`);
const fileExists = fs.existsSync(resourcePath.replace(filename,platformFileName)
);
if (fileExists) {
console.log('读取平台个性文件')
console.log(platformFileName)
// 同步读取
var data = fs.readFileSync(resourcePath.replace(filename,platformFileName));
source = data;
}
this.callback(null, source, map)
}catch(e){
console.error(e)
}
}
尝试过使用babel plugins进行不同版本代码文件的读取,发现输出的文件还是有问题。
TODO:这种情况下热加载有问题,在修改home.version_a.vue时未监听到变更,需要修改home.vue才监听到。
主题色
定义css变量,在vue文件中使用 var(--cf-theme)读取主题色。要实现不同的版本使用不同的主题色,可以使用uni-app的条件编译,具体参照官方文档。如果代码 逻辑差异不大的也可以使用条件编译而不使用上面的后缀名来区分版本
/* #ifdef MP-versiona*/
body {
--cf-theme: #fd4373;
}
/* #endif */
/* #ifdef MP-versionb*/
body {
--cf-theme: #85d7cf;
}
/* #endif */
uni-app 通过后缀名区分不同渠道版本的更多相关文章
- Debug模式下,测试app后缀名“-测试”
target-->buildsetting-->user-defined 新建一个和上图尖括号一样的字符 如下图: 在debug中填入后缀名,然后在debug模式下运行程序,会发现debu ...
- -05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作
2011-07-05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作 ARCAMP软件要进行地统计计算的文件后格式后缀名必须为.shp的文件,网上介绍的方法复杂难懂,那么制作.shp ...
- FileUtils【获取SD卡根目录、读写文件、移动、复制、删除文件、获取文件名、后缀名操作类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装了获取SD卡根目录路径.以及对文件读写.获取文件名等相关操作. 因为需要用到android.permission.READ_EX ...
- 设置express ejs模板的后缀名html
如果使用jade或者ejs模板引擎的话 模板文件的格式为ejs或者jade ,有时候需要将后缀名修改为 html格式的. app.set('view engine','ejs'); app.engin ...
- layui图片上传之后后台如何修改图片的后缀名以及返回数据给前台
const pathLib = require('path');//引入node.js下的一个path模块的方法,主要处理文件的名字等工作,具体可看文档 const fs = require(''fs ...
- python分离不同后缀名的文件
功能描述 根据文件后缀名处理文件,分别拷贝到对应的文件夹下 example >>> .jpg 后缀 和.mp4 后缀文件处理 代码实现 #!/usr/bin/env python # ...
- c#根据绝对路径获取 带后缀文件名、后缀名、文件名
zz C#根据绝对路径获取 带后缀文件名.后缀名.文件名 1.c#根据绝对路径获取 带后缀文件名.后缀名.文件名. string str =" F:\test\Default.aspx& ...
- 【应用】_有道词典客户端一个后缀名为sql的数据库。
[缘起] 在清理电脑磁盘的时候,看一看各安装文件夹有占用了多大容量,发现有道词典居然达140MB了,于是进去看看. 发现个有趣的文件:XXX.sql. 首先我们看一看它的安装文件夹的结构: Dict ...
- php上传功能集后缀名判断和随机命名
form.php <html> <head> <meta http-equiv="content-type" content="text/h ...
- C#获取图片的后缀名
最近在学习过程中遇到一个问题,就是如何获取图片的格式,对于一张知道全路径的照片,如果其路径包含后缀名的话,要取得后缀名,只需要一行代码即可: var ext = System.IO.Path.GetE ...
随机推荐
- Java 入门与进阶P-7.3+P-7.4
函数的调用 简单应用举例 例1:编写一个求两个数的和的子函数 要求使用键盘录入的方式: 分析与总结: 要实现某一功能,把其定义为一个函数封装起来 就可以重复多次使用:这样一来,main函数里的代码减少 ...
- 读Java8函数式编程笔记07_设计和架构的原则
1. SOLID原则 1.1. 开发良好面向对象程序的准则 1.2. Liskov substitution里氏替换 1.3. Interface segregation接口隔离 1.4. Singl ...
- vue3 | slots
一.什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML.组件等,填充的内容 ...
- 真正“搞”懂HTTP协议11之代理服务
代理,其实全称应该叫做代理服务器,它是客户端与服务器之间得中间层,本质上来说代理就是一个服务器,在HTTP的链路中插入的一个中间环节,就是代理服务器啦.所谓的代理服务就是指:服务本身不生产内容,而是处 ...
- springboot如何在拦截器中拦截post请求参数以及解决文件类型上传问题
我们经常有这样一个场景,比如:在springboot拦截器中想截取post请求的body参数做一些中间处理,或者用到自定义注解,想拦截一些特定post请求的方法的参数,记录一些请求日志. 想到了使 ...
- Kali Linux Web 渗透测试秘籍 中文版
第一章 配置 Kali Linux 简介 在第一章中,我们会涉及如何准备我们的 Kali 以便能够遵循这本书中的秘籍,并使用虚拟机建立带有存在漏洞的 Web 应用的实验室. 1.1 升级和更新 Kal ...
- NETAPP硬盘更换
netapp硬盘新增 一.找到坏盘,插上新盘# 1.登陆到想要点亮的硬盘相对应的控制器上,并进去高级模式. priv set advanced 2.利用disk show -v 查看想要点亮的硬盘名字 ...
- 微信小程序项目中使用icon图标
效果: 步骤: 1.先让ui负责人把你的账号加入到项目中,加入到项目中后就可以在icon图标库中看到该项目 2.在小程序中使用 新建一个view,在上面加一个class,复制icon名字上去即可,注意 ...
- TypeScript 学习笔记 — 类的基本用法(五)
目录 TS 中定义类 类中实例属性.方法 + 修饰符 public protected private readonly 实例方法 类中原型属性.方法 + 访问器 原型属性 + 访问器 原型方法 类中 ...
- idea+git+gitee的使用
idea+git+gitee的使用 下载git并安装 进入官网,选择合适的版本进行下载: 点击进入官网 下载完毕后,安装git 安装idea中的gitee插件 注意:安装好之后重启idea 进入ide ...