vue3+vite+nodejs,通过接口的形式请求后端打包(可打包全部或指定打包组件)

项目地址https://gitee.com/sybb011016/test_build

打包通过按钮的形式请求接口,让后端进行打包,后端使用express-generator搭建模版。前端项目就在npm init vue@latest基础上添加了路由
在这里插入图片描述
如果只想打包AboutView组件,首先修改后端接口。

//打包的测试接口
router.get("/build", function (req, res) {//打包的文件路径const frontendProjectPath = "E:\\BaiduNetdiskDownload\\Vue.js\\vue_build";const component = req.query.component || ""; //传入的参数//根据参数决定打包指定目录还是全部打包 cross-env需要前端下载,运行的时候动态设置环境变量const buildCommand = component? `cross-env BUILD_COMPONENT=${component} npm run build`: `npm run build`;exec(buildCommand, { cwd: frontendProjectPath }, (err, stdout, stderr) => {if (err) {console.error(`exec error: ${err}`);return res.status(500).send(`Error during build: ${err.message}`);}console.log(`stdout: ${stdout}`);console.error(`stderr: ${stderr}`);res.send("Build completed successfully");});
});

前端部分接口如下

export const buildAPI = (comp) => {return request({url: "/build",method: "GET",params: {component: comp,},});
};
let res = await buildAPI("About");

修改vite.config.ts配置

export default defineConfig(({ command, mode }) => {//后端接口执行的时候会设置环境变量const input = process.env.BUILD_COMPONENT? path.resolve(__dirname,`src/views/${process.env.BUILD_COMPONENT}View.vue`): path.resolve(__dirname, "index.html");return {....build: {rollupOptions: {input,},},};
});

在这里插入图片描述
在这里插入图片描述
上面只是打包aboutview相关的js和css,但是并没有html查看,现在为aboutview添加一个html和js作为入口文件用于汇众所有的相关的数据。
在这里插入图片描述
在这里插入图片描述
修改vite.config.ts文件内容,下面插件的功能主要是为了修改打包后的入口文件名为index。base: "./"该属性必须添加,否则打包后的目录进行本地预览会显示文件的情况,建议也把重命名的方法添加上,否则刷新可能还是会出现本地文件夹的情况

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "node:path";
import { fileURLToPath, URL } from "node:url";
import fs from "fs/promises";//重命名打包后的about-view.html文件为index.html
const renamePlugin = (originalName, newName) => {return {name: "rename-output-html",closeBundle: async () => {const distPath = path.resolve(__dirname, "dist");const originalPath = path.join(distPath, originalName);const newPath = path.join(distPath, newName);try {await fs.rename(originalPath, newPath);console.log(`Renamed ${originalName} to ${newName}`);} catch (err) {console.error(`Failed to rename ${originalName} to ${newName}:`, err);}},};
};export default defineConfig(() => {// 检测是否设置了环境变量BUILD_COMPONENTconst isComponentBuild = process.env.BUILD_COMPONENT;return {.....base: "./",plugins: [vue(), renamePlugin("about-view.html", "index.html")],build: {rollupOptions: {input:isComponentBuild == "About"? path.resolve(__dirname, "about-view.html"): path.resolve(__dirname, "index.html"),output: {entryFileNames: "assets/[name]-[hash].js", //打包后的index [name]代表使用组件原有名字 [hash]代表hash随机值chunkFileNames: "assets/[name]-[hash].js", //打包后各个组件名的jsassetFileNames: "assets/[name]-[hash].[ext]", //打包后各个组件的css},},outDir: "dist",},};
});

不使用插件
在这里插入图片描述
使用插件
在这里插入图片描述

现在我们添加单独的路由模块(这里假设我们的AboutView中需要读取router.params中的某属性),因此在单独打包之前需要在AboutView.js中创建并引入路由模块,注意这里需要配置单独的路由地址。

import { createApp } from "vue";
import AboutView from "./AboutView.vue";import { createRouter, createWebHistory } from "vue-router";const router = createRouter({history: createWebHistory(),routes: [{path: "/about",name: "about",component: AboutView,},],
});createApp(AboutView).use(router).mount("#app");

模拟请求传参返回随机数更新标题。这里route.params.id只是随便模拟的东西,无值,主要是验证route非空,未单独引入use(router)的情况下读取未undefined。

const route = useRoute();
const title = ref("This is an about page");
onMounted(() => {console.log(route);getDataAPI(route.params.id).then((res) => {title.value = res.data.title;});
});

然后将AboutView的文件单独打包,这里直接部署到宝塔的本地环境中。需要修改一些nginx的参数。文件上传到如下结构。
在这里插入图片描述
在这里插入图片描述
配置nginx

location / { try_files $uri $uri/ /index.html last;index index.html; 
} 
location /api {proxy_pass http://127.0.0.1:3001;rewrite ^/api/(.*)$ /$1 break;
}//下面选择性添加add_header 'Access-Control-Allow-Origin' '*' always; #允许来自所有的访问地址 add_header 'Access-Control-Allow-Credentials' 'true' always; #允许来自所有的访问地址 add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, token, platform' always; add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,DELETE,HEAD,OPTIONS' always; #允许来自所有的访问地址

运行单独打包的AboutView
在这里插入图片描述
可以正确访问接受数据更新
在这里插入图片描述

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

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

相关文章

Open3D (C++) 点云旋转至主成分空间

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 首先使用主成分分析法计算出点云的特征值与特征向量,然后根据点云的特征向量计算出点云与主成分空间之间的…

CocosCreator构建IOS教程

CocosCreator构建IOS教程 添加include: Header Search Paths:拖拽include过来 添加SoundEngine: Header Search Paths: 把SoundEngine POSIX Common 三个文件夹拖拽到里面去

如何将 ONLYOFFICE 文档 Linux 版更新到 v8.1

本指南将向您展示如何将 ONLYOFFICE 文档 Linux 版本更新到最新 8.1 版本。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器,支持处理文本文档、电子表格、演示文稿、可填写表单、PDF 和电子书,可多人在线协作,支持 AI 集…

软件设计师笔记-操作系统知识(二)

线程 以下是关于线程的一些关键点: 线程是进程中的一个实体:进程是操作系统分配资源(如内存空间、文件句柄等)的基本单位,而线程是进程中的一个执行单元。多个线程可以共享同一个进程的地址空间和其他资源。线程是CP…

ElasticSearch-Windows系统ElasticSearch(ES)的下载及安装

前言 下载ElasticSearch 可以进入ElasticSearch官方下载地址,选择与电脑系统相对应的版本;博主已经上传资源,或者点此直接免费下载,本次演示版本为8.14.1。 注意: Elasticsearch 5 需要 Java 8 以上版本;…

菜籽桌面4.5.0~4.5.1常见问题解答

目录 如何刷机? 刷机失败? 无法方控? 无法画中画? 原车音乐跟我安装的音乐一起播放? 原车音乐停了,我安装的软件也跟着没声音了? 调节声音时忽大忽小? 怎么安装软件? 软件…

探究互联网领域知识,解密数字化时代神秘面纱

随着信息时代的不断发展,互联网的发展呈现出爆炸式的增长,以至于引起广泛的关注和深入的探究。互联网作为一个庞大的网络体系,涵盖着无穷无尽的信息和知识,其背后的科技和应用已经改变了人们的生活,产生了翻天覆地的变…

锐捷网络闪耀CVPR 2024,外观异常检测方案斩获世界认可!

近日,锐捷网络在“视觉异常检测和创新性检测2024挑战赛”(Visual Anomaly and Novelty Detection 2024 Challenge,简称VAND)的少样本逻辑/结构异常检测赛道(VAND 2.0赛道2)中荣获第二名,并在计算机视觉顶级会议CVPR 2024上展示了这一成果&…

2.用BGP对等体发送路由

2.用BGP对等体发送路由 实验拓扑: 实验要求:用BGP对等体发送路由信息 实验步骤: 1.完成基本配置(略) 2.建立BGP对等体(略) 3.创建路由信息(用创建一个loop back接口就能产生一个直连…

从我邮毕业啦!!!

引言 时间过的好快,转眼间就要从北邮毕业了,距离上一次月度总结又过去了两个月,故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 毕业🎓 6月1号完成了自己的…

Construct公司 从 0 到 1 基于 Kitex+Istio 的微服务系统建设

本文根据 2024 年 5 月 25 日在上海举办的“云原生✖️AI 时代的微服务架构与技术实践”CloudWeGo 技术沙龙上海站活动中,Construct 服务端总监 Jason 的演讲《从 0 到 1 基于 Kitex Istio 的微服务系统建设》整理而来。 在微服务架构的浪潮中,企业面临…

STM32学习和实践笔记(38):RTC实时时钟实验

1.STM32F1 RTC介绍 STM32 的实时时钟( RTC)是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置…

事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)

一、引言 1、数据库管理系统DBMS为保证定义的事务是一个逻辑工作单元,达到引入事务的目的,实现的事务机制要保证事务具有原子性、一致性、隔离性和持久性,事务的这四个特性也统称为事务的ACID特性 2、当事务保持了ACID特性,才能…

【精选】数据治理项目实施(合集)06——数据标准在数据治理中的落地实践

导读 本文对数据标准管理进行了深入探讨。重点介绍了数据标准的定义,实施路线和具体标准定义的内容,并总结了企业开展数据标准管理面临的常见问题,由于编写的水平和时间有限, 难免有所纸漏, 欢迎大家批评指正。 在现实…

MyBatis-关联查询的对象是集合的处理

用户和角色之间是多对多的关系,也就是说,一个用户可以有多个角色与之绑定,所以在User对象中,角色的属性就必须是一个集合Set或者List,这里我们就用List集合在做例子: 1.怎么在Mybatis中实现关联的List集合对…

k8s流控平台apiserver详解

一、简单理解认识apiserver 1.主要功能 认证 鉴权 准入 mutating validating admission 限流 2.概念 apiserver保护etcd,缓存机制,有缓存直接返回,没缓存再去查看etcd,apiserver是担任和其他平台同信并认证 3.访问控制概览…

精益生产KPI指标分析与管理系统,助力企业挖掘数据黄金焕发第二生命线

智慧工厂精益生产追求以越来越少的投入获取越来越多的产出,通过消除浪费、提高效率来实现生产效益的最大化。精益生产强调量化管理,通过与KPI的结合,可以将生产过程中的关键数据进行量化和分析,推动企业各部门更加关注运营效率&am…

嵌入式Linux的浮点运算能力测试

嵌入式Linux的浮点运算能力测试 今天需要对一款ARM CPU的浮点数运算能力进行测试,采用了台式机上常用的SuperPI相同的原理:计算一定小数位数的圆周率来测试硬件的浮点数计算能力和稳定性。 首先下载计算软件的源代码,可以使用下面命令&#…

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(转换、拆分、分割、连接、替换、查找、“Like“)

字符串分割,文末示例(文末代码3附有源码) 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

NetSuite 隐藏功能之Memorized Transactions记忆交易

本周功课结束,想说说Memorized Transactions这个有时会被忽略的功能,顾名思义,记忆交易就是可以将一个原始的Transaction在创建后进行“记忆”,以保证后续可以在固定日期(周期性日期或者自定义日期)产生“被…