刚写前端那会儿,我对Vue的第一个困惑不是“怎么用”,而是“到底怎么装”。网上搜一圈,有的说下个Node.js就行,有的让用Vue CLI,还有的推荐Vite,版本还分Vue 2和Vue 3,菜鸟直接看懵。这其实不怪你,Vue这套开发环境本来就被包装得有些绕:先是“Vue本身不需要安装”,又是“脚手架帮你建项目”,中间还夹着一个永远躲不开的Node.js和npm包管理器。这篇保姆级教程,我就按我自己一步一步踩出来的顺序,把Vue的下载和环境配置从头过一遍,适合零基础想入门Vue、或者在旧电脑上折腾半天装不上的朋友,照着做基本能一次跑通。
1. 动手前的思路梳理:装Vue之前先搞明白这几件事
1.1 Vue本身不需要“安装”,那到底在装什么?
很多第一次接触Vue的人都会下意识地问:Vue是不是像微信一样,下载个安装包双击装完就能用?
这么说吧,如果你只是想在HTML页面里试试Vue的模板语法,直接用<script>标签引入Vue的CDN就能跑,根本没有“安装”这一步。我第一回跑通Vue,就是新建了一个index.html文件,把Vue的CDN链接贴进去,然后写了两行数据绑定的代码,一刷新,页面上就出效果了。
那为什么正规项目还要“下载安装”?因为这个阶段你用的是全局引用版本,代码量一上去,就得靠模块化开发、组件拆分、热更新、编译器这些东西,而这些必须依赖一个完整的前端工程化环境。所以在实际开发场景里,“安装Vue”实际上是在安装三样东西:
- Node.js:Vue项目的运行底座,开发服务器和构建工具都跑在它上面。
- 包管理器(npm/yarn/pnpm):负责下载Vue核心库、Vue Router、Pinia这些依赖包。
- 脚手架工具(Vite或Vue CLI):用来初始化项目结构、启动开发服务器、打包产物、配置编译规则。
后面两个严格来说都不是Vue的一部分,但它们在一起组成了“现代Vue开发的完整环境”。换句话说,你真正需要花时间搞定的是这套工具的安装和配置,而不是Vue库本身。
1.2 工具链的角色分工,最好用哪一套?
这套工具链我可以用一个生活化的类比帮你理解:假设你要装修一间房子,Vue核心库是“室内设计方案”,Node.js是“施工场地和水电基础”,npm是“建材采购平台”,而Vite或Vue CLI是“施工队长”,帮你拉材料、按设计图纸把房子盖起来。没有施工场地,方案没法落地;没有采购平台,材料得自己去一家家店找,还容易找错;没有施工队长,所有活儿都得自己手动干,能累死。
在2024、2025年的当前环境下,我的建议是:新项目一律用 Vite + Vue 3 这套组合。Vite基于esbuild和浏览器原生ES模块,冷启动速度远超Webpack时代的Vue CLI,改代码热更新也快,体验完全是两个时代的东西。
那Vue CLI还用不用?需要维护Vue 2老项目的话,Vue CLI还是得会;或者你公司项目技术栈还很老,模板还在用vue.config.js配置,那也得保留。但日常学习、新开项目,别在Webpack配置上浪费时间,Vite就是你最省心的选择。
下面这张表是我拍脑袋整理的,方便你直观对比:
| 对比项 | Vite(推荐) | Vue CLI |
|---|---|---|
| 默认支持Vue版本 | Vue 3 | Vue 2 / Vue 3均可 |
| 底层构建工具 | esbuild + Rollup | Webpack |
| 冷启动速度 | 极快 | 较慢 |
| 配置复杂度 | 低,零配置开箱即用 | 中,需要理解Webpack概念 |
| 适合场景 | 新项目、学习、中小型应用 | 老项目维护、兼容旧生态 |
1.3 版本选择:Vue 3 还是 Vue 2?
这个话题放在前面很重要,因为你在下载安装时就会遇到“选哪个包”的问题。Vue 2虽然官方还在维护,但已经进入维护末期,Vue 3才是主流。如果你刚学Vue,直接学Vue 3 + Composition API,别走回头路。唯一的例外是你面试或公司要求维护Vue 2项目,那可以用Vue 2.7(这个版本带了部分Composition API的能力,相对友好)。
项目创建时,Vite和Vue CLI都会让你选Vue 3还是Vue 2,这一步千万别选错,不然装完之后代码风格、依赖版本、API都完全不一样。
2. 基础环境安装:Node.js 与 npm 的下载与配置
2.1 Node.js 下载与安装,LTS版本优先
Vue环境里第一个真正要下载的就是Node.js。官方地址是nodejs.org,进去以后你会在首页看到两个下载按钮:左边是LTS(长期支持版),右边是Current(当前最新版)。
别犹豫,选LTS。我见过太多人一上来就装最新的Current版,结果第二天就遇到某个依赖包还没适配新Node版本,报错报得一头雾水。LTS版本的兼容性经过了市场充分验证,对大多数前端项目都是最稳妥的。我自己至今都习惯装LTS,日常开发完全够用。
Windows系统安装Node.js就是一个傻瓜式next过程。唯一要注意的是安装路径不要带中文和空格,尽量装在C:\nodejs这种简单路径下。安装过程中有一个“Add to PATH”的选项,默认是勾上的,一定要确认它处于勾选状态,这决定了你之后能不能在命令行直接敲node -v。
macOS用户如果装了Homebrew,可以brew install node一键装;没装的话就从官网下pkg安装包。Linux用户用apt或yum装,但版本可能偏老,建议装完看下版本,太老就手动升级。
安装完成后,先不急着继续,打开命令行(Windows推荐用PowerShell或cmd,macOS用终端),输入下面两个命令验证:
node -v npm -v正常情况下会输出类似v20.11.0和10.2.4这样的版本号。如果说node不是内部或外部命令,说明PATH没配上,回头检查安装那一步,或者手动把Node安装目录加到系统环境变量里。
2.2 设置npm镜像源,下载速度直接拉满
Node装好之后,npm也有了。npm默认的官方源在国外,国内环境下下载依赖包经常慢得像蜗牛爬,甚至直接超时失败。新手最容易在这里挫败感拉满:项目明明创建好了,一npm install就卡住不动。
解决办法是换镜像源。目前用得最广的是淘宝npm镜像,命令行里执行下面这句话就能永久生效:
npm config set registry https://registry.npmmirror.com改完之后,可以执行npm config get registry确认一下,如果输出上面那串地址,说明已经配置成功。从这以后,你下载Vue、Vue Router、Vite等所有依赖包,速度都会有质的提升。我经过多次实测,这个源在国内网络的下载速度基本能跑满带宽,比官方源快了不止一个量级。
2.3 全局权限与常用npm配置
到了这一步,npm本身已经能正常使用了,但还有两个配置我建议顺手做掉,能省掉后面一堆麻烦。
第一个是换包管理器并行源。如果你更习惯用pnpm或yarn,可以单独再装对应工具:
npm install -g pnpm npm install -g yarn装完之后它们的源需要单独设置,设置方式和npm一样的逻辑。不过新手阶段我建议先把npm用熟,别一次引入太多工具,容易绕晕。
第二个是处理全局安装权限问题。在Linux或macOS上,如果用npm install -g装全局工具,有时会碰到EACCES: permission denied这类权限报错,意思是当前用户没有写入全局目录的权限。这个问题的正规解法不是加sudo(用sudo会让后续包管理权限混乱),而是把npm的全局目录改到当前用户目录下:
npm config set prefix "$HOME/.npm-global"然后编辑shell配置文件(比如~/.zshrc或~/.bashrc),添加一行:
export PATH="$PATH:$HOME/.npm-global/bin"执行source ~/.zshrc让配置生效,再npm install -g就没有权限问题了。Windows上一般不太会遇到这个,全局包默认安装在AppData目录下。
3. 快速创建一个Vue项目,保姆级完整实操
3.1 方案A:Vite脚手架创建Vue 3项目
环境准备好后,创建Vue项目就非常快了。现在最推荐的方式是使用Vite创建,命令根据包管理器不同稍有差异,我以npm为例:
npm create vite@latest my-vue-app执行这条命令后,脚手架会提示你选框架,列出Vue、React、Svelte、Solid等选项;选完框架后还会问你用JavaScript还是TypeScript。这里我给新手的建议是:先选JavaScript,别直接上TypeScript。不是说TS不好,而是在你还不熟悉Vue的响应式、事件、生命周期这些概念时,TS的类型报错会混进来干扰你分辨问题的原因。等能用JS熟练写组件了,再切到TS,你会觉得水到渠成。
完整创建过程的实际交互大概是这样:
? Select a framework: » Vue ? Select a variant: » JavaScript命令跑完后会在当前目录生成一个my-vue-app文件夹,这个项目的“壳”就出来了。接下来进入项目目录:
cd my-vue-app npm installnpm install会根据项目里的package.json把Vue核心库、Vite等依赖全部拉下来,这一步默认走的是上一节配置的淘宝镜像源,正常情况下几十秒到一分钟就结束了。装完之后启动开发服务器:
npm run dev终端会打印出一个本地地址,一般是http://localhost:5173,浏览器打开它,看到这个画面就说明环境搭建成功了。
3.2 方案B:Vue CLI创建项目,兼容老生态
如果你确实要用Vue CLI(比如维护旧项目入职培训,或者公司脚手架还是老的),那流程稍微不一样。先全局安装Vue CLI工具本身:
npm install -g @vue/cli确认装好的命令是:
vue --version能输出版本号(比如@vue/cli 5.0.8)就说明工具装好了。然后创建项目:
vue create my-vue-cli-app创建过程中会出现一个交互式选项:默认预设(Default)还是手动选择特性(Manually select features)。默认预设是Vue 3 + Babel + ESLint,比较省心,我推荐第一次用默认就行。但如果你知道项目需要Router、Pinia、TypeScript这些,选“Manually select features”然后按需勾选,这样脚手架会直接帮你把依赖和配置文件都生成好。
手动选择时用空格键勾选/取消,方向键上下移动,回车确认。里面那些特性选项,我建议新手至少要勾上Router和Vuex或Pinia,后面写多页面应用时会用它,少一个两步不如一次性搭好。选完特性后它会问一系列配置选择(比如是否使用history模式的路由、ESLint的配置风格等),默认选项基本都能接受。
Vue CLI创建的项目默认用Webpack打包,启动命令同样是npm run dev或npm run serve,默认端口是8080。看到“App running at”的提示就是成功了。
3.3npm install背后的原理以及版本锁定的意义
新手往往不理解为什么每次克隆项目都要执行npm install,我简单说一下。package.json里记录了项目依赖的包名,比如vue: ^3.4.21,但并没有把实际下载的代码存进仓库。npm install就是拿着这份清单去npm源下载具体的包,装到本地的node_modules目录。同时,npm会根据package.json生成一个package-lock.json文件,记录每个依赖的实际安装版本,通过它来保证你团队成员之间装出来的依赖版本一致。
这里有个很常见的坑:如果你压根不提交package-lock.json,下次队友装依赖时,某个包可能因为版本范围内的更新行为不同导致项目直接跑不起来。所以项目里只要生成了这个文件,就一定要提交进Git,别手滑把它加进.gitignore。
另一个注意点是:如果package.json里的依赖被手改过,千万别硬着脸继续跑,老老实实删掉node_modules重新npm install,这是最干净的做法。
3.4 启动开发服务器后,浏览器打开的默认页面能说明什么
执行npm run dev后,浏览器打开http://localhost:5173会看到一个Vite标识的欢迎页。这个页面能正常出现,说明四个环节全部打通:
- Node.js能正常运行JavaScript脚本;
- npm正确下载并放好了所有依赖包;
- Vite成功读取了项目配置并启动了开发服务器;
- 浏览器能正常访问本地服务器的资源。
有一个细节新手容易忽略:Vite启动后终端界面会进入交互模式,按键盘上的q键可以关闭开发服务器,按r可以强制重启。不要因为关不掉终端进程就整个命令行窗口强制关掉,那样有机会产生端口占用问题。
4. 项目下载后的后续配置:目录、路由、状态管理、路径别名、代码规范
4.1 项目目录结构逐层解读,别一进来就迷路
一个Vite创建的Vue 3项目,初始目录结构一般是这样的:
my-vue-app ├── node_modules/ # 所有依赖包存放位置 ├── public/ # 静态资源,不会被编译 ├── src/ # 源代码主目录 │ ├── assets/ # 资源文件(图片、图标、样式等) │ ├── components/ # 可复用组件 │ ├── App.vue # 根组件 │ └── main.js # 应用入口文件 ├── index.html # 页面模板入口 ├── package.json # 项目配置和依赖清单 ├── vite.config.js # Vite配置文件 └── .gitignore # Git忽略规则日常开发99%的时间都在src目录下。很多新手一上来就纠结node_modules为什么这么大,那是因为它把依赖的依赖全下载了,属于正常现象,你永远不要手动去改里面的东西。真正要注意的是vite.config.js,你后面要配置路径别名、代理服务、打包优化都要改它。
index.html只有一行关键代码:
<div id="app"></div> <script type="module" src="/src/main.js"></script>因为Vite天然支持ES模块,所以浏览器直接加载main.js作为应用入口。在main.js里,代码会先createApp(App)创建一个Vue应用实例,再.mount('#app')把整个应用挂载到那个div上。
4.2 安装并配置Vue Router,做多页面导航的基础
真实的项目不可能只有一个页面,所以Vue Router基本上是必装的路由管理库。安装命令:
npm install vue-router@4Vue 3项目对应的是Router 4,千万别在Vue 3项目里装vue-router@3,那是Vue 2专用的。装完之后,在src下新建一个router/index.js文件:
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' const routes = [ { path: '/', name: 'home', component: Home }, { path: '/about', name: 'about', component: () => import('../views/About.vue') } ] const router = createRouter({ history: createWebHistory(), routes }) export default router然后到main.js里注册一下:
import router from './router' app.use(router)注意上面这个写法用了路由懒加载:component: () => import(...),意思是访问/about这个页面的时候才去加载About.vue对应的代码包。我第一次做单页应用时没注意这点,把所有页面都打包成了一个超大的JS文件,首屏加载速度被拖得很惨。用懒加载之后,每个页面拆成独立小块,按需加载,体验完全不一样。
4.3 安装并配置Pinia,替代Vuex的状态管理
Vue 3官方推荐的状态管理库是Pinia,它比Vuex更轻量,API也更简洁。安装命令:
npm install pinia在src下新建stores/index.js或直接新建stores/counter.js来写一个store:
import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), actions: { increment() { this.count++ } } })使用的时候,在组件里直接调用:
import { useCounterStore } from '../stores/counter' const counter = useCounterStore() counter.increment()然后在main.js注册Pinia实例:
import { createPinia } from 'pinia' const pinia = createPinia() app.use(pinia)为什么我不推Vuex了?在我实际项目里,Vuex的Mutation和Action绕来绕去,代码量翻倍但逻辑并不更清晰。Pinia删掉了Mutation,Action直接支持同步和异步,TypeScript支持也是重建过的,用起来手感和Vue 3的Composition API高度一致。除非你维护的老项目已经用了Vuex,否则新项目直接上Pinia,没有任何纠结的必要。
4.4 配置路径别名,让 import 路径不再一长串嗷嗷叫
项目页面一多,你就会体会到相对路径的痛:import Input from '../../../components/Input.vue',看到那一串../都想砸键盘。解决方法是配置路径别名,把@指向src目录。
在vite.config.js里配置如下:
import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } } })配置完之后,所有import都能这样写:
import Input from '@/components/Input.vue'注意如果你用的是纯JavaScript,可能还需要在jsconfig.json里配合写一下路径提示(如果你用VS Code的话):
{ "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["src/*"] } } }不然编辑器不一定认得@这个别名,会给你标红波浪线,看着难受。
4.5 代码规范:给项目装好ESLint和Prettier
写代码一时爽,维护火葬场。我强烈建议在项目搭建初期就配好ESLint和Prettier,别等代码写了几千行再回头搞,那时候改配置改到哭。Vite创建项目时不会默认装ESLint,需要手动初始化:
npm install -D eslint eslint-plugin-vue npx eslint --initnpx eslint --init会问你几个问题:比如代码风格、模块类型、框架(选Vue),完了以后会自动生成.eslintrc.cjs配置文件。然后加两个脚本到package.json的scripts里:
"lint": "eslint . --ext .vue,.js --fix", "format": "prettier --write \"src/**/*.{vue,js,css}\""Prettier的安装和配置可以写一整篇文章,这里提一个关键点:ESLint负责“查错”,Prettier负责“排版”,两者职责不同,别混为一谈。项目里装好之后,保存即格式化、提交前跑一遍lint,代码风格会稳定很多。
这套配置做完,整个项目的“后续配置”基本就齐全了,后续加新依赖、写新组件都很顺手。
5. 常见问题与排查技巧实录,全是踩坑换来的经验
5.1 命令找不到:node -v提示不是内部或外部命令
这种情况90%是Node.js没有正确加入PATH。解决路径是:Windows在“系统属性 → 环境变量”里看Path有没有包含Node的安装目录;macOS/Linux查看shell配置文件里的export PATH。另一个常见情况是终端环境变量有缓存,重开一个新的命令行窗口再试。
我给几个朋友远程调过环境,发现还有人是下载完Node安装包后没点进安装向导,光是把安装包放在桌面上,然后双击运行node -v,这当然不识别。记住安装过程必须走一遍向导,真正把软件写进系统目录。
5.2 依赖安装失败:npm install报错、超时或者卡顿
第一步先确认镜像源是不是换成国内源了,检查方法是我在2.2节写过的npm config get registry。如果源没问题但还是失败,就把node_modules和package-lock.json删掉,重新安装:
rm -rf node_modules package-lock.json npm install还有一种是node版本和依赖包不兼容导致编译失败,报错里通常有node-gyp或node-sass这些字样。处理办法是查看项目package.json里要求的Node版本,用nvm切换Node版本。Windows上可以用nvm-windows,macOS/Linux用nvm。
5.3node-sass与 Node版本的经典冲突
老项目里用node-sass的情况一抓一大把,而node-sass是出了名的“挑剔”,对Node版本有强绑定。某天你升级了Node,项目跑起来直接报错:
Error: Node Sass version 7.0.0 is incompatible with your current environment这个问题的解决思路有三种:第一种,把node-sass换成dart-sass,做法是卸载node-sass、安装sass,这版是纯JavaScript实现,不再有和Node版本的编译死锁问题。第二种,固定Node版本到项目当初开发使用的版本。第三种,升级整个项目构建链。这三种我实际都试过,最推荐第一种,一劳永逸。
如果是Vite + Vue 3新项目,默认已经使用了dart-sass(新版叫sass),这块基本不会惹麻烦,这也是我推荐新项目走Vite的另一个原因。
5.4 端口被占用:Port 5173 is already in use
开发服务器启动时经常碰到端口被占用,报错信息通常是:
Port 5173 is already in use. Trying another one...Vite和Vue CLI都会自动尝试换端口,但如果你的开发环境里跑了很多服务,最好知道手动指定端口:
npm run dev -- --port 5174Vite的端口参数是--port,别搞混了。还有一种常见情况是上次开发服务器没关闭干净,进程还在后台占用端口。Windows下可以这么查:
netstat -ano | findstr :5173 taskkill /PID 1234 /FmacOS/Linux下用lsof -i :5173查占用进程,然后kill -9 进程号。
5.5 高频问题速查表
| 问题现象 | 最常见原因 | 解决方案 |
|---|---|---|
npm run dev报错找不到vue模块 | 依赖没装完整 | 删node_modules重装 |
| 页面白屏控制台报错 | 组件引入路径错误 | 检查import路径大小写和@别名 |
| 路由切换到新页面刷新404 | history模式缺少服务端配置 | 改用hash模式或配置服务端回退 |
| ESLint一大片红色波浪线 | 未配置规则或需要初始化 | 跑npx eslint --init |
| 热更新不生效 | 项目文件权限或缓存问题 | 重启dev server |
安装依赖时卡在reify阶段 | npm版本或镜像源不稳定 | 升级npm或切换镜像源 |
最后再分享一个小习惯
我原本想把这个话题收在排查技巧这里,但想了想还是得多说两句。Vue环境搭建这件事,本质上熟练工在做了几百遍之后会形成肌肉记忆,真正的难点不在命令本身,而在于“出了错能看明白报错在说什么”。我后来发现,很多新手栽跟头都有一个共性——报错信息只看最后一行,而真正的线索往往在前面几行或几十行。从现在开始,遇到报错不要慌,先把完整日志复制到记事本里,逐行读一遍再去搜索。环境问题十有八九是路径、版本、权限这三件事,定位到具体一类,解决起来就快了。
另外,这套环境配置好之后,可以顺手把项目推到Git仓库并复制一份备份。当某天你在新电脑上需要从头搭建开发环境时,把旧项目的package.json和vite.config.js参考一遍,五分钟就能恢复熟悉的开发状态。前端工程化虽然绕,但它绕得有价值。等你把环境配顺,真正进入写组件、调路由、改状态的阶段,你会觉得前面这些折腾都是值得的。