taro 一套代码编译多套微信小程序

@tarojs/cli@2.2.17 一套代码编译多套微信小程序(多品牌)

关于taro@2升级taro@3,可以用官网推荐的taro2-to-3,然后有一些api也需要调整的,如首页引入的index需移除,页面配置使用动态变量的话直接import引入,组件或页面使用了基础组件的都需在头部引入 等。

脚本

package.jsonscript中添加打包脚本:

"build:weapp:xxx": "taro build --type weapp --platform xxx",
"dev:weapp:xxx": "npm run build:weapp:xxx --watch",

其中xxx是品牌标识,而--platform xxx则指定当前打包的是哪个品牌;
后面在vscode左下角运行对应脚本即可,或者终端运行npm run build:weapp:xxx

配置各品牌信息

在项目根目录config新建platform.js,其实文件叫啥,自己定义;

// 借助命令行解析工具`minimist`:(自己手写也可,直接操作全局变量`process.argv`)
const minimist = require('minimist')
const cmdOptions = minimist(process.argv.splice(2)) // cmdOptions: { _: [], type: 'weapp', platform: 'xxx' }

// 各品牌信息 - 配置例子,具体得看自己怎么用
const PLATFORM_INFO = [
   {
      label: '',                // 简称
      key: 'xxx',               // 平台标识
      theme_color: '',          // 主题色
      app_name: '',             // 小程序名称
      app_id: '',               // 小程序id
      api_host: '',             // 小程序api_host
      output_root: 'dist_xxx',  // 打包目录名称
   },
   ...
]

const CUR_PLATFORM = PLATFORM_INFO.find(i => i.key === cmdOptions.platform) || PLATFORM_INFO[0]

module.exports = {
   CUR_PLATFORM,
}

编写编译插件

同样在config目录下新建plugins目录,进入plugins添加build.js

const path = require('path')
const chalk = require('chalk') // 终端打印插件

module.exports = (ctx, pluginOptions = {}) => {
   const { CUR_PLATFORM = {} } = pluginOptions
   const { app_name, key: app_key } = CUR_PLATFORM

   // 开始编译
   ctx.onBuildStart(() => {
      console.log(chalk.green(`\n开始编译:${app_name} ${app_key}\n`))
   })

   // 编译成功
   ctx.onBuildFinish(() => {
      const NODE_ENV = process.env.NODE_ENV
      if (NODE_ENV === 'production') {
         console.log(chalk.bgGreen(' 编译成功 '), chalk.green(`${app_name} ${app_key}\n`))
      } else if (NODE_ENV === 'development') {
         console.log(chalk.gray(`调试中:${app_name} ${app_key}`))
      }
   })

   // 修改配置文件
   // taro@3已弃用这个钩子,改为modifyBuildAssets即可
   ctx.modifyBuildTempFileContent(({ tempFiles }) => {
      const { fs } = ctx.helper
      const { appPath } = ctx.paths
      const projectConfigName = 'project.config.json'

      let distProjectConfig = fs.readJSONSync(
         path.join(appPath, projectConfigName)
      )
      Object.assign(distProjectConfig, pluginOptions.newProjectConfig)
      ctx.writeFileToDist({
         filePath: projectConfigName,
         content: JSON.stringify(distProjectConfig, null, 2),
      })
   })
}

添加环境变量及编译插件

config/index.js添加环境变量及编译插件,注意省略号...是省略的官方demo代码,只留关键逻辑;

const path = require('path')
const { CUR_PLATFORM } = require('./platform.js')

const outputRoot = CUR_PLATFORM.output_root || 'dist'
const pluginOptions = {
   CUR_PLATFORM,
   newProjectConfig: {
      projectname: CUR_PLATFORM.app_name,
      appid: CUR_PLATFORM.app_id,
   },
}

const config = {
   ...
   outputRoot,
   plugins: [
      ...
      [path.resolve(__dirname, '.', 'plugins/build'), pluginOptions],
   ],
   mini: {
      // less 直接使用变量:@THEME_COLOR
      lessLoaderOption: {
         // taro@3的话换成additionalData
         prependData: [
            `@THEME_COLOR: ${CUR_PLATFORM.theme_color}`,
            `@PLATFORM_KEY: '${CUR_PLATFORM.key}'`,
            '',
         ].join(';'),
      },
      ...
   },
   ...
}

// 添加环境变量,jsx代码里使用:process.env.PLATFORM_THEME_COLOR
// taro@3的话需生成数组放到上面config的配置defineConstants
// 例如:defineConstants: ["process.env.THEME_COLOR": JSON.stringify(CUR_PLATFORM['theme_color'])]
let customEnv = Object.keys(CUR_PLATFORM).reduce((obj, cur) => {
   /**
   * PLATFORM_LABEL: ''
   * PLATFORM_KEY: 'xxx'
   * PLATFORM_THEME_COLOR: ''
   * ...
   */
   let k = `platform_${cur}`
   obj[k.toUpperCase()] = CUR_PLATFORM[cur]
   return obj
}, {})
Object.assign(config, { env: customEnv })

module.exports = function(merge) {
   ...
}

完!如有直播组件的还需特别处理!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容