使用 NestJs 提供 Vue 单页应用程序(SPA)的静态内容

在部署我的前后端分离项目时,以往的做法是将前后端分别运行在两个端口上,然后通过 nginx 将请求转发到到不同的 URL 上,但是由于项目多了之后 URL 端点的数量会非常多,不容易管理,所以决定将 Vue 单页应用程序(SPA)部署到 NestJs 后端项目中,通过一个 URL 访问到 Vue 单页应用程序和NestJs 后端服务。

public目录和静态服务(Serve Static)

NestJs 中,public 目录下的文件会被 NestJs 默认当作静态资源,可以直接通过 URL 访问到。比如,在 NestJs 项目的根目录下创建一个 public 目录,然后创建一个 index.html 文件,我们可以通过 http://localhost:3000/index.html 访问到这个文件。

而静态服务是指在 NestJs 中,通过 @nestjs/serve-static 模块,我们可以将一个目录作为静态资源,通过 http://localhost:3000/static/ 访问到这个文件。

不用猜,看了这两种方案的区别,应该就明白了。我应该是想通过 NestJs 提供的静态服务,将 Vue 单页应用程序部署到 NestJs 后端项目中,明显他的 url 更加优雅,而且如果使用public方案来集成的话,我们还需要对Vue 单页应用程序进行一些输出配置。

安装 @nestjs/serve-static

    pnpm add --save @nestjs/serve-static

配置

src/app.module.ts

import { Module } from '@nestjs/common';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
@Module({
  imports: [
      ServeStaticModule.forRoot({
        rootPath: join(__dirname, '..', 'client'),
      }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

放置Vue

vue 项目打包后的 dist 目录中的文件放置到 NestJs 项目的 client 目录下。

目录结构如下

├─client
|  ├─index.html
|  ├─*.js
|  └─*.css
└─src

启动

在浏览器中访问 http://localhost:3000/ 就可以访问到 Vue 单页应用程序了。