当前位置: 首页 > news >正文

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
在这里插入图片描述
可以正确访问接受数据更新
在这里插入图片描述

相关文章:

  • web的学习和开发
  • 面试专区|【40道移动端测试高频题整理(附答案背诵版)】
  • Android 生成 AAR 包
  • 论文学习_UVSCAN: Detecting Third-Party Component Usage Violations in IoT Firmware
  • 硬件工程师干了一年,公司无效卷,怎么破?
  • 手机数据恢复篇:恢复出厂设置后从iPhone快速恢复数据
  • 【分布式数据仓库Hive】HivQL的使用
  • Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff
  • ESP32-VScode环境设置
  • 无线WiFi毫米波雷达传感器成品,智能照明人体感应开关,飞睿智能点亮智慧生活
  • js学习--制作选项卡
  • 【LLM 论文】Self-Refine:使用 feedback 迭代修正 LLM 的 output
  • 微信小程序tabar属性
  • 使用 C# 和 OpenXML 读取大型 Excel 文件
  • vue3+vue-router+vite 实现动态路由
  • JavaScript 如何正确处理 Unicode 编码问题!
  • JavaScript-如何实现克隆(clone)函数
  • [nginx文档翻译系列] 控制nginx
  • __proto__ 和 prototype的关系
  • Angularjs之国际化
  • HashMap剖析之内部结构
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • October CMS - 快速入门 9 Images And Galleries
  • Puppeteer:浏览器控制器
  • Python十分钟制作属于你自己的个性logo
  • 测试如何在敏捷团队中工作?
  • 初识 webpack
  • 驱动程序原理
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我感觉这是史上最牛的防sql注入方法类
  • 异常机制详解
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​水经微图Web1.5.0版即将上线
  • (MATLAB)第五章-矩阵运算
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (转)Sublime Text3配置Lua运行环境
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • *1 计算机基础和操作系统基础及几大协议
  • .apk 成为历史!
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET 回调、接口回调、 委托
  • .Net 路由处理厉害了
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @KafkaListener注解详解(一)| 常用参数详解
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AutoSAR 存储] 汽车智能座舱的存储需求