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-5.7+P-5.8
素数 去掉偶数后,从3到x-1 每次加2 ·如果×是偶数,立刻 ·否则要循环(n-3)/2+1遍 ·当n很大时就是n/2遍 构造素数表 欲构造n以内的素数表 1. 令x为2 2. 将2x/ 3x. 4 ...
- CSS中的各种格式化上下文-FC(BFC)、IFC、GFC、FFC)
什么是FC? FC是Formatting Context的缩写,中文名:格式化上下文.是 W3C在CSS2.1 规范中的一个概念. FC是指页面中一篇渲染区域,渲染区域内使用的格式化上下文的渲染规则, ...
- 11月16日内容总结——OSI传输层之TCP与UDP协议、应用层简介、socket模块介绍及代码优化、半连接池的概念
目录 一.传输层之TCP与UDP协议 1.TCP协议(重要) 三次握手建链接(白话版) 三次握手专业版 四次挥手断连接(白话版) 四次挥手专业版 2.UDP协议 3.tcp和udp的对比 二.应用层简 ...
- 【LeetCode】三数之和+四数之和(双指针)
之所以放在一起是因为,"四数之和"的解题方法基本与"三数之和"一致 由此我们可以推出n数之和的解法 本质上,我们只是使用双指针的方法降低此类问题的时间复杂度 当 ...
- Task记录2.ContinueWith 延续任务,等待上一个任务执行完毕
Task.Run(() => {for (int i = 0; i < 20; i++) { Console.WriteLine(i); } } }).ContinueWith(NewTa ...
- 注解 @RequestMapping @RequestParam @RequestBody
@RequestMapping @RequestParam @RequestBody @PathVariable与@RequestParam的区别 1) 相同点A. 作用位置相同:都是直接修饰方法参 ...
- 学习Java Day11
今天学习了二维数组:
- NET近期面试总结和面试题
一.面试总结 避坑:深圳龙岗李朗YH股份会鸽offer 因为offer被鸽重新找工作,从8号开始面试到12号(11家公司),整体感觉面试难度不大,就是很多公司都是走流程,并不是真的需要人,有些甚至聊一 ...
- bat脚本登陆ftp服务器
用bat脚本登录ftp服务器,下载指定文件. 第一次脚本,有问题,你发现了么? 由于每个">>"重定向符号之前都习惯用空格(python style),导致写道ftp. ...
- Powershell删除文本指定内容所在行以下内容
需求:批量获取文本指定内容所在行以下内容(含当前行) 解决方案:使用Powershell脚本处理 案例: 获取当前文件夹下所有txt文件 含文本"4"所在行以下内容(含当前行) 如 ...