1 简介 Description
基于 Vue3 + TypeScript 开发SSR渲染的Web应用系统全过程
2 关键词 Keywords
3 集成开发环境 IDE
4 开发过程
4.1 创建项目
图一:初始化创建项目
创建项目选择的内容为Vue和TypeScript
图二:项目初始目录结构
4.2 改造src/main.ts
1.需要将原有的createApp更换为createSSRApp
2.同时导出一个函数创建App,删除挂载代码,最终代码如下:
import App from './App.vue'
import { createSSRApp } from 'vue'
export function createApp() {
if (import.meta.env.SSR) {
// ... 仅在服务端执行的逻辑
}
return createSSRApp(App)
}
4.3 新增客户端启动文件src/entry–client.ts
import { createApp } from './main'
createApp().mount('#app')
4.4 新增服务端启动文件src/entry–server.ts
import { renderToString } from 'vue/server-renderer'
import { createApp } from './main'
const render = async (url: string) => {
const app = createApp()
const html = await renderToString(app)
return html
}
export {
render
}
4.5 新增SSR启动文件server.js
import fs from "fs"
import path from "path"
import { fileURLToPath } from "url"
import express from "express"
import { createServer as createViteServer } from "vite"
const __dirname = path.dirname(fileURLToPath(import.meta.url))
async function createServer() {
const app = express()
// 以中间件模式创建 Vite 应用
const vite = await createViteServer({
server: { middlewareMode: true },
appType: "custom"
})
// 使用 vite 的 Connect 实例作为中间件
app.use(vite.middlewares)
app.use("/", async (req, res, next) => {
const url = req.originalUrl
try {
// 1. 读取 index.html
let template = fs.readFileSync(
path.resolve(__dirname, "index.html"),
"utf-8"
)
// 2. 应用 Vite HTML 转换
template = await vite.transformIndexHtml(url, template)
// 3. 加载服务器入口
const { render } = await vite.ssrLoadModule("/src/entry-server.ts")
// 4. 渲染应用的 HTML
const appHtml = await render(url)
// 5. 注入渲染后的应用程序 HTML 到模板中。
const html = template.replace("<!--ssr-outlet-->", appHtml)
// 6. 返回渲染后的 HTML。
res.status(200).set({ "Content-Type": "text/html" }).end(html)
} catch (e) {
// 捕获到错误,让 Vite 来修复堆栈
vite.ssrFixStacktrace(e)
next(e)
}
})
app.listen(5173, () => {
console.log("SSR 渲染服务器启动成功 => http://localhost:5173/")
})
}
createServer()
4.6 项目package.json配置
"dependencies": {
"express": "^4.18.1",
"vue": "^3.2.37",
"path": "^0.12.7",
"vue-class-component": "^8.0.0-rc.1",
"vue-property-decorator": "^10.0.0-rc.3"
},
"devDependencies": {
"@types/express": "^4.17.13",
"@types/node": "^18.7.16",
"@vitejs/plugin-vue": "^3.1.0",
"typescript": "^4.6.4",
"vite": "^3.1.0",
"vue-tsc": "^0.40.4"
}
"scripts": {
"?dev": "CSR 渲染方式启动开发",
"dev": "vite serve",
"?dev:ssr": "SSR 渲染方式启动开发",
"dev:ssr": "node server",
"?build": "普通编译",
"build": "vue-tsc --noEmit && vite build",
"?build:ssr": "SSR 模式编译",
"build:ssr": "yarn build:client && yarn build:server",
"build:client": "vite build --outDir dist/client",
"build:server": "vite build --outDir dist/server --ssr src/entry-server.ts",
"preview": "vite preview"
},
"type": "module",
5 源代码路径
演示代码地址:https://github.com/bitem-cn/bitem-vue3-typescript-ssr.git
当前文章所属代码Tag地址:https://github.com/bitem-cn/bitem-vue3-typescript-ssr/tags/Step1
原文地址:https://blog.csdn.net/qq_18813875/article/details/126872162
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_16805.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。