Skip to content

1. 前端项目规范概述

1. 项目选型

推荐优先使用 Vue 3 来开发,接着是 React。

Vue 3 项目优先使用 Nuxt 3 开发,不仅仅用于 SSR,还可以用于静态站点、后台管理等项目。

Nuxt 3 选型考量

为什么使用 Nuxt 来搭建后台/中台?后台有 SEO 要求吗?

答:Nuxt 3 作为一个全栈框架,并非定义为单纯为 SEO 而生的框架。我们基于 Nuxt 3 的考量是快速、简单,并且能在静态生成、服务端渲染、客户端渲染之间无缝切换和混合,还能通过边缘服务器提供服务能力。

2. 工具要求

2.1 使用 NVM 管理 Node.js 版本

使用 NVM 管理 Node.js 版本,防止 Node.js 版本混乱。目前使用 Node.js 22 LTS 版本。

安装 NVM:

bash
winget install CoreyButler.NVMforWindows

安装最新 LTS 版本的 Node.js:

bash
nvm install --lts

2.2 corepack - 包管理器的管理器

使用 corepack 来管理 Node.js 的各种包管理器。

bash
corepack enable
corepack install -g pnpm@latest
corepack install -g yarn@latest
corepack install -g npm@latest

2.3 使用 pnpm

使用 pnpm,并且总是优先使用 pnpm 的最新版本。

截至目前,pnpm 已经能适应几乎所有项目,其拥有极致的速度,能够节省大量空间,且原生支持 Workspaces(monorepo)。因此没有必要使用 pnpm 以外的包管理器。

3. 项目要求

  • 项目必须提供 .editorconfig 用于统一编辑器配置,标准如下:
    toml
    root = true
    
    [*]
    indent_size = 2
    indent_style = space
    end_of_line = lf
    charset = utf-8
    trim_trailing_whitespace = true
    insert_final_newline = true
  • 项目必须使用 TypeScript 来开发,禁止纯 JavaScript 项目
  • 优先使用 ESLint 来进行代码检查,减少或停止使用 Prettier

4. 针对 Nuxt 3 项目的要求

单个根标签

解释:虽然 Vue 3 不再需要根标签,但 Nuxt 的许多特性依然需要原生的根标签来实现。

  • 所有的单文件组件必须使用 <script setup lang="ts"> 开头,以便于使用 Vue 3 的新特性
  • 每个组件必须有一个根标签,推荐直接使用 <div> 标签,不能使用非原生标签
    vue
    <script setup lang="ts">
    // ...
    </script>
    
    <template>
      <div>
        <!-- ... -->
      </div>
    </template>

5. Docker 镜像选型和构建

拉取当前推荐的版本:

bash
docker pull node:22.11.0

精简版本:

bash
docker pull node:22.11.0-alpine3.20

构建使用的版本:

bash
docker pull node:22.11.0-bookworm

发布版本:

bash
docker pull node:22.11.0-bookworm-slim

5.1 静态项目 Dockerfile 示例

下面提供一个 Dockerfile 样例,这是一个纯 Vue 3 项目,使用多阶段构建,第一阶段使用构建版本的镜像,安装项目依赖并构建项目。第二阶段使用精简版本的镜像,直接复制第一阶段的产物。

建议配置 nginx.conf 文件,以便于更好的控制 Nginx 服务器。

nginx
server {
  listen 8080 default_server;
  server_name _;
  absolute_redirect off;

  location / {
    root /usr/share/nginx/html;
    try_files $uri $uri/ @router;
    index index.html;
  }

  location @router {
    rewrite ^.*$ /index.html last;
  }
}

下面是 Dockerfile 样例:

dockerfile
ARG NODE_VERSION=22.11.0
ARG NPM_REGISTRY=https://registry.npmjs.org
ARG DEBIAN_MIRROR=deb.debian.org

# Builder image
FROM node:${NODE_VERSION}-bookworm as builder
ARG NPM_REGISTRY
ENV NODE_OPTIONS=--max-old-space-size=4096
WORKDIR /app

COPY package.json pnpm-lock.yaml ./

RUN npm -v && \
    npm config set registry ${NPM_REGISTRY} && \
    npm install -g pnpm && \
    pnpm -v && \
    pnpm config set registry ${NPM_REGISTRY} && \
    pnpm install --ignore-scripts

COPY . ./

RUN pnpm install && pnpm build

# Nginx Server
FROM nginx:1.27.3-alpine3.20-slim
WORKDIR /usr/share/nginx/html/
COPY --from=builder /app/dist/ ./
COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]

5.2 Nuxt 3 项目 Dockerfile 示例

下面是一个 Nuxt 3 项目的 Dockerfile 样例:

dockerfile
ARG NODE_VERSION=22.11.0
ARG NPM_REGISTRY=https://registry.npmjs.org
ARG DEBIAN_MIRROR=deb.debian.org

# Builder image
FROM node:${NODE_VERSION}-bookworm as builder
ARG NPM_REGISTRY
ENV NODE_OPTIONS=--max-old-space-size=4096
WORKDIR /app

COPY package.json pnpm-lock.yaml ./

RUN npm -v && \
    npm config set registry ${NPM_REGISTRY} && \
    npm install -g pnpm && \
    pnpm -v && \
    pnpm config set registry ${NPM_REGISTRY} && \
    pnpm install --ignore-scripts

COPY . ./

RUN pnpm install && pnpm build

# Runtime image
FROM node:${NODE_VERSION}-bookworm-slim
WORKDIR /app

COPY --from=builder /app/.output/ ./.output/

EXPOSE 3000
CMD ["node", "./.output/server/index.mjs"]