有些人可能觉得“运行一个 Vue 项目”不就是敲两行命令的事么,至于写一篇超详细图解吗?我还真见过不少人在这个最简单也最关键的环节上翻车——装完 Node 后直接卡在npm install,或者明明照着文档敲了npm run serve,浏览器就是白屏,控制台一堆红色报错。如果你是刚接触 Vue 的前端新人,或者以前只写过静态 HTML 页面、想试试前后端分离项目实战,那么这篇文章就是给你准备的。
我会从零开始,把 Vue 项目从“下载到本地”到“浏览器里跑起来”的完整链路拆开揉碎,每一步都配可操作的说明和排错经验。我尽量做到比你见过的任何教程都细,细到哪怕你连 Node.js 是什么都不太清楚,也能一步步把项目跑起来。
1. 整体设计与思路拆解
1.1 为什么“运行 Vue 项目”这件事值得单独写一篇
很多初学者的困惑源于分不清“项目文件”和“运行环境”这两个概念。Vue 项目不是一个双击就能打开的 HTML 文件,它是一套基于 Node.js 生态的工程化代码。在浏览器真正看到页面之前,需要经过依赖安装、构建编译、本地服务启动等多个环节。
我通常打一个比方:Vue 项目像一栋毛坯房,代码是钢筋水泥,而 Node.js 环境和依赖包就是施工队和建材。你不能只把图纸拿给客户看,得先让施工队进场、材料到位,再把房子装修好交付。对应到技术上就是:
- Node.js 环境——施工队
- npm(或 yarn/pnpm)——建材采购员
- 项目依赖(node_modules)——到位后的建材
- 开发服务器(dev server)——施工现场的临时水电
- 浏览器 http://localhost:端口 —交付给客户看的成品
1.2 运行 Vue 项目最常见的技术栈与方案选型
不同时期创建的 Vue 项目,运行方式略有差异。我们需要先判断手上的项目属于哪种情况:
| 项目类型 | 创建命令 | 运行命令 | 技术特征 |
|---|---|---|---|
| Vue CLI 项目 | vue create | npm run serve | 基于 webpack,配置复杂,老项目多 |
| Vite 项目 | npm create vite@latest | npm run dev | 基于 esbuild,启动极快,新项目主流 |
| 纯 HTML + CDN | 无 | 浏览器直接打开 | 不适用于工程化项目 |
| 后端托管的 SPA | 后端框架集成 | 需后端配合启动 | 如 Spring Boot + Vue |
这篇文章我会以 Vue CLI 和 Vite 两种主流方式为例来讲解,因为目前社区里的开源项目、企业级前后端分离项目实战案例,绝大多数都以这两种方式运行。
1.3 提前判断你的项目属于哪种类型
在动手之前,先打开项目根目录,看看里面有什么文件。这是一个非常关键的判断步骤,决定你后面敲什么命令:
- 如果根目录有
vue.config.js文件,多半是 Vue CLI 创建的 webpack 项目,启动命令为npm run serve。 - 如果根目录有
vite.config.js文件,则是 Vite 项目,启动命令为npm run dev。 - 两个都没有,注意看
package.json里的scripts部分,那里写明了这个项目定义的所有启动命令。
我第一次从 GitHub 上克隆别人的开源项目时也吃过亏,没看package.json里的 scripts 就直接用npm run serve,结果人家用的是 Vite,报错 “Missing script: serve”。所以判断项目类型,是运行 Vue 项目的第一步,千万别跳过。
2. 运行 Vue 项目前置准备:环境搭建与工具选型
2.1 Node.js 到底应该装哪个版本
这是整个流程中最容易埋坑的一步。Node.js 版本不是随便装的,装错了后面会有一堆莫名其妙的报错。常见的报错包括node-sass安装失败、Error: The engine "node" is incompatible with this module、digital envelope routines::unsupported等等。
我的建议是:老项目(Vue CLI 创建的、依赖 node-sass 的)优先装 Node.js 16.x 或 14.x,新项目(Vite + Vue3)装 Node.js 18.x 或 20.x 长期支持版。
为什么不建议直接装最新版?因为很多老依赖包没有跟上 Node 的大版本更新,比如node-sass这类原生模块在 Node 20 上可能直接编译失败。如果你同时维护多个项目,强烈建议安装 nvm-windows(Windows)或 nvm(Mac/Linux)来做 Node 版本切换。
注意:这里千万别图省事直接装最新版 Node,也别用系统自带的旧版本。版本选型直接决定了你后续步骤是否顺利。如果你要同时做 vue 入门和参与多个嵌入式开源项目、前后端分离项目实战,nvm 切换版本几乎是必备技能。
2.2 npm 镜像与依赖安装加速
在中国大陆网络环境下,直接使用 npm 官方源安装依赖往往慢到怀疑人生,甚至直接卡死。解决方案是切换到镜像源。
查看当前源:
npm config get registry切换到镜像源:
npm config set registry https://registry.npmmirror.com这个源是淘宝 npm 镜像的延续,国内开发者用得最多。切换之后,npm install的速度会有质的提升。
2.3 编辑器与终端工具
编辑器我建议选择 VS Code,这是目前 Vue 生态支持最好的编辑器。装好之后需要装两个关键插件:
- Volar(Vue 官方推荐,替代旧版 Vetur)
- ESLint(统一代码规范,运行报错时很多问题它能直接标红提示)
终端工具 Windows 下我建议用 PowerShell 或 VS Code 自带的终端。不过这里有个高频坑:Windows 的 PowerShell 默认禁止执行脚本,运行 npm 命令时会报错无法加载文件 ....ps1,因为在此系统上禁止运行脚本。
解决办法是,以管理员身份打开 PowerShell,执行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned输入Y确认即可。这是 Windows 用户运行 Vue 项目前必须做的一个操作,不然 npm 相关命令全线阵亡。
2.4 安装 Vue CLI 脚手架工具(可选)
如果你要自己从零创建一个 Vue CLI 项目,需要全局安装脚手架:
npm install -g @vue/cli安装完成后检查版本:
vue --version如果提示vue 不是内部或外部命令,多半是全局安装目录没有配置到系统环境变量 PATH 中。这不是 Vue 的问题,是 Node 全局包的安装路径问题,需要找到 npm 的全局安装目录并加到 PATH。
注意:如果你用的是 Vite 创建项目,就不需要安装 Vue CLI,直接用
npm create vite@latest即可。后面我会详细讲这两种创建方式的区别。
3. 创建 Vue 项目的完整流程
3.1 方式一:使用 Vue CLI 创建项目(适合老项目与技术栈兼容)
在选定的工作目录下打开终端:
vue create my-vue-app执行后会出现交互式选项:
Default ([Vue 3] babel, eslint)——默认套餐,直接回车Manually select features——手动选择功能,适合需要 Router、Vuex/Pinia 的项目
如果你不确定,我建议选默认。创建完成后:
cd my-vue-app npm run serve启动成功后,终端会显示类似下面的信息,这就是“跳转成功”的标志:
App running at: - Local: http://localhost:8080/在浏览器打开这个地址就能看到 Vue 的默认欢迎页。
3.2 方式二:使用 Vite 创建项目(更快的现代选择)
Vite 是目前新建 Vue 项目的首选。在命令行中执行:
npm create vite@latest my-vue-app -- --template vue注意 Windows 的 PowerShell 里,--后面的参数解析可能与 bash 不同。如果语法报错,直接按提示选择模板即可。
创建完成后进入项目:
cd my-vue-app npm install npm run devVite 的默认端口是 5173,启动后终端会显示:
VITE v5.x.x ready in xxx ms ➜ Local: http://localhost:5173/这个速度会比 webpack 快非常多,通常几百毫秒就能启动完成。
3.3 从 Gitee/GitHub 克隆现成项目怎么运行
很多人不是自己创建项目,而是从 Gitee 或 GitHub 上克隆一个开源项目来学习。这时候流程稍有不同:
git clone https://github.com/xxx/xxx.git cd xxx npm install npm run serve # 或者 npm run dev关键在于克隆下来后,先看package.json的 scripts 字段,确认哪个命令是启动开发服务器。有的项目还可能要配置环境变量文件.env,这个文件默认不提交到仓库,你需要根据.env.example自己复制一份并填写配置。
4. 核心实操细节:node_modules、package.json 与启动原理
4.1 node_modules 到底为什么又大又容易出问题
运行npm install后,项目目录下会出现一个巨大的node_modules文件夹,里面密密麻麻全是依赖包。这个文件夹就是 Vue 项目运行的核心,它的作用是存放当前项目所有第三方库。
有个细节值得注意:这个文件夹一定不要手动删除某个包,因为依赖之间是有层层嵌套关系的,你删掉一个,可能连带干掉其他包依赖的子依赖。如果确实出了依赖问题,建议的做法是:
rm -rf node_modules npm cache clean --force npm install或者在 Windows 下用:
rimraf node_modules npm install这一套“删除重装”的操作能解决至少七成以上的依赖问题。
4.2 package.json 是你最需要读懂的文件
很多初学者完全忽略package.json,它却是整个项目运行的核心说明书。我们来看一个典型的 scripts 配置:
{ "name": "my-vue-app", "version": "0.1.0", "private": true, "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" }, "dependencies": { "vue": "^3.4.0", "vue-router": "^4.0.0" } }解释几个关键字段:
scripts——定义了通过npm run xxx可以执行的命令。dependencies——生产环境需要依赖的包。devDependencies——开发环境才需要用的包,比如编译工具。
在你使用npm install的时候,npm 会读取dependencies和devDependencies中声明的所有包,把它们安装到node_modules中。所以如果你发现启动项目时提示xxx module not found,大概率是这个包没有装进node_modules。
4.3 开发服务器与热更新机制
npm run serve或npm run dev启动的不是一个“已经打包完成的静态网站”,而是一个开发服务器。它做的事情是:
- 监听项目源代码文件的变化。
- 当你修改代码后,它实时把更新的模块推送到浏览器,触发页面刷新或局部更新。
- 它就是开发中最依赖的 HMR(Hot Module Replacement,热模块替换)。
我经常跟新人强调:只要开发服务器没有报错,就保持它一直运行。改代码保存,浏览器立即更新,不要去手动刷新页面。
4.4 端口被占用怎么办
开发服务器默认端口是 8080(Vue CLI)或 5173(Vite)。如果端口被其他程序占用,会有两种处理方式:
Vite 项目会在终端问你是否换一个端口(比如 5174),按 Y 即可。Vue CLI 项目则需要手动指定:
- 在项目根目录新建
vue.config.js:
module.exports = { devServer: { port: 8090, host: 'localhost', open: true } }- 或者直接命令行指定:
npm run serve -- --port 8090遇到端口占用是运行 Vue 项目时的常见报错之一,建议先学会这个排查方法,后面做前后端分离项目实战时,前端端口和后端接口端口容易混在一起,理清端口关系非常重要。
5. 运行成功后的验证与项目结构图解
5.1 浏览器控制台没有任何报错不代表万事大吉
启动成功后,浏览器打开对应地址,看到页面后不要着急开心,先按 F12 打开开发者工具,切换到 Console 面板确认没有红色报错信息。
常见的隐蔽问题包括:
- 组件引入路径错误导致的警告。
- 接口跨域请求失败(报错
CORS或net::ERR_FAILED)。 - 路由模式设置错误导致的刷新 404。
这些坑不在启动阶段暴露,而是等你在页面上操作时才出现。所以“运行成功”只是第一步,还要看控制台是否干净。
5.2 一个 Vue CLI 项目的目录结构图解
下面是一个典型的 Vue 项目目录结构,我按“运行项目必须知道的重点”来标注:
my-vue-app ├── node_modules # 依赖包(不要手动改) ├── public │ ├── favicon.ico # 浏览器标签页图标 │ └── index.html # 唯一入口 HTML 模板 ├── src │ ├── assets # 静态资源(图片、样式等) │ ├── components # 组件目录 │ ├── App.vue # 根组件 │ ├── main.js # 入口 JS 文件,负责创建应用实例 │ └── router # 路由文件(如果在创建时选择了 Router) ├── .gitignore # git 忽略文件配置 ├── babel.config.js # babel 编译配置 ├── package.json # 项目说明与依赖清单 └── vue.config.js # Vue CLI 自定义配置(端口、代理等)这个结构中没有dist文件夹,因为它不是初始就有的,只有当你执行npm run build时才会生成,是打包后的产物。
5.3 main.js 与 index.html 的关系
运行流程的关键入口是src/main.js。很多人不理解为什么打开的是public/index.html,但页面上显示的却是App.vue的内容。这是因为main.js中做了这样一件事:
import { createApp } from 'vue' import App from './App.vue' createApp(App).mount('#app')这句代码的意思是:创建一个 Vue 应用实例,并把根组件App挂载到index.html中 id 为app的元素上。所以:
index.html是“壳”。App.vue是“内核”。
页面最终渲染的内容,是由挂载到#app上的组件树决定的。理解了这一点,你就知道为什么改App.vue页面会变,而改index.html只影响外壳。
5.4 关于 Vue 2 与 Vue 3 项目运行的差异
如果你运行的是老项目,main.js可能是这样的:
import Vue from 'vue' import App from './App.vue' Vue.config.productionTip = false new Vue({ render: h => h(App) }).$mount('#app')Vue 2 和 Vue 3 的创建方式完全不同。如果你发现项目里用的是new Vue({...})这种写法,说明这是 Vue 2 项目,建议安装 Node 14 或 16,不要用太新的 Node 版本,避免出现兼容性问题。
6. 常见问题与排查技巧实录
整个运行过程里,我踩过的坑和帮别人排查过的问题数不胜数,这里整理成一份速查表。这些都是真实项目里高频出现的,建议收藏后按图索骥对照排查。
6.1 项目运行报错速查表
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
'vue' 不是内部或外部命令 | Vue CLI 未安装或未配置 PATH | 重装 Vue CLI 或配置全局变量 |
无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本 | PowerShell 执行策略限制 | 以管理员运行Set-ExecutionPolicy RemoteSigned |
Error: Cannot find module 'node-sass' | 依赖缺失或 Node 版本过新 | 安装node-sass或切换到 Node 16 |
digital envelope routines::unsupported | Node 17+ 与旧版 webpack 冲突 | 使用 Node 16,或设置NODE_OPTIONS=--openssl-legacy-provider |
Module not found: Error: Can't resolve 'xxx' | 依赖包不存在或路径写错 | 执行npm install,检查 import 路径 |
error:0308010C:digital envelope routines::unsupported | 同上,OpenSSL版本问题 | 换 Node 版本或用 Vite 重跑 |
Failed to compile | 代码语法错误或 lint 错误 | 看具体报错位置,修掉对应行的代码 |
Port 8080 is already in use | 端口被占用 | 换端口或关闭占用进程 |
Network: unavailable | 无法访问外网下载依赖 | 配置镜像源 npm config set registry |
EACCES: permission denied | 权限不足 | 加sudo或以管理员运行终端 |
Syntax Error: TypeError: Cannot read properties of undefined | 接口数据格式与预期不符 | 打 console.log 确认返回的数据结构 |
6.2 依赖安装卡住的终极处理思路
如果你执行npm install卡了十几分钟都没动静,先不要 Ctrl+C 重来。大概率是网络问题。处理方法:
npm install --registry=https://registry.npmmirror.com如果这个也不管用,可能是缓存损坏,清缓存后重试:
npm cache clean --force再做一次完整的依赖重装。如果项目特别老,里面有node-sass这种需要在安装时从 GitHub 下载二进制文件的包,还容易遇到“下载 node-sass 二进制文件失败”的问题。解决方式是为它单独指定镜像:
npm config set sass_binary_site https://npmmirror.com/mirrors/node-sass/这点在运行老 Vue 项目时极为重要。
6.3 启动成功但页面打不开或白屏
启动成功代表 dev server 在运行,但白屏通常是代码层面的问题。按顺序排查:
- 看终端有没有报错。如果有红色报错,先解决它。
- 按 F12 打开控制台,看有没有 JS 报错。
- 确认
src/main.js中挂载的#app是否在index.html中存在。 - 确认路由配置是否给了默认路径
/,如果没有配置指向首页的路由,页面会是空白。 - 如果页面上有内容但样式全乱,检查是否缺少样式文件,或者
public/index.html中 CSS 引入方式不对。
这里特别说一下路由白屏。Vue Router 配置了createWebHistory模式时,本地开发一般没问题,但如果刷新后白屏且报Cannot GET /xxx,那是 history 模式下刷新路径无法匹配的问题。开发阶段最简单的处理是把路由模式改成createWebHashHistory。
6.4 运行环境的“玄学”问题与正确心态
有时候你按网上教程一步步来,还是报错,然后你什么也没改,重启电脑之后居然就好了。这种“玄学”问题基本都与环境状态有关:端口被临时占用、某个进程缓存出错、npm 缓存损坏。
我的经验是遇到不明原因的问题,按这个顺序操作:
- 关掉终端,重新打开。
- 删除
node_modules并重装依赖。 - 切换 Node 版本(如果装了 nvm)。
- 重启电脑。
这个流程能解决九成以上的疑难杂症。这不是什么技术含量很高的事,但确实最有效。
6.5 运行别人的开源项目时先看文档
很多人喜欢直接git clone一个开源项目,然后不管三七二十一npm install。但很多成熟项目有额外的前置条件,比如需要注册第三方服务、需要写.env环境变量、需要启动后端接口服务。
我建议下载项目后,先看三样东西:
README.md——项目说明,通常包含运行步骤。.env.example——环境变量模板,复制成.env并填写。package.json的 scripts——确认启动命令。
7. 从“跑起来”到“真正会用”:再往前走一步
7.1 开发环境配置的核心:代理与跨域
前后端分离项目实战中,前端跑在 8080,后端跑在 8081,前端页面直接请求后端接口必然会遇到跨域问题。
Vue CLI 项目里的处理方式是在vue.config.js中配置 devServer 代理:
module.exports = { devServer: { port: 8080, proxy: { '/api': { target: 'http://localhost:8081', changeOrigin: true } } } }Vite 项目则是在vite.config.js中配置:
// vite.config.js export default { server: { proxy: { '/api': { target: 'http://localhost:8081', changeOrigin: true } } } }配置代理之后,前端代码里请求/api/user时,代理会把请求转发到后端http://localhost:8081/api/user,浏览器里就不存在跨域问题了。这个配置对跑前后端分离项目来说是绝对绕不开的核心环节。
7.2 生产环境构建与预览
当开发调试完成后,需要打包上线:
npm run build执行后生成dist目录。你可以先用本地静态服务器预览一下效果:
npx serve dist或者用 Vite 的 preview 命令:
npm run preview为什么要先预览?因为开发环境和生产环境存在差异。最常见的差异是打包后静态资源路径不对,页面白屏。Vue CLI 项目的解决办法是在vue.config.js里配置 publicPath:
module.exports = { publicPath: './' }Vite 项目则配置 base:
// vite.config.js export default { base: './' }如果不做这个配置,动态加载的资源路径会基于根目录去找,部署在子目录下就会全部 404。打包后布局异常或者白屏的新手高频问题,基本都是这个原因。
7.3 实用调试技巧与常用命令
运行 Vue 项目,除了npm run dev / serve / build,还有几个高频命令值得掌握:
# 查看依赖更新情况(不修改 package.json) npm outdated # 更新某个包到指定版本 npm install vue@latest # 查看已安装的包版本 npm list vue此外,在 Vue 3 项目中你可以用@vue/devtools浏览器扩展来调试组件状态,查组件树、看事件触发、检查 Pinia/Vuex 状态,都是可视化界面,对定位运行时问题非常有帮助。
写在最后
运行一个 Vue 项目这件事,说难不难,说简单也不简单。它考验的核心其实是“环境管理”能力:Node 版本选得对不对、依赖装没装全、端口冲不冲突、代理配没配好。把这些环境问题搞定,Vue 的代码本身反而不会给你制造太多运行障碍。
从我个人的经验来看,新手最容易栽跟头的不是语法不懂,而是被环境问题折腾到怀疑人生。所以如果你现在正因为某个报错抓狂,请对照上面的速查表慢慢排查,大概率能找到答案。还有一个小技巧:报错信息一定不要只看开头,要往下翻到第一个Error标注的位置,那才是问题的真正来源。
最后我再分享一个小技巧:每次新建 Vue 项目时我习惯先写一个最小的“验证代码”——在 App.vue 中只渲染一行文本,确认项目跑通之后再开始开发。这样一来,无论后面遇到什么报错,你都能确定问题出在你新加的代码里,而不是环境本身。希望这篇超详细图解能帮你少走弯路,顺利把项目跑起来。