1 简介 Description

基于 Vue3 + TypeScript 开发SSR渲染的Web应用系统过程

系列文章
1.基于 Vue3 + TypeScript 开发SSR系统(一):初始创建SSR

2 关键词 Keywords

3 集成开发环境 IDE

Visual Sutdio Code

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/entryclient.ts

客户端入口在浏览器执行,需要挂载应用

import { createApp } from './main'

createApp().mount('#app')

4.4 新增服务端启动文件src/entryserver.ts

服务端导出render函数将应用渲染字符串返回

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

使用node server启动服务

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--&gt;", appHtml)

      // 6. 返回渲染后的 HTML。
      res.status(200).set({ "Content-Type": "text/html" }).end(html)
    } catch (e) {
      // 捕获错误,让 Vite 来修复堆栈
      vite.ssrFixStacktrace(e)
      next(e)
    }
  })


  app.listen(5173, () =&gt; {
    console.log("SSR 渲染服务器启动成功 => http://localhost:5173/")
  })
}

createServer()

4.6 项目package.json配置

1.依赖安装

  "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"
  }

2.脚本命令

  "scripts": {
    "?dev": "CSR 渲染方式启动开发",
    "dev": "vite serve",
    "?dev:ssr": "SSR 渲染方式启动开发",
    "dev:ssr": "node server",
    "?build": "普通编译",
    "build": "vue-tsc --noEmit &amp;&amp; vite build",
    "?build:ssr": "SSR 模式编译",
    "build:ssr": "yarn build:client &amp;&amp; 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"
  },

3.配置type=module

  "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进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注