在部署我的前后端分离项目时,以往的做法是将前后端分别运行在两个端口上,然后通过 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 单页应用程序了。