第二章 开发环境搭建与工程化配置

好,咱们正式开始动手了。这一章我会带你搭好开发环境,把工程化的架子立起来。说实话,很多新手项目最后崩就崩在环境上——代码规范没人管、Git提交乱七八糟、构建脚本跑不通。我见过太多这样的案例了。

所以这一章,咱们一步到位。从Node.js配置开始,到Vite初始化,再到ESLint+Prettier的代码规范,最后是Git工作流。你跟着走一遍,后面写代码会舒服很多。

2.1 Node.js与包管理器配置

先说说Node.js。这东西是前端开发的基石,没有它,Vite、Webpack这些都跑不起来。我个人习惯用nvm来管理Node版本,为什么?因为不同项目可能依赖不同版本的Node,你总不能每次都卸载重装吧?

推荐做法:使用nvm(Node Version Manager)管理多版本Node。

安装nvm后,你可以这样操作:

# 安装指定版本
nvm install 18.18.0

# 切换版本
nvm use 18.18.0

# 查看当前版本
node -v

包管理器这块,我推荐用pnpm。为什么不是npm或yarn?说白了,pnpm的硬链接机制能帮你省下大量磁盘空间。我在一个大型项目中试过,node_modules从1.2GB降到了400MB。你想想看,这差距有多大。

小技巧:安装pnpm后,建议配置一下镜像源,国内用户用淘宝源会快很多。

# 安装pnpm
npm install -g pnpm

# 设置淘宝镜像
pnpm config set registry https://registry.npmmirror.com

嗯,这里要注意一点:pnpm的workspace功能非常强大,后面我们做monorepo时会用到。现在先记住它的安装命令就好。

2.2 Vite项目初始化

Vite,说实话,是我用过最爽的构建工具。冷启动快到飞起,HMR几乎无感。我记得第一次用Vite替换Webpack时,项目启动时间从40秒降到了2秒。那种感觉,嗯,你试过就知道了。

初始化一个Vue3 + TypeScript项目:

pnpm create vite my-vue-app --template vue-ts
cd my-vue-app
pnpm install

项目结构大概长这样:

目录/文件 作用
src/ 源代码目录
public/ 静态资源目录
vite.config.ts Vite配置文件
tsconfig.json TypeScript配置
package.json 项目依赖与脚本

我个人习惯在初始化后,立刻改一下vite.config.ts,加上路径别名。这样后面写import的时候就不用写一长串相对路径了。

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src')
    }
  }
})

注意:改完vite.config.ts后,记得重启开发服务器,否则别名不会生效。我曾经因为这个排查了半天,结果发现是忘了重启。

2.3 ESLint + Prettier 代码规范

代码规范这事,说白了就是团队之间的「共同语言」。你想想看,一个项目里有人用单引号,有人用双引号,有人缩进2格,有人缩进4格——这代码还能看吗?

我建议用ESLint做代码质量检查,Prettier做代码格式化。两者配合,一个管「对不对」,一个管「好不好看」。

安装配置:

pnpm add -D eslint prettier eslint-plugin-vue @typescript-eslint/parser @typescript-eslint/eslint-plugin
pnpm add -D eslint-config-prettier eslint-plugin-prettier

然后创建.eslintrc.cjs

module.exports = {
  root: true,
  env: {
    browser: true,
    es2021: true,
    node: true
  },
  extends: [
    'eslint:recommended',
    'plugin:vue/vue3-recommended',
    'plugin:@typescript-eslint/recommended',
    'prettier'
  ],
  parser: 'vue-eslint-parser',
  parserOptions: {
    parser: '@typescript-eslint/parser',
    ecmaVersion: 'latest',
    sourceType: 'module'
  },
  rules: {
    'vue/multi-word-component-names': 'off',
    '@typescript-eslint/no-explicit-any': 'warn'
  }
}

再创建.prettierrc

{
  "semi": false,
  "singleQuote": true,
  "tabWidth": 2,
  "trailingComma": "none",
  "printWidth": 100
}

避坑指南:我曾经遇到过ESLint和Prettier规则冲突的情况,比如ESLint要求分号,Prettier要求无分号。解决办法就是加上eslint-config-prettier,它会关掉所有与Prettier冲突的ESLint规则。

最后在package.json里加个脚本:

"scripts": {
  "lint": "eslint src --ext .vue,.ts,.tsx --fix",
  "format": "prettier --write src/**/*.{vue,ts,tsx,css}"
}

2.4 Git工作流与分支策略

Git工作流,说白了就是团队协作的「交通规则」。没有规则,大家各开各的车,早晚要撞上。我经历过最惨的一次,是三个人同时改了同一个文件,合并时冲突了200多行,光解决冲突就花了一下午。

我推荐用Git Flow模型,但根据企业项目做了简化:

分支名称 用途 来源
main 生产环境代码,只接受合并请求 release分支
develop 开发主分支,日常开发的基础 main分支
feature/* 功能开发分支,比如feature/login develop分支
release/* 发布准备分支,只修bug不加功能 develop分支
hotfix/* 紧急修复分支,直接修复生产问题 main分支

实际操作中,我习惯这样:

# 从develop拉取新功能分支
git checkout develop
git pull
git checkout -b feature/login

# 开发完成后合并回develop
git checkout develop
git merge --no-ff feature/login
git branch -d feature/login

关键点:合并时一定要用--no-ff参数。这样能保留分支历史,方便以后回溯。我曾经因为没用这个参数,导致一个功能分支的提交记录全混在一起,查bug时根本分不清哪次提交改了什么东西。

提交信息也有讲究。我推荐用Conventional Commits规范:

feat: 新增用户登录功能
fix: 修复登录页面样式错乱问题
docs: 更新API文档
refactor: 重构用户模块的权限校验逻辑

为什么要这么写?因为后面我们可以用工具自动生成CHANGELOG,还能根据提交类型自动触发CI流程。你想想看,这多省事。

小建议:在项目根目录创建.gitignore文件,把node_modules、dist、.env这些文件排除掉。我见过有人把node_modules提交到仓库,结果clone下来花了半小时,还占了几百兆空间。

好了,环境搭建这块就到这。你跟着走一遍,应该能搭出一个干净、规范、可维护的开发环境。下一章我们开始写真正的业务代码,到时候这些配置就会派上用场了。