基于taro搭建小程序多项目框架

前言

为什么需要这样一个框架,以及这个框架带来的好处是什么?

从字面意思上理解:该框架可以用来同时管理多个小程序,并且可以抽离公用组件或业务逻辑供各个小程序使用。当你工作中面临这种同时维护多个小程序的业务场景时,可以考虑使用这种模式。灵感来自最近webpack的多项目打包构建

起步

首先你得先安装好taro脚手架,然后基于该脚手架生成一个taro项目

初始化taro项目

taro init miniApp

这是我选择的初始化配置,你当然也可以选择其它模版,只要编译工具选择webpack就可以,下面的步骤基本相同

打开项目安装依赖

pnpm install

这样一个基本的taro项目就生成好了,但这样只是生成了一个小程序,那我们如果有许多个小程序是不是还要按上面这些步骤继续生成,当然不需要,这样不仅费时间,而且难以维护。

下面我们就来把这个框架改造成支持同时管理多个小程序。

改造(支持多小程序)

此时的项目结构是这样的:

  • config下面是一些小程序以及webpack的配置

  • src下面是我们小程序的项目代码

  • project.config.json是当前小程序配置文件

  • ...

改造目录

src目录下新增目录:appscommon

  • apps:小程序目录,存放各个小程序的代码

  • common:公用目录,存放公用组件及业务逻辑代码

apps

这里每个小程序对应一个文件夹,里面存放对应小程序的代码

这里需要把根目录下的project.config.json放到小程序目录下,因为每个小程序都需要自己的配置文件

比如:nanjiu、nanjiu_notebook两个小程序

common

这里主要是存放公用代码:组件、业务、请求

修改配置

config/index.js


import path from 'path'
const app = process.env.APPconst config = {projectName: 'mini_app',date: '2024-1-21',designWidth: 750,deviceRatio: {640: 2.34 / 2,750: 1,828: 1.81 / 2},sourceRoot: `src/apps/${app}`, // 项目源码目录outputRoot: `${app.toUpperCase()}APP`,  // 打包产物目录alias: {'@/common': path.resolve(__dirname, '..', 'src/common'), // 别名配置},
// ....module.exports = function (merge) {if (process.env.NODE_ENV === 'development') {return merge({}, config, require('./dev'))}return merge({}, config, require('./prod'))
}

这里需要注意的是sourceRoot,因为要支持多小程序,那么这里就不能固定写死了,我们可以在启动时通过传参来区分当前启动或打包哪个小程序。

自定义构建脚本

在项目根目录新建文件夹build存放构建脚本

// cli.js
const shell = require('shelljs')
const fs = require('fs')
const path = require('path')
const inquirer = require('inquirer')const action = process.argv[2]
let app =  process.argv[3]
const runType = action == 'dev' ? '启动': '打包'function start() {// 处理配置文件process.env.APP = appconsole.log(`🚀🚀🚀🚀🚀🚀正在${runType}小程序:${app}`)let cmd = ''if(action == 'dev') {cmd = `taro build --type weapp --watch --app ${app}`} else {cmd = `taro build --type weapp --app ${app}`}const child = shell.exec(cmd, {async:true})child.stdout.on('data', function() {// console.log(data)})
}
// ...start()

配置脚本命令

//package.json// ..."scripts": {"start": "node build/cli.js dev","build": "node build/cli.js build",
}

验证

所有工作完成后,可以来看看这个框架能不能满足我们的需求

命令执行成功,项目根目录下会生成对应的小程序代码

再把该产物使用小程序开发者工具看是否能跑起来

这边能够跑起来,就说明打包没有问题了,同样可以验证其它的小程序

优化构建脚本

多小程序架构搭建完,有同事反馈启动报错,我心想:不能吧,我自己都验证过了,从报错信息上看他应该是启动时没输入需要启动的小程序,直接pnpm start了,这样的话就不知道应该启动哪个小程序了。其实启动命令已经在项目文档上写了,可能是没注意看。

那就只能优化优化,尽量避免这种情况,这里主要的逻辑是如果没有输入指定的的小程序,通过inquirer开启交互式命令,让他选择要启动哪个小程序。

// cli.js
const shell = require('shelljs')
const fs = require('fs')
const path = require('path')
const inquirer = require('inquirer')const action = process.argv[2]
let app =  process.argv[3]
const runType = action == 'dev' ? '启动': '打包'if(!app) {openInquirer()return
}// 未输入项目名称则开启交互命令行
function openInquirer() {const projectList = fs.readdirSync(path.resolve(__dirname, '../src/apps'))// 过滤隐藏文件projectList.forEach((item, index) => {if(item.indexOf('.') == 0) {projectList.splice(index, 1)}})const promptList = [{type: 'list',message: '🚗请选择启动的小程序:',name: 'pro',choices: [...projectList],},]inquirer.prompt(promptList).then((answers) => {app = answers.prostart()})
}
function start() {// 处理配置文件process.env.APP = appconsole.log(`🚀🚀🚀🚀🚀🚀正在${runType}小程序:${app}`)let cmd = ''if(action == 'dev') {cmd = `taro build --type weapp --watch --app ${app}`} else {cmd = `taro build --type weapp --app ${app}`}const child = shell.exec(cmd, {async:true})child.stdout.on('data', function() {// console.log(data)})
}start()

这样就大功告成了!!!

文章转载自:前端南玖

原文链接:https://www.cnblogs.com/songyao666/p/17979605

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 桥接模式(实例详解)

文章目录 示例1:角色与装备系统示例2:UI控件库示例3:渲染引擎模块示例4:AI决策树算法示例5:物理模拟引擎 在Unity游戏开发中,桥接模式(Bridge Pattern)是一种设计模式,它…

扩散模型公式推导

这篇文章将尝试推导扩散模型 DDPM 中涉及公式,主要参考两个 B 站视频: 大白话AI狗中赤兔 本文所用 PPT 元素均来自 UP 主,狗中赤兔和大白兔AI,特此感谢。 在证明开始,我们需要先对扩散模型有一个整体的认知。扩散模型…

【心得】java从CC1链入门CC链个人笔记

来劲了,感觉离真正的CTF又近了一步。 本文仅从一个萌新的角度去谈,如有纰漏,纯属蒟蒻。 目录 CC链概念 CC链学习前置知识 CC1链 Version1 Version2 Version3 CC链概念 CC链 Commons Collections apache组织发布的开源库 里面主要对…

matlab appdesigner系列-常用19-超链接

超链接,可以执行的有2个,外部网页链接 和 外部matlab文件(.m文件) 示例:准备两个外部链接、文件 网页链接: https://www.mathworks.com/products/matlab.html matlab文件,Hyperlink.m msgb…

git bash右键菜单失效解决方法

git bash右键菜单失效解决方法 这几天重新更新了git,直接安装新版本后,右键菜单失效找不到了。找了好几个博客,发现都不全面,最后总结一下解决方法: (1)按winr,输入regedit打开注册…

安卓自动缩放布局

AutoScalingLayout 适用于 Android 的自动缩放布局。 替换布局: 我们只需要替换根布局所需的自动缩放,子布局也将实现自动缩放。 原始布局AutoScalingLayout相对布局ASRelativeLayout线性布局ASLinearLayoutFrameLayout(框架布局&#xff…

沃尔沃机器人的电动汽车部署战略

原创 | 文 BFT机器人 前言: 随着环保意识的提高和科技的进步,电动汽车在全球范围内正逐渐成为交通出行的主要方式。而在这个转变过程中,制造自动化的技术发展起到了关键的作用。目前,全球各大汽车制造商都在积极投入电动汽车的研…

操作系统-虚拟机(传统计算机 虚拟机 两类VMM对比 指令等级 特权与敏感)

文章目录 传统计算机虚拟机VMM的对比支持虚拟化的CPU通常分更多指令等级(特权 敏感) 传统计算机 传统物理机只有一个操作系统 两个进程在一个操作系统上运行会存在一些隐患(相互影响 争夺资源等) 解决方法:如果各个进…

[Linux]HTTP状态响应码列举

1xx:信息响应类,表示接收到请求并且继续处理 2xx:处理成功响应类,表示动作被成功接收、理解和接受 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理 4xx:客户端错误&#x…

Elasticsearch:使用 Gemini、Langchain 和 Elasticsearch 进行问答

本教程演示如何使用 Gemini API创建 embeddings 并将其存储在 Elasticsearch 中。 我们将学习如何将 Gemini 连接到 Elasticsearch 中存储的私有数据,并使用 Langchian 构建问答功能。 准备 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasticsearch 及 Ki…

HIVE中关联键类型不同导致数据重复,以及数据倾斜

比如左表关联键是string类型,右表关联键是bigint类型,关联后会出现多条的情况 解决方案: 关联键先统一转成string类型再进行关联 原因: 根据HIVE版本不同,数据位数上限不同, 低版本的超过16位会出现这种…

微信小程序底部按钮适配iPhoneX以上,显示遮挡问题

只需要在给底部按钮加个样式 /* 底部导航栏容器 */ .button-box {/* 使用 safe-area-inset-bottom 属性适配 iPhone X 及以上型号设备 */padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);/* 其他样式属性 */ }iPhone6/7/8效果 …

vue全局公共样式

vue公共样式代码存放在/src/styles文件夹里 index里引入其他组件公共样式,index.scss文件内容如下: import ./sidebar.scss; import ./searchForm.scss;body {height: 100%;-moz-osx-font-smoothing: grayscale;-webkit-font-smoothing: antialiased;t…

hcip高级网络知识

一:计算机间信息传递原理 抽象语言----编码 编码---二进制 二进制---转换为电流(数字信号) 处理和传递数字信号 二:OSI--七层参考模型 ISO--1979 规定计算机系统互联的组织: OSI/RM ---- 开放式系统互联参考模型 --- 1…

【模拟】力扣38(Java)

题目 class Solution {public String countAndSay(int n) {String ret "1";for(int i1;i<n;i)//解释n-1次ret{StringBuffer tmp new StringBuffer();int len ret.length();for(int left 0,right 0;right<len;){//双指针while(right < len &&…

力扣精选算法100道——x的平方根(二分查找专题)

x的平方根 首先看到这个题目的时候&#xff0c;我们需要对上一个二分查找专题的题目进行深度理解&#xff0c;然后了解模板&#xff0c;这题是完全利用的上一题的模板知识进行&#xff0c;如果直接看这个题目可能是有点懵的&#xff0c;因为我这里直接利用模板进行解题。力扣…

了解HTTP/1.1、HTTP/1.0 和 HTTP/2.0

HTTP/1.1、HTTP/1.0 和 HTTP/2.0 是超文本传输协议&#xff08;HTTP&#xff09;的三个主要版本 先解释一下什么是超文本协议 超文本传输协议&#xff08;HyperText Transfer Protocol&#xff0c;简称 HTTP&#xff09;是互联网上应用最广泛的一种网络协议。设计 HTTP 的初衷是…

在Ubuntu上安装pycuda记录

1. 安装CUDA Toolkit 11.8 从MZ小师妹的摸索过程来看&#xff0c;其他版本的会有bug&#xff0c;12.0的版本太高&#xff0c;11.5的太低&#xff08;感谢小师妹让我少走弯路&#xff09; 参考网址&#xff1a;CUDA Toolkit 11.8 Downloads | NVIDIA Developer 在命令行输入命…

尝试为ssrf漏洞编写黑名单与白名单

以pikachu靶场ssrf&#xff08;curl&#xff09;为例&#xff1a; 你会发现什么也没防御项访问基本的文件内容&#xff0c;端口开放都是可以看到的&#xff0c;没有任何防御措施。 我们去查看一下他的源码有没有过滤什么 没有任何过滤&#xff0c;咱么尝试进行过滤一下&#xf…

2024美赛数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…