基于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()

这样就大功告成了!!!

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

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

相关文章

【Mysql高可用集群-双主双活-myql+keeplived】

Mysql高可用集群-双主双活-myqlkeeplived 一、介绍二、准备工作1.两台centos7 linux服务器2.mysql安装包3.keepalived安装包 三、安装mysql1.在128、129两台服务器根据《linux安装mysql服务-两种安装方式教程》按方式一安装好mysql应用。2.修改128服务器/etc/my.cnf配置文件&am…

mynet开源库

1.介绍 个人实现的c开源网络库. 2.软件架构 1.结构图 2.基于event的自动分发机制 3.多优先级分发队列,延迟分发队列 内部event服务于通知机制的优先级为0,外部event优先级为1. 当集中处理分发的event_callback时&#xff0c…

Flutter如何集成到已有iOS工程上

大家好,我是咕噜铁蛋,今天我将和大家分享一个实用的技术教程——如何将Flutter集成到已有的iOS工程中。Flutter是Google推出的一款开源的移动UI框架,它允许开发者使用Dart语言来开发高性能、美观的原生应用,并支持iOS和Android两大…

聚观早报 | 百度文心一言上线新功能;腾势Z9GT将发布

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月08日消息 百度文心一言上线新功能 腾势Z9GT将发布 华为将举办鸿蒙春季沟通会 苹果与Shutterstock达成协议 O…

LeetCode初级算法书Java题解日常更新

LeetCode初级算法高效题解(含思路注释) 文章目录 LeetCode初级算法高效题解(含思路注释)前言一、数组1.删除排序数组中的重复项2.买卖股票的最佳时机 II3.旋转数组4.存在重复元素 总结 前言 决定用四个月过一下算法 一、数组 1.…

threejs 组-层级模型 | 本地坐标和世界坐标 | 局部坐标系和世界坐标系 | 本地矩阵.materix和世界矩阵.matrixWorld

文章目录 组- THREE.Group递归遍历模型树结构object3D.traverse()object3D.add (object.Object3D..) 添加对象 和 object3D.remove(object.Object3D..) 移除对象 局部坐标系和世界坐标系辅助坐标器 AxesHelper 本地坐标和世界坐标 - 基于世界坐标系的位置本地坐标与世界坐标的理…

Redis7(二)数据类型及其用法

一、概述 命令不区分大小写&#xff0c;key区分大小写 数据类型针对value String List Set Hash ZSet bitmap GEO HyperLogLog Stream bitfield 二、String <K,V> 1、设值/取值 getrange key index1 index2 getrange key 0 -1//获取所有的值 SETRANGE KEY_N…

XC7A35T-2FGG484 嵌入式FPGA现场可编程门阵列 Xilinx

XC7A35T-2FGG484 是一款由Xilinx&#xff08;赛灵思&#xff09;制造的FPGA&#xff08;现场可编程门阵列&#xff09;芯片 以下是XC7A35T-2FGG484 的主要参数&#xff1a; 1. 系列&#xff1a;Artix-7 2. 逻辑单元数量&#xff1a;33280个 3. 工艺技术&#xff1a;28nm 4. …

Linux 5.10 Pstore 功能测试

目录 简介环境配置内核配置参考备注 简介 Pstore(Persistent store support)是用于系统发生oops或panic时&#xff0c;自动保存内核log buffer中的日志。随着功能不断完善&#xff0c;Duo S使用Linux 5.10已经支持保存console日志、ftrace消息和用户空间日志的收集&#xff0c…

STC89C52学习笔记(三)

STC89C52学习笔记&#xff08;三&#xff09; 综述&#xff1a;本文讲述了通过51单片机控制LED闪烁、流水灯、按键控制LED亮灭、按键控制LED实现二进制、按键控制LED左右移。 一、LED 1.LED闪烁 1&#xff09;LED电路原理 LED采用共阳极&#xff0c;当LED另一端为低电平时…

前端二维码工具小程序产品使用说明书

一、产品概述 前端二维码工具小程序是一款便捷实用的二维码生成与识别工具&#xff0c;通过本小程序&#xff0c;用户可以轻松根据文本或链接生成二维码&#xff0c;并支持扫一扫功能识别二维码内容&#xff0c;同时提供复制识别内容的功能。此外&#xff0c;本小程序还具备美…

登录信息失效后多次请求提示合并成一次

在通常的业务场景中经常会出现进入页面之后一次性发送好多个请求,如果登录信息失效,那就会出现很多提示 类似这种多个提示的,看起来不美观,希望改成可以把在短时间内出现相同的错误信息,只提示一次,其他的就不提示了 实现思路 通常业务中每一个请求的code都是有具体的意思,可以…

网络安全 | 什么是区块链?

关注WX&#xff1a;CodingTechWork 概述 定义 区块链是一个共享的、不可篡改的账本&#xff0c;旨在促进业务网络中的交易记录和资产跟踪流程。资产可以是有形的&#xff08;如房屋、汽车、现金、土地&#xff09;&#xff0c;也可以是无形的&#xff08;如知识产权、专利、…

【记录】LangChain|llama 2速通版

官方教程非常长&#xff0c;我看了很认可&#xff0c;但是看完了之后呢就需要一些整理得当的笔记让我自己能更快地找到需求。所以有了这篇文章。【写给自己看的&#xff0c;里面半句废话的解释都没有&#xff0c;如果看不懂的话直接看官方教程再看我的】 我是不打算一开始就用…

RabbitMQ基本使用及企业开发中注意事项

目录 一、基本使用 二、使用注意事项 1. 生产者重连机制 - 保证mq服务是通的 2. 生产者确认机制 - 回调机制 3. MQ的可靠性 4. Lazy Queue模式 5. 消费者确认机制 一、基本使用 部署完RabbitMQ有两种使用方式&#xff1a; 网页客户端Java代码 MQ组成部分&#xff1a;…

Verilog语法——按位取反“~“和位宽扩展的优先级

前言 先说结论&#xff0c;如下图所示&#xff0c;在Verilog中“~ ”按位取反的优先级是最高的&#xff0c;但是在等式计算时&#xff0c;有时候会遇到位宽扩展&#xff0c;此时需要注意的是位宽扩展的优先级高于“~”。 验证 仿真代码&#xff0c;下面代码验证的是“~”按位取…

ChernoCPP 2

视频链接&#xff1a;【62】【Cherno C】【中字】C的线程_哔哩哔哩_bilibili 参考文章&#xff1a;TheChernoCppTutorial_the cherno-CSDN博客 Cherno的C教学视频笔记&#xff08;已完结&#xff09; - 知乎 (zhihu.com) C 的线程 #include<iostream> #include<th…

【攻防世界】catcat-new

首先进入环境&#xff0c;这是一个介绍猫的网站&#xff1a; 网站的URL没有发现问题&#xff0c;使用dirsearch对网站进行扫描&#xff0c;看是否有可以访问的窗口&#xff1a; 发现 /admin 可以访问&#xff0c;我们尝试访问&#xff1a; /admin中没有flag。我们返回初始界面&…

Redis数据库的简介、部署及常用命令

关系数据库与非关系型数据 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。sQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0c…

LangChain - OpenGPTs

文章目录 MessageGraph 消息图认知架构AssistantsRAGChatBot 持久化配置新模型新工具astream_events总结 关键链接&#xff1a; OpenGPT GitHub 存储库YouTube 上的 OpenGPT 演练LangGraph&#xff1a;Python、JS 两个多月前&#xff0c;在 OpenAI 开发日之后&#xff0c;我们…