ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从零搭建Vue 3工程化环境:Node.js、Vite、TypeScript与代码规范全流程指南

从零搭建Vue 3工程化环境:Node.js、Vite、TypeScript与代码规范全流程指南 很多前端开发者都有过这样的经历面对一个全新的 Vue 3 项目从零开始搭建环境时总会遇到各种“小问题”Node.js 版本不对、包管理器冲突、依赖安装失败、Vite 配置看不懂、ESLint 和 TypeScript 报错让人头疼。网上教程很多但要么过于简单只给命令要么过于复杂直接上全家桶看完还是不知道自己的项目该怎么配。这篇文章要解决的就是帮你建立一个清晰、可靠、可复用的 Vue 3 开发环境搭建心智模型。我们不只讲“怎么装”更要讲清楚“为什么这么装”以及在不同场景下比如团队协作、CI/CD、不同UI库该如何调整。读完本文你将能独立完成一个包含现代前端工程化所有核心要素包管理、构建工具、代码规范、类型检查、Git Hooks的 Vue 3 环境搭建并理解每一步背后的设计考量。1. 为什么需要从零搭建脚手架不够香吗Vue CLI 和create-vue这类脚手架工具非常高效一键生成项目对于快速启动或学习原型非常友好。但当你需要深入定制、理解项目骨架或者团队有严格的统一规范时从零搭建的价值就凸显出来了。从零搭建能帮你解决以下问题技术栈透明化你清楚地知道项目依赖了哪些包每个包的用途是什么而不是面对一个庞大的、不知所以然的package.json。配置可控化你可以精细地控制 Vite、TypeScript、ESLint、Prettier 的每一项配置使其完全符合团队或个人的编码习惯。问题可追溯当构建或开发出现问题时你能清晰地知道是哪个环节的配置导致的而不是在脚手架生成的黑盒里盲目尝试。知识体系化这个过程强迫你理解现代前端工具链是如何协同工作的这是成为高级前端工程师的必经之路。因此本文的目标读者是希望深入理解 Vue 3 项目架构的前端开发者、需要为团队制定统一开发规范的技术负责人以及不满足于“能用就行”、追求“知其所以然”的学习者。2. 环境搭建全景图我们需要哪些工具在动手之前我们先俯瞰整个技术栈。一个现代化的 Vue 3 开发环境远不止安装 Vue 本身那么简单。它是一套工具链的有机组合工具类别核心工具主要职责为什么需要它运行时与包管理Node.js npm / yarn / pnpm提供 JavaScript 运行时管理项目依赖。项目运行和构建的基础。pnpm 因其高效的磁盘利用和安装速度成为当前主流。构建与开发服务器Vite极速的现代前端构建工具提供开发服务器、HMR热更新、生产构建。替代 Webpack开发阶段启动和热更新速度极快配置更简洁。核心框架Vue 3渐进式 JavaScript 框架用于构建用户界面。项目的主体框架。开发体验增强Vue DevTools (Browser Extension)浏览器开发者工具插件用于调试 Vue 应用。可视化检查组件树、状态、事件是开发必备。语言与类型TypeScriptJavaScript 的超集提供静态类型检查。提升代码健壮性和可维护性是现代项目的标配。代码质量与风格ESLint PrettierESLint 检查代码质量问题Prettier 统一代码格式。保证团队代码风格一致提前发现潜在错误。Git 工作流集成lint-staged Husky在 Git 提交前自动运行代码检查lint和格式化。将代码规范检查卡点在提交环节确保仓库代码质量。UI 组件库 (可选)Element Plus / Ant Design Vue 等提供丰富的、高质量的预制组件。加速中后台等业务系统的开发。本文会以 Element Plus 为例。理解了这张全景图我们的搭建步骤就有了清晰的路线。3. 基础环境准备Node.js 与包管理器这是所有事情的起点。版本选择不当是后续一切问题的根源。3.1 安装与版本管理强烈建议使用 Node 版本管理工具如nvm(macOS/Linux) 或nvm-windows这允许你在不同项目间轻松切换 Node 版本。安装 nvm访问 nvm GitHub 仓库 或 nvm-windows 按说明安装。安装并切换 Node.jsVue 3 和 Vite 推荐使用 Node.js 18 或 20 版本。# 查看可安装版本 nvm list available # 安装指定版本例如 20.11.0 nvm install 20.11.0 # 使用该版本 nvm use 20.11.0 # 验证安装 node -v # 应输出 v20.11.0 npm -v # 查看 npm 版本3.2 选择包管理器npm 是 Node.js 自带的但yarn和pnpm在性能和体验上更优。当前社区趋势是 pnpm它采用硬链接和符号链接能极大节省磁盘空间并提升安装速度。# 使用 npm 全局安装 pnpm npm install -g pnpm # 验证安装 pnpm -v至此基础环境就绪。接下来我们创建项目骨架。4. 初始化项目与核心依赖安装我们从一个空文件夹开始一步步构建。创建项目目录并初始化mkdir vue3-project-from-scratch cd vue3-project-from-scratch pnpm init执行pnpm init会生成一个package.json文件你可以一路回车使用默认值后续再修改。安装 Vue 3 和 Vitepnpm add vuenext pnpm add -D vite vitejs/plugin-vuevuenext安装 Vue 3 核心库。vite安装 Vite 本体。vitejs/plugin-vueVite 官方提供的 Vue 插件用于解析.vue单文件组件。安装开发服务器与构建相关依赖pnpm add -D types/nodetypes/node为 Node.js API 提供 TypeScript 类型定义在配置 Vite 时很有用。现在你的package.json的dependencies和devDependencies应该初具雏形。接下来是项目结构。5. 项目结构设计与配置文件清晰的项目结构是良好工程实践的开端。创建以下文件和文件夹vue3-project-from-scratch/ ├── index.html # 项目入口 HTML ├── package.json ├── vite.config.ts # Vite 配置文件 ├── tsconfig.json # TypeScript 配置文件 ├── .gitignore # Git 忽略文件 ├── public/ # 静态资源目录 ├── src/ │ ├── App.vue # 根组件 │ ├── main.ts # 应用入口文件 │ ├── components/ # 通用组件目录 │ ├── views/ # 页面级组件目录 │ ├── router/ # 路由目录 (后续添加) │ ├── store/ # 状态管理目录 (后续添加) │ └── assets/ # 样式、图片等资源 └── env.d.ts # 环境变量类型声明 (后续添加)5.1 入口文件index.htmlVite 将index.html视为入口和模块图的一部分。它非常简洁!DOCTYPE html html langzh-CN head meta charsetUTF-8 / link relicon typeimage/svgxml href/vite.svg / meta nameviewport contentwidthdevice-width, initial-scale1.0 / titleVue 3 从零搭建项目/title /head body div idapp/div !-- 注意这里通过模块化方式引入 main.ts -- script typemodule src/src/main.ts/script /body /html关键点是div idapp作为 Vue 应用的挂载点以及通过script typemodule引入main.ts。5.2 应用入口src/main.ts这是 JavaScript/TypeScript 的入口点负责创建 Vue 应用实例并挂载到 DOM。// src/main.ts import { createApp } from vue import App from ./App.vue // 创建应用实例 const app createApp(App) // 在这里可以统一注册全局组件、插件等 // app.component(MyComponent, MyComponent) // app.use(router) // app.use(store) // 将应用挂载到 #app 元素上 app.mount(#app)5.3 根组件src/App.vue这是 Vue 应用的根组件是所有其他组件的容器。!-- src/App.vue -- template div h1Hello, Vue 3 from Scratch!/h1 p这是一个从零搭建的 Vue 3 项目。/p /div /template script setup langts // 使用 script setup 语法糖这是 Composition API 的编译时语法糖更简洁。 // langts 表示使用 TypeScript /script style scoped /* scoped 使样式仅作用于当前组件 */ h1 { color: #42b983; } /style5.4 Vite 配置vite.config.ts这是 Vite 的核心配置文件决定了项目的构建行为。// vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import { resolve } from path // 从 node:path 导入用于路径解析 // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], // 使用 Vue 插件 resolve: { alias: { : resolve(__dirname, src) // 设置 指向 src 目录方便导入 } }, server: { host: localhost, // 指定开发服务器主机名 port: 5173, // 指定开发服务器端口 (默认是 5173) open: true, // 启动后自动在浏览器打开 // 代理配置示例用于解决跨域 // proxy: { // /api: { // target: http://your-api-server.com, // changeOrigin: true, // rewrite: (path) path.replace(/^\/api/, ) // } // } }, // 构建配置 build: { outDir: dist, // 指定输出目录 sourcemap: false, // 生产环境不建议开启 sourcemap // 配置 rollup 选项 rollupOptions: { output: { // 对 chunk 文件进行命名 chunkFileNames: static/js/[name]-[hash].js, entryFileNames: static/js/[name]-[hash].js, assetFileNames: static/[ext]/[name]-[hash].[ext] } } } })5.5 TypeScript 配置tsconfig.jsonTypeScript 编译器需要此文件来了解如何编译你的代码。{ compilerOptions: { target: ES2020, // 编译目标 ECMAScript 版本 useDefineForClassFields: true, lib: [ES2020, DOM, DOM.Iterable], // 要包含的库文件 module: ESNext, // 模块系统 skipLibCheck: true, // 跳过库文件的类型检查以提升速度 /* Bundler mode */ moduleResolution: bundler, // 与 Vite 等打包器配合 allowImportingTsExtensions: true, // 允许导入 .ts 扩展名 resolveJsonModule: true, // 允许导入 JSON 模块 isolatedModules: true, // 确保每个文件可独立编译 noEmit: true, // Vite 负责构建tsc 不输出文件 jsx: preserve, // 保留 JSX 用于后续转换 /* Linting */ strict: true, // 启用所有严格类型检查 noUnusedLocals: true, // 报告未使用的局部变量 noUnusedParameters: true, // 报告未使用的参数 noFallthroughCasesInSwitch: true, /* Path Mapping */ baseUrl: ., // 解析非相对模块的基础目录 paths: { /*: [src/*] // 路径别名与 Vite 配置中的 alias 对应 } }, include: [src/**/*.ts, src/**/*.d.ts, src/**/*.tsx, src/**/*.vue], // 包含的文件 references: [{ path: ./tsconfig.node.json }] // 引用项目配置 }同时为 Vite 等工具配置文件创建一个单独的tsconfig.node.json{ compilerOptions: { composite: true, skipLibCheck: true, module: ESNext, moduleResolution: bundler, allowSyntheticDefaultImports: true, strict: true }, include: [vite.config.ts] }5.6 环境变量类型声明env.d.ts为了让 TypeScript 识别 Vite 注入的import.meta.env变量我们需要类型声明。// src/env.d.ts /// reference typesvite/client / // 扩展 ImportMetaEnv 接口定义你自己的环境变量类型 interface ImportMetaEnv { readonly VITE_APP_TITLE: string // 在这里添加更多环境变量... } interface ImportMeta { readonly env: ImportMetaEnv }5.7 Git 忽略文件.gitignore创建.gitignore文件排除不需要版本控制的文件。# Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* # Runtime data pids *.pid *.seed *.pid.lock # Dependency directories node_modules/ dist/ dist-ssr/ *.local # Editor directories and files .vscode/* !.vscode/extensions.json .idea .DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? # Environment variables .env .env.local .env.*.local6. 启动项目与验证现在让我们启动开发服务器验证一切是否正常。修改package.json中的脚本{ scripts: { dev: vite, // 启动开发服务器 build: vue-tsc vite build, // 构建生产版本 (先进行类型检查) preview: vite preview // 预览生产构建结果 } }注意build命令中的vue-tsc这是一个命令行工具用于对.vue文件进行 TypeScript 类型检查。需要安装pnpm add -D vue-tsc。安装vue-tsc并启动pnpm add -D vue-tsc pnpm dev访问应用如果配置正确终端会输出Local: http://localhost:5173/并在浏览器自动打开页面。你应该看到 “Hello, Vue 3 from Scratch!” 的绿色标题。恭喜一个最基础的 Vue 3 开发环境已经运行起来了。但这只是骨架接下来我们要为其注入“肌肉”——代码规范、类型安全、提交检查等工程化能力。7. 集成代码规范ESLint Prettier代码规范是团队协作和项目长期健康的基石。我们将 ESLint 用于代码质量检查Prettier 用于代码格式美化并让它们协同工作。7.1 安装依赖# ESLint 核心及插件 pnpm add -D eslint eslint-plugin-vue typescript-eslint/parser typescript-eslint/eslint-plugin # Prettier 及与 ESLint 集成的插件 pnpm add -D prettier eslint-config-prettier eslint-plugin-prettier # Vue 官方推荐的 ESLint 配置可选但推荐 pnpm add -D vue/eslint-config-typescript vue/eslint-config-prettier7.2 配置 ESLint创建.eslintrc.cjs文件使用.cjs扩展名确保在 ESM 项目中也能被正确识别为 CommonJS。// .eslintrc.cjs module.exports { root: true, // 标识为根配置文件避免向上查找 env: { browser: true, es2021: true, node: true, }, extends: [ eslint:recommended, // ESLint 推荐规则 plugin:vue/vue3-recommended, // Vue 3 推荐规则 vue/eslint-config-typescript, // Vue TypeScript 规则 vue/eslint-config-prettier, // 关闭与 Prettier 冲突的规则 plugin:prettier/recommended, // 启用 prettier 插件并继承其规则 ], parserOptions: { ecmaVersion: latest, parser: typescript-eslint/parser, // 使用 TS 解析器 sourceType: module, }, plugins: [vue, typescript-eslint], rules: { // 可以在这里覆盖或添加自定义规则 vue/multi-word-component-names: off, // 允许单单词组件名 typescript-eslint/no-unused-vars: [error, { argsIgnorePattern: ^_ }], // 忽略以下划线开头的未使用变量 prettier/prettier: [error, { endOfLine: auto }], // 使用 prettier 规则 }, overrides: [ { files: [*.vue], // 针对 .vue 文件的特定配置 rules: { // 例如在 .vue 文件中关闭某个规则 }, }, ], }7.3 配置 Prettier创建.prettierrc.json文件定义你的代码风格。{ $schema: https://json.schemastore.org/prettierrc, semi: false, // 句尾不加分号 singleQuote: true, // 使用单引号 printWidth: 100, // 每行最大宽度 trailingComma: es5, // 在多行逗号分隔的语法结构中末尾添加逗号 tabWidth: 2, // 缩进空格数 useTabs: false, // 使用空格缩进 endOfLine: auto // 换行符自动检测 }同时创建一个.prettierignore文件排除不需要格式化的文件或目录。/dist /node_modules *.local .env .DS_Store7.4 添加 npm 脚本并测试在package.json的scripts中添加 lint 和 format 命令{ scripts: { dev: vite, build: vue-tsc vite build, preview: vite preview, lint: eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx --fix --ignore-path .gitignore, // 检查并自动修复 format: prettier --write . // 格式化所有文件 } }运行pnpm lint和pnpm format来测试配置。现在你的代码风格和质量就有了自动化保障。8. 集成 Git HooksHusky lint-staged我们不想在每次提交时都手动运行 lint 和 format。通过 Git Hooks我们可以自动化这个过程。8.1 安装与初始化pnpm add -D husky lint-staged # 初始化 Husky创建 .husky 目录 npx husky init # 将自动生成的 pre-commit 钩子内容替换掉8.2 配置 lint-staged在package.json中添加lint-staged配置它只对暂存区staged的文件进行操作效率更高。{ // ... 其他配置 lint-staged: { *.{js,jsx,ts,tsx,vue}: [ eslint --fix, // 对指定文件运行 ESLint 修复 prettier --write // 对指定文件运行 Prettier 格式化 ] } }8.3 配置 Git Hook修改.husky/pre-commit文件#!/usr/bin/env sh . $(dirname -- $0)/_/husky.sh npx lint-staged现在每次执行git commit时Husky 都会触发pre-commit钩子执行lint-staged后者会自动对本次提交涉及的代码进行 ESLint 修复和 Prettier 格式化。如果 ESLint 有无法自动修复的错误提交会被阻止。9. 集成 UI 组件库以 Element Plus 为例对于中后台项目使用成熟的 UI 组件库能极大提升开发效率。这里以 Element Plus 为例。9.1 安装与引入# 安装 Element Plus 及其图标库 pnpm add element-plus element-plus/icons-vue9.2 全局完整引入最简单的方式修改src/main.tsimport { createApp } from vue import App from ./App.vue // 引入 Element Plus 及样式 import ElementPlus from element-plus import element-plus/dist/index.css const app createApp(App) app.use(ElementPlus) // 全局注册 app.mount(#app)9.3 按需引入推荐减小打包体积首先安装自动导入插件pnpm add -D unplugin-vue-components unplugin-auto-import然后修改vite.config.tsimport { defineConfig } from vite import vue from vitejs/plugin-vue import { resolve } from path // 引入自动导入插件 import AutoImport from unplugin-auto-import/vite import Components from unplugin-vue-components/vite import { ElementPlusResolver } from unplugin-vue-components/resolvers export default defineConfig({ plugins: [ vue(), // 配置自动导入 AutoImport({ resolvers: [ElementPlusResolver()], }), Components({ resolvers: [ElementPlusResolver()], }), ], // ... 其他配置 })配置完成后你可以在任何.vue文件中直接使用 Element Plus 组件无需手动import和app.component注册。插件会在构建时自动处理。9.4 在 App.vue 中测试修改src/App.vue添加一个 Element Plus 按钮template div stylepadding: 20px; h1Hello, Vue 3 from Scratch!/h1 p这是一个从零搭建的 Vue 3 项目。/p el-button typeprimary clickhandleClick这是一个 Element Plus 按钮/el-button el-alert title成功提示 typesuccess :closablefalse stylemargin-top: 20px;/el-alert /div /template script setup langts const handleClick () { console.log(按钮被点击了) } /script style scoped h1 { color: #42b983; } /style重启开发服务器 (pnpm dev)你应该能看到一个蓝色的 Primary 按钮和一个成功提示框。这证明 Element Plus 已成功集成。10. 常见问题与排查思路在搭建过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案pnpm dev启动失败提示Cannot find module ‘xxx’依赖未安装或安装不全Node 模块缓存问题。1. 检查package.json和node_modules。2. 删除node_modules和pnpm-lock.yaml重新pnpm install。确保所有dependencies和devDependencies都已正确安装。使用pnpm install --force强制重新安装。浏览器访问localhost:5173白屏控制台报错Failed to resolve import “vue”Vite 无法解析vue模块。通常是路径别名或配置问题。1. 检查vite.config.ts中的resolve.alias配置。2. 检查index.html中引入main.ts的路径。确保vite.config.ts中正确配置了别名并且在tsconfig.json中也有对应配置。.vue文件中的script setup语法报类型错误TypeScript 无法识别 Vue SFC 的类型。检查src/env.d.ts文件是否存在并确保其内容正确引用了vite/client。确认已安装vue-tsc并且env.d.ts文件内容正确。可以尝试重启 IDE (VSCode)。ESLint 在.vue文件中报Parsing error: ‘’ expected.ESLint 解析器无法处理.vue文件中的script setup。检查.eslintrc.cjs中extends是否包含plugin:vue/vue3-recommended以及parser是否为typescript-eslint/parser。确保 ESLint 配置正确扩展了 Vue 3 和 TypeScript 相关的规则集。Husky 的 pre-commit 钩子不执行.husky/pre-commit文件没有可执行权限Husky 未正确安装。1. 在终端执行ls -la .husky/查看文件权限。2. 运行npx husky init重新初始化。给钩子文件添加执行权限chmod x .husky/pre-commit。确保项目已git init。引入 Element Plus 组件后样式丢失样式文件未引入按需引入插件配置错误。1. 如果是完整引入检查main.ts中是否导入了 CSS 文件。2. 如果是按需引入检查vite.config.ts中插件配置。完整引入确认import ‘element-plus/dist/index.css’。按需引入检查unplugin-vue-components和unplugin-auto-import的版本和配置。11. 最佳实践与工程建议版本锁定使用pnpm-lock.yaml(或package-lock.json/yarn.lock) 锁定依赖版本确保团队所有成员和 CI/CD 环境依赖一致。环境变量管理使用.env、.env.development、.env.production文件管理不同环境下的变量。变量名必须以VITE_开头才能在客户端代码中通过import.meta.env访问。路径别名坚持使用指向src目录使导入路径更清晰、更易于重构。组件规范组件名使用 PascalCase (例如MyComponent.vue)。非单文件组件 (如工具函数) 使用 camelCase。在components目录下建立子目录分类管理通用组件。代码分割利用 Vite 和 Vue Router 的懒加载功能实现路由级和组件级的代码分割优化首屏加载速度。生产构建优化使用vite build --mode production构建。分析构建产物pnpm add -D rollup-plugin-visualizer并在 Vite 配置中引入分析包体积优化依赖。考虑使用 CDN 外链一些大型库 (如vue,element-plus)通过vite的build.rollupOptions.external配置。团队规范将.eslintrc.cjs、.prettierrc.json、.editorconfig、.gitignore等配置文件纳入版本控制确保团队代码风格统一。至此你已经拥有了一个功能完整、配置清晰、工程化程度高的 Vue 3 开发环境。这个环境不仅能够用于开发其配置思路和工具链选型也能作为你未来其他项目的基础模板。记住理解每个工具的作用和配置背后的原因比单纯复制命令更重要。接下来你可以在此基础上继续集成 Vue Router、Pinia (状态管理)、Axios (HTTP 客户端)、测试工具等构建属于你自己的完整技术栈。
返回列表