koa2 vue3 一个端口 全栈开发

news/2025/3/31 14:32:35/文章来源:https://www.cnblogs.com/pengchenggang/p/18798477

https://github.com/pengchenggang/vite-koa-ssr/blob/main/server/index.ts

koa-connect 这个中间件很重要

import * as fs from 'fs'
import * as path from 'path'
import Koa from 'koa'
import connect from 'koa-connect'
import Router from '@koa/router'
import * as vite from 'vite'const isTest = process.env.NODE_ENV === 'test' || !!process.env.VITE_TEST_BUILD
const distClient = path.join(process.cwd(), 'dist/app/client')
const distServer = path.join(process.cwd(), 'dist/app/server')async function createServer(root = process.cwd(),isProd = process.env.NODE_ENV === 'production'
) {const resolve = (p: string) => path.resolve(__dirname, p)const indexProd = isProd? fs.readFileSync(resolve(path.join(distClient, 'index.html')), 'utf-8'): ''const manifest = isProd ? require(`${distClient}/ssr-manifest.json`) : {}const app = new Koa()const router = new Router()let viteServer: vite.ViteDevServer | null = nullif (!isProd) {// cover express middleware to koa middlewareviteServer = await vite.createServer({root,logLevel: isTest ? 'error' : 'info',server: {middlewareMode: 'ssr',watch: {// During tests we edit the files too fast and sometimes chokidar// misses change events, so enforce polling for consistencyusePolling: true,interval: 100,},},})// use vite's connect instance as middleware// use koa-connect covert express's middleware to koa's middlewareapp.use(connect(viteServer.middlewares))} else {app.use(require('koa-static')(resolve(distClient), {index: false,}))}// inject routes.router.all('/((?!api).*)', async (ctx, next) => {try {const url = ctx.originalUrllet template, renderif (!isProd) {// always read fresh template in devtemplate = fs.readFileSync(resolve(path.join(root, 'index.html')),'utf-8')template = await (viteServer as vite.ViteDevServer).transformIndexHtml(url,template)render = (await (viteServer as vite.ViteDevServer).ssrLoadModule(path.join(root, 'ssr', 'server.ts'))).render} else {template = indexProdrender = require(`${distServer}/server.js`).render}const [appHtml, preloadLinks] = await render(url, manifest, process.cwd())const html = template.replace(`<!--preload-links-->`, preloadLinks).replace(`<!--app-html-->`, appHtml)ctx.status = 200ctx.res.setHeader('Content-Type', 'text/html')ctx.body = html} catch (e) {viteServer && viteServer.ssrFixStacktrace(e as Error)// console.log(e.stack)ctx.status = 500ctx.body = (e as Error).stack} finally {next()}})router.get('/api/(.*)', async (ctx, next) => {ctx.status = 201ctx.body = 'hello api'console.log(ctx)next()})app.use(router.routes())app.use(router.allowedMethods())return { app, vite }
}if (!isTest) {createServer().then(({ app }) => {app.listen(3000, () => {console.log('server running on http://0.0.0.0:3000')})})
}exports.createServer = createServer

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

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

相关文章

ElevenLabs 对话式 AI 支持 RAG;阿里 TaoAvatar 快速生成 3D 数字人:实时渲染兼容移动设备丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

川崎机器人减速机齿轮维修解析

一、齿轮磨损的原因正常磨损:长期使用时,齿轮齿面在不断啮合的过程中,会因摩擦等因素而逐渐磨损。 润滑不良:润滑油不足或油质不良会导致齿轮间的摩擦磨损增加,同时也会使齿轮温度升高,进一步影响齿轮的精度和寿命。 过载运行:当川崎机器人过载时,减速器齿轮承受的载荷…

Oracle驱动下载和本地maven仓库文件结构的创建

写在前面: 2I2Rc*@JY8 本文章用于记录博主平时遇到的问题,步骤略粗糙,目的在于记录便于后续博主自己查找,如果能帮助到其他人更好。文章中用到的链接均为自行引入,侵删,谢谢 问题描述:1、需要 maven 工程引入 Oracle jdbc驱动;2、查找了 maven 中央仓库,发现 ojdbc 的…

阿里云Tair KVCache:打造以缓存为中心的大模型Token超级工厂

一、Tair KVCache 简介 Tair KVCache 是阿里云瑶池旗下云数据库 Tair 面向大语言模型推理场景推出的 KVCache 缓存加速服务。 随着互联网技术的演进与流量规模的激增,缓存技术逐渐成为系统架构的核心组件。该阶段催生了 Redis 等开源缓存数据库,阿里巴巴基于自身业务需求自主…

NRF54L15/NRF54L10/NRF54L05蓝牙6.0支持多协议CS信道检测

NRF54L15,NRF54L10,NRF54L05 是NORDIC推出的高性能,多协议,低功耗BLE6.0芯片 产品优势特点简介增强的多协议支持 nRF54L 系列支持低功耗蓝牙、蓝牙 Mesh、Thread、Matter、Zigbee、Amazon Sidewalk 和 2.4 GHz 专有协议,并具有高达 4 Mbps 数据传输速率等增强功能。这一系…

Anaconda-python版本管理

Anaconda-python版本管理官网下载Download Anaconda Distribution | Anaconda 一路next,路径可自选。我是D:\install\Anaconda环境配置如下图所示环境高级设置中path新开cmd,进行检查。conda --version返回:conda 24.11.3环境配置完成conda 自身管理版本查看conda --version…

C#实现HTTP服务器:处理文件上传---解析MultipartFormDataContent

完整项目托管地址:https://github.com/sometiny/http HTTP还有重要的一块:文件上传。这篇文章将详细讲解下,前面实现了同一个链接处理多个请求,为了方便,我们独立写了一个HTTP基类,专门处理HTTP请求。https://github.com/sometiny/http/blob/main/src/Http/HttpServerBas…

达梦数据库使用日寄1

最近一个朋友找过来说可能有个项目可以合作,项目背景是信创重构,于是摸鱼半辈子的老汉开始翻个身选择了解达梦数据库了。虽然项目还没下来,现在只是确定了整个项目的大概架构:达梦数据库+.net core6.0+vue3(内网)+微信小程序(外网)+nginx(反向代理外网访问内网)/双服…

算法常用库函数

1.reverse翻转2.unique去重3.random_shuffle随机打乱 用法与reverse相同 4.sort5.lower_bound/upper_bound二分

阿里邮箱通讯录插件(outlook)安装后不能正常使用

阿里邮箱通讯录插件安装后打开outlook,并未找到Alimail选项。下图为正常显示 1、在文件选项卡中找到“管理COM加载项”,查看是否插件被禁用加载 2、将禁用插件更改为启用。 3、此时Alimail选项已经显示,但是通讯录为灰色,点击设置登录邮箱账号即可。

Cell | 亚洲免疫细胞多样性图谱发布!揭示基因与疾病关联新视角

关键词 亚洲人群、免疫细胞多样性、单细胞测序、遗传变异、精准医学 摘要总结: 这篇文章是2025年3月发表在《Cell》杂志上的一篇研究,标题为“Asian diversity in human immune cells”。这篇文章通过构建覆盖5个亚洲国家的619名健康人群的单细胞免疫图谱(AIDA),探索了人群…