[关闭]
@jikeytang 2023-01-23T23:06:26.000000Z 字数 8629 阅读 664

如何用Vitepress Nuxt Nest来开发综合应用

2022-blog


随着 http://www.vue-admin.cn 的上线,今天总结一下这个项目的点点滴滴。这项目有几个模块组成,分别是

前端部分代码组织采用的是Pnpm Monorepo, 开发时模块上相互引用,打包发布时模块独立打包。

1. Vitepress介绍

1.1 基本介绍

Vitepress 现在虽然是alpha版本,但整体用下来还是可以的。秉承了 Vite 一贯的速度和理念,只是页面风格上我个人更倾向于 Vuepress,所以做了一部分调整。CSS代码在:vue-admin-cn/docs/.vitepress/theme/scss/override.scss 供喜欢的朋友借鉴。

1.2 如何发布上线

为何要把发布上线要讲这么前,这与一般的开发后上线理念不符。其实这是踩过多次坑之后得出的经验教训。如果前期把各种打包路径都配置好,后续的开发过程中遵循这个约定,在后期上线很少踩大坑,就算踩个坑也是小坑,完全能hold住,不会出现需要批量调整的体力活。比如:BaseUrl的配置,Image路径的配置等等。
项目中增加比较重的模块依赖建议走一遍Build发布流程,打包发布到测试环境进行整个流程的测试验证。看看发布过程中是否有不可预知的问题需要提前处理掉,比如像ElementPlusUnocss。这样风险前置,有效的保证任务按时完成。

  1. $ cd vue-admin-cn\apps\md
  2. $ pnpm build

然后上传 vue-admin-cn\apps\md\docs\.vitepress\dist目录中的文件到wwwroot/domain目录即可。

2. Nuxt3介绍

首先提一句,安装Nuxt模板问题,默认一直报错,需要采取一定的手段,nuxt3项目初始化失败 执行npx nuxi init nuxt-app报错

2.1 基本介绍

Nuxt3 终于从rc13,发了rc14之后发了正式版,从rc13切换过来还算流畅,在运行和打包上都没有遇到问题,整体感觉还是可以的,相对于Vite SSR,简单了许多,但首次启动项目编译时间还是相当的耗时。Nuxt整体的思路还是对原有的Vue插件和资源进行了一部分整合,有的提供了插件,有的可以手工集成,用起来也还可以。比如这几个:

  1. <div class="mt-5"></div>
  2. <div mt-5></div>

虽然第二种更方便,本着代码易懂的原则,我选择第一种方式。
然后大部分兼容tainwindcss的语法,所以这儿提供一个方便的在线查询 tailwind-cheat-sheet

  1. export default defineNuxtConfig({
  2. modules: ['@nuxtjs/color-mode']
  3. })
  1. <Icon name="uil:github" />
  2. <Icon name="🚀" /> // 支持Emoji
  1. const text = useToUpper("it works!");

其它的可以查看官网Modules模块:https://nuxt.com/modules

与vue其它不同的地方,有几个默认目录的资源是Auto-Import的,比如components, composables,也可以手动在Nuxt.config.ts中添加 import目录。

  1. export default defineNuxtConfig({
  2. imports: {
  3. dirs: ['api'],
  4. },
  5. })

2.2 其它插件安装

其它插件的代码在vue-admin-cn\apps\ssr\plugins文件下,然后在Nuxt.config.ts中引入,

  1. export default defineNuxtConfig({
  2. plugins: ['@/plugins/element-plus', '@/plugins/clipboard', { src: '~/plugins/vueInject.js', mode: 'client' }],
  3. })
  1. // zhLocale.el.pagination = {
  2. // goto: '跳至',
  3. // pagesize: '条/页',
  4. // total: `共计 {total} 条`,
  5. // pageClassifier: '页',
  6. // }
  1. export default defineNuxtPlugin((nuxtApp) => {
  2. nuxtApp.vueApp.use(ElementPlus, { size: 'default', locale: zhLocale })
  3. nuxtApp.vueApp.provide(ID_INJECTION_KEY, {
  4. prefix: Math.floor(Math.random() * 10000),
  5. current: 0,
  6. })
  7. })

2.3 技术栈

技术 说明 官网
Nuxt3 后端渲染框架 https://nuxt.com/
Vite Vite下一代的前端工具链 https://cn.vitejs.dev/
Element-UI 前端UI组件库 https://element-plus.gitee.io/
Sass 强化CSS 的辅助工具 https://sass-lang.com/
Nuxt-icon 图标字体库 https://github.com/nuxt-modules/icon
Nuxt-lodash Lodash module for Nuxt https://github.com/cipami/nuxt-lodash
@unocss/nuxt UnoCSS Nuxt版本 https://github.com/unocss/unocss
Vue3-clipboard 剪贴板 https://github.com/Daizhen1995/vue3-clipboard
Qrcode 生成二维码 https://github.com/soldair/node-qrcode
Md-editor-v3 Markdown编辑器 https://github.com/imzbf/md-editor-v3
Juejin-markdown-themes Juejin MD主题 https://github.com/xitu/juejin-markdown-themes
Animate.css CSS动画库 https://animate.style/
@vueuse/core Vue工具库 https://vueuse.org/

2.3 开发工具

系统 工具 官网
Vscode 开发工具 https://code.visualstudio.com/
Navicat 数据库管理工具 https://www.navicat.com.cn/
Atom 源码阅读工具 https://atom.io/
Cmder Cmd替代工具[windows] https://cmder.net/
Notepad2 临时单文件编辑[windows] http://www.flos-freeware.ch/notepad2.html
Chrome 调试工具 https://www.google.com/intl/zh-CN/chrome/

2.4 文件结构

  1. ├─.nuxt
  2. ├─dist
  3. ├─client
  4. └─_nuxt
  5. └─server
  6. └─_nuxt
  7. └─types
  8. ├─.output // 发布目录
  9. ├─public
  10. └─_nuxt
  11. └─server
  12. ├─api // 请求文件
  13. ├─assets // 静态资源
  14. ├─css
  15. └─images
  16. ├─components // 公共组件
  17. ├─AdminContribute
  18. ├─Banner
  19. ├─CardItem
  20. ├─Loading
  21. ├─MarkDownEditor
  22. ├─SearchBar
  23. ├─ShareBar
  24. └─Upload
  25. ├─composables // hooks
  26. ├─config // 配置文件
  27. ├─layouts // 布局
  28. └─Default
  29. └─nav-bar
  30. ├─pages // 页面
  31. ├─admin
  32. ├─help
  33. ├─about
  34. ├─contact
  35. └─update
  36. ├─hooks
  37. ├─post
  38. ├─ui
  39. └─vc
  40. ├─plugins // 插件
  41. ├─public // 静态资源目录
  42. └─utils // 常用方法

2.5 如何在本地运行

根目录下运行 pnpm install,然后运行 pnpm dev,这样的缺点是,两个apps输出的日志在同一窗口,显的比较混乱。如果想多窗口显示,那进入子目录下分别运行pnpm dev。比如:

  1. $ cd vue-admin-cn\apps\md
  2. $ pnpm dev
  3. $ cd vue-admin-cn\apps\ssr
  4. $ pnpm dev
  1. // 切换环境
  2. nvm install 16.0.0
  3. nvm use 16.0.0
  4. // 安装依赖
  5. npm install
  6. // 启动项目
  7. npm start
  8. // 清除 node_modules
  9. npm run clean
  10. // 全局安装 rimraf 之后方可使用
  11. npm i rimraf -g
  12. // 清除 node_modules 重新安装依赖
  13. // 等同于 npm run clean && npm install
  14. npm run reinstall

2.6 如何上线发布

这次选择的是宝塔控制面板来辅助部署,以下的经验也是基于宝塔来介绍。

2.6.1 打包
  1. $ cd vue-admin-cn\apps\ssr
  2. $ pnpm build

然后上传 vue-admin-cn\apps\ssr\.output目录中的文件。
打包时需要停止正在运行的开发服务。

2.6.2 新建网站

其实就是新建nginx配置文件,比如新建网站 vue-admin.cn,然后在nginx中配置入口。假如Nuxt的端口为3300,则增加如下配置:

  1. server{
  2. location / {
  3. proxy_pass http://127.0.0.1:3300;
  4. }
  5. }

Nuxt的默认端口为3000Nestjs的端口冲突,需要进行修改。下面这个办法后来证实无效。
修改时,在.env的环境文件中定义PORTNITRO_PORT即可,在.env.prodcution中定义是无效的。
需要在 vue-admin.cn/ssr/server/chunks/node-server.js 899行 手工修改端口。
改完后的样子,没错每次发版都得修改

  1. const port = destr(process.env.NITRO_PORT || process.env.PORT) || 3300;

另外一推荐的办法是,新建ecosystem.config.js文件,

  1. module.exports = {
  2. apps: [
  3. {
  4. name: 'VueAdmin',
  5. script: 'server/index.mjs',
  6. args: '', // 传递给脚本的参数
  7. watch: false, // 开启监听文件变动重启
  8. ignore_watch: ['node_modules', 'public', 'logs'], // 不用监听的文件
  9. exec_mode: 'cluster_mode', // 自家主机window cluster_mode 模式下启动失败
  10. instances: '1', // max表示最大的 应用启动实例个数,仅在 cluster 模式有效 默认为 fork
  11. autorestart: true, // 默认为 true, 发生异常的情况下自动重启
  12. max_memory_restart: '200M',
  13. error_file: './logs/app-err.log', // 错误日志文件
  14. out_file: './logs/app-out.log', // 正常日志文件
  15. merge_logs: true, // 设置追加日志而不是新建日志
  16. log_date_format: 'YYYY-MM-DD HH:mm:ss', // 指定日志文件的时间格式
  17. min_uptime: '60s', // 应用运行少于时间被认为是异常启动
  18. max_restarts: 30, // 最大异常重启次数
  19. restart_delay: 60, // 异常重启情况下,延时重启时间
  20. env: {
  21. // 环境参数,当前指定为开发环境
  22. NODE_ENV: 'development',
  23. PORT: '3002',
  24. },
  25. env_production: {
  26. // 环境参数,当前指定为生产环境
  27. NODE_ENV: 'production', // 使用production模式 pm2 start ecosystem.config.js --env production
  28. PORT: '3002',
  29. },
  30. },
  31. ],
  32. }

然后用pm2运行此文件即可。

2.6.3 命令行终端调试

我们终究还是需要用pm2来进行服务的运行,但在pm2中查看日志又不非常,这时候就需要用到命令行调试。

在宝塔终端中cd到项目目录/www/wwwroot/vue-admin-cn,然后直接运行命令

  1. $ node .output/server/index.mjs

遇到的报错:

  1. zhLocale.el.pagination = {
  2. goto: '跳至',
  3. pagesize: '条/页',
  4. total: `共计 {total} 条`,
  5. pageClassifier: '页',
  6. }
2.6.4 PM2绑定进程

3. Nest介绍

Nest在代码组织方式上借鉴了ng的方式,在底层上默认了Express的基础上可配置Fastify的这种灵活方式,满足多种选择。天生就以Typescript为类型约束,很适合中大型项目的开发。在配以管道、守卫、拦截器、装饰器等等理念使他与其它Node框架拉开了质的距离,所以这次我们采用他做为API的开发框架,整体开发下来的感觉还是比较符合预期,简单说是越开发越喜欢的感觉。

3.1 基本介绍

  1. async function bootstrap() {
  2. // 热更新
  3. if (module.hot) {
  4. module.hot.accept()
  5. module.hot.dispose(() => app.close())
  6. }
  7. }
  1. // 设置访问频率
  2. app.use(
  3. rateLimit({
  4. windowMs: 15 * 60 * 1000, // 15分钟
  5. max: 1000, // 限制15分钟内最多只能访问1000次
  6. }),
  7. )
  1. import { ApiModelProperty } from '@nestjs/swagger';
  2. export class CreateCatDto {
  3. @ApiModelProperty()
  4. readonly name: string;
  5. @ApiModelProperty()
  6. readonly breed: string;
  7. }

3.2 技术栈

技术 说明 官网
Nest 更优雅的node.js 框架 https://docs.nestjs.com/
Mysql 数据库服务 https://www.mysql.com/cn/
Typeorm Orm https://typeorm.io/
@nestjs/jwt JWT https://github.com/nestjs/jwt
class-validator 数据验证 https://github.com/typestack/class-validator

3.3 文件结构

  1. ├─config // 配置文件
  2. ├─dist // 打包文件
  3. ├─entities // 生成实体文件
  4. ├─public // 静态资源
  5. └─uploads // 上传文件
  6. ├─src
  7. ├─common // 公共文件
  8. └─logger
  9. ├─config // 配置文件
  10. ├─interface // TS文件
  11. ├─modules // 业务文件
  12. ├─app
  13. ├─article
  14. ├─auth
  15. ├─category
  16. ├─common
  17. ├─file
  18. ├─menu
  19. ├─nav
  20. ├─role
  21. ├─tags
  22. └─user
  23. └─shared // 核心文件
  24. ├─constants
  25. ├─core
  26. ├─decorator
  27. ├─exception
  28. ├─filters
  29. └─interceptors
  30. ├─transformer
  31. └─utils
  32. └─test

3.4 如何在本地运行

根目录下运行 npm install,然后运行 npm run dev

  1. // 切换环境
  2. nvm install 16.0.0
  3. nvm use 16.0.0
  4. // 安装依赖
  5. npm install
  6. // 启动项目
  7. npm start
  8. // 清除 node_modules
  9. npm run clean
  10. // 全局安装 rimraf 之后方可使用
  11. npm i rimraf -g
  12. // 清除 node_modules 重新安装依赖
  13. // 等同于 npm run clean && npm install
  14. npm run reinstall

3.5 如何上线发布

3.5.1 打包
  1. $ cd nest-admin-api
  2. $ npm run build

然后上传 nest-admin-api\dist目录中的文件,然后在服务器安装 Node_modules

3.5.2 PM2绑定进程

PM2配置如图所示

3.5.3 配置Nginx
  1. location / {
  2. proxy_pass http://127.0.0.1:3000;
  3. }

3.6 导入数据库

修改conf中的连接信息

至此发布成功。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注