ARTICLE DETAIL

资讯详情

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

Vue项目运行全链路:从Node.js环境到生产部署

Vue项目运行全链路:从Node.js环境到生产部署 很多人拿到一个 Vue 项目第一反应是双击 index.html结果发现页面一片空白控制台全是报错。原因很简单Vue 项目本质上是 Node.js 生态下的工程化项目必须通过 Node 环境里的构建工具去编译和启动而不是像传统网页那样直接打开。这篇文章我会从一个实际接手项目的角度把运行 Vue 项目的完整链路讲清楚从 Node.js 安装、依赖管理、开发服务器启动到高频报错排查、生产打包与部署。不管你是刚接触 Vue 的新手还是接手别人代码但从来没跑通过的老开发按着这篇文章的步骤走基本能少折腾两天。1. 准备工作运行Vue项目之前先把环境这块补齐很多新手在第一步就卡住了不是代码的问题而是电脑里的运行环境根本没搭好。Vue 项目依赖 Node.js这一点绕不过去。我见过不少朋友下载了项目代码后在终端里敲npm install却提示“npm 不是内部或外部命令”这就是典型的 Node.js 没装或者没配置好环境变量。1.1 Node.js 版本选择这一步定生死Node.js 是 JavaScript 在服务端的运行环境Vue 项目里的 npm、webpack、vite 全都跑在它上面。说白了它就像一个“翻译官”把项目里那些浏览器不认识的高级语法转换成它能执行的东西同时负责管理各种第三方包。Node.js 版本的选择很讲究。装太新的版本比如目前一些非 LTS 的激进版本可能和旧项目的依赖不兼容启动时一堆语法报错装太老的版本又可能不支持新版 Vite 或者 Vue3 的某些特性。我的建议是直接去 Node.js 官网下载 LTS 版本也就是长期维护版稳定是第一位的。安装过程没什么难点一路 Next 就行。但有一步要注意安装路径尽量用默认的C:\Program Files\nodejs\这样会自动帮你配置好系统环境变量。如果你非要改路径那安装完之后要手动把 Node 目录加到系统的 PATH 里否则以后在 cmd 或者 PowerShell 里敲node -v永远提示找不到。装完验证是否成功打开终端依次输入node -v npm -v如果能看到类似v18.20.4和10.7.0这样的版本号说明环境已经 OK 了。这里顺便提一句npm 是随 Node.js 一起安装的包管理器它负责下载和管理项目里的各种依赖包。1.2 包管理器的选择npm、yarn、pnpm 怎么挑npm 是 Node 自带的包管理器大多数项目默认用 npm。但在实际团队协作里你还会遇到 yarn 和 pnpm它们本质上都是用来安装依赖的只是安装策略和速度不一样。我个人的建议是先看项目里有没有锁文件。根目录如果有package-lock.json那你就用 npm如果有yarn.lock就用项目指定的 yarn 版本如果有pnpm-lock.yaml那就要用 pnpm。锁文件存在的意义是锁定依赖版本保证大家在同一个版本集合下开发避免出现“你那边跑得好好的我这边一堆报错”的情况。如果你非要跨包管理器安装比如用 npm 去装一个带 yarn.lock 的项目大概率也能装上但依赖版本可能对不上锁文件运行阶段会出现一些很诡异的问题。所以遇到项目之前先花 30 秒看它用的是哪个锁文件再去决定用哪个工具。1.3 编辑器与终端VSCode 的基础配置编辑器方面Vue 项目首选 Visual Studio Code免费、插件生态好。必要插件我推荐这几个缺了它们你写代码不会报错但调试效率会低很多Vue Language Features (Volar)开发 Vue3 项目的必备插件提供单文件组件的高亮、智能提示和类型检查。如果你还在用 Vetur建议在 Vue3 项目里停用它。ESLint检查代码规范报错会在编辑器里直接标红很多运行时的问题在编辑器里就能提前发现。Prettier统一代码格式团队协作时能少很多无意义的格式冲突。终端的话Windows 系统我建议用项目自带的终端在 VSCode 里直接按 Ctrl 唤出。如果遇到 PowerShell 执行策略限制的问题后面会在报错章节专门讲这里先不展开。2. 获取项目与安装依赖让人又爱又恨的 node_modules环境准备就绪接下来就是拿到项目代码然后执行项目运行流程中最关键也是耗时最长的一步安装依赖。2.1 从 Git 仓库拉代码还是直接拿到压缩包拿到项目的方式一般有两种一是从 Git 仓库克隆二是直接接收别人打好的压缩包。如果是克隆用这个命令拉取远程代码git clone 仓库地址克隆完进入项目目录cd your-project如果是压缩包解压后同样要进入项目根目录确认里面能看到package.json文件。package.json就是项目的“身份证”里面有项目的名称、版本号、依赖列表和所有可执行的脚本命令。找不到这个文件说明你进错目录了后续所有命令都会失效。2.2 package.json 和 package-lock.json先看懂再动手进入项目目录后别急着自动化先打开package.json看一眼。重点关注两块内容第一块是dependencies和devDependencies这两个字段分别记录生产环境依赖和开发环境依赖。在运行一个项目时我们会先关注dependencies比如 vue、vue-router、axios和devDependencies比如 vite、webpack、eslint 等构建工具。第二块是scripts字段这是项目的“控制台指令集”比如scripts: { dev: vite, build: vite build, serve: vue-cli-service serve, start: npm run dev }这些脚本名是开发者自定义的npm run dev实际上就是执行vite命令npm run serve执行的是vue-cli-service serve。不同项目的命令可能不一样通常看 README 或者 scripts 字段里的说明即可。旧项目Vue CLI 构建用npm run serve新项目Vite 构建用npm run dev也有的项目两者都配了。2.3 npm install 的完整执行过程与镜像配置理解了项目结构接下来就是最核心的一步安装依赖npm install有的项目里会简写成npm i效果一样。这条命令会把package.json里列出的所有依赖包下载到项目根目录下的node_modules文件夹里并且把具体安装的版本写入锁文件。这里有个最常见的坑国内直接访问 npm 官方源下载会很慢甚至直接超时。解决办法是切换成国内镜像源最常用的是淘宝镜像npm config set registry https://registry.npmmirror.com设置之后可以用npm config get registry确认是否生效。之前我遇到过一个朋友项目依赖 500 多个包默认源装了一个小时还在转圈切换镜像后 3 分钟就完成了。另外如果项目里提示需要 pnpm 或者 yarn安装方式也不复杂npm install -g yarn npm install -g pnpm然后对应使用yarn install或者pnpm install。注意yarn 的源也需要切换可以执行yarn config set registry https://registry.npmmirror.com。2.4 依赖装不上的常见原因与应急手段npm install报错是新手最容易崩溃的环节这里先说几种高频情况第一种是EACCES permission denied在 Linux/Mac 上比较常见说明没有权限写node_modules用sudo npm install应急可以但长期不推荐。更干净的方式是修复 npm 的全局目录权限。第二种是cb() never called!这个通常意味着依赖包之间版本冲突或者下载的缓存包损坏。先试这个万能修复组合rm -rf node_modules package-lock.json npm cache clean --force npm install删掉node_modules和锁文件再重新安装能解决大部分诡异问题。注意删除锁文件会让依赖版本重新解析除非万不得已否则不推荐删。第三种是在 Mac M 系列芯片上安装某些原生模块报错比如node-sass编译失败。这种一般是因为原生模块还没有为 ARM 架构编译建议优先换成兼容版本或者用sass替代。3. 启动开发服务器npm run serve 到底是做什么依赖装完终于到了启动项目的环节。这一节我会从命令本身的逻辑讲起再结合配置文件实操解释开发服务器的工作原理帮你真正理解背后发生了什么。3.1 scripts 字段一条命令背后的执行链路假设项目是用 Vue CLI 创建的执行npm run serve这个命令会先去查看package.json里scripts字段中的serve对应的值通常是vue-cli-service serve然后把这个命令丢给 Node.js 环境去执行。vue-cli-service serve内部会启动一个 webpack-dev-server它做的事情概括起来就是监听你的源文件变化实时编译然后通过 HTTP 协议把页面和静态资源发送给浏览器。你改了代码它立刻重新编译刷新页面你就能看到最新效果这就是前端工程化的核心价值之一。如果是 Vite 创建的新项目启动命令通常是npm run dev对应脚本是vite。Vite 启动速度比 Webpack 快很多因为它按需编译而不是把整个项目全部打包一遍。3.2 自定义端口、host 与代理vue.config.js/vite.config.js默认情况下Vue CLI 项目启动在http://localhost:8080Vite 项目启动在http://localhost:5173。如果端口被占用一般 CLI 会自动1比如 8080 被占用了就会跳到 8081。如果对默认端口不满意或者在固定场景下需要使用特定端口可以在配置文件里修改。Vue CLI 项目在根目录找到vue.config.jsmodule.exports { devServer: { port: 9090, host: 0.0.0.0, open: true } }port指定端口号host设置为0.0.0.0时允许局域网内其他设备通过你的 IP 访问项目方便手机联调open启动后自动打开浏览器Vite 项目在vite.config.js里配置export default defineConfig({ server: { port: 5173, host: true, open: true } })这里有一个很实用的经验如果要和手机在同一个局域网联调确保 host 设置正确然后访问你的电脑 IP 加端口比如http://192.168.1.5:5173前提是防火墙放行。这个设置在我实际工作中经常用尤其是调试响应式布局和移动端兼容性问题时。3.3 浏览器访问与 Vue DevTools 调试技巧启动成功后终端会显示类似这样的输出Compiled successfully! App running at: - Local: http://localhost:8080/ - Network: http://192.168.1.5:8080/浏览器打开地址看到页面渲染出来就说明项目已经运行成功了。调试阶段我强烈建议安装 Vue DevTools 浏览器插件Vue3 项目装新版Vue2 项目装对应旧版。这个插件能直观看到组件树、props 数据、状态管理里的数据和路由跳转记录排查数据不更新的问题时比console.log高效太多。还有一个访问路径的问题如果你启动后发现页面是空白F12 打开控制台看到一堆静态资源 404先不要慌大概率是publicPath配置问题。解决方法是找到项目配置文件里的publicPathCLI 项目或baseVite 项目试试改成./变成相对路径再做生产构建部署时的配置参考。4. 启动报错与排查手册这些问题我基本都踩过运行 Vue 项目几乎没人能一次成功这一章我整理的问题是实际遇到频率最高的几种每条都有对应的解决方案。4.1 PowerShell 禁止运行脚本怎么办Windows 用户经常在 VSCode 终端里看到这句话因为在此系统上禁止运行脚本。有关详细信息请参阅 https:/go.microsoft.com/fwlink/?LinkID135170这是 PowerShell 的执行策略限制了脚本运行npm命令本身没问题但 npm 的包在执行时会被当作脚本拦截。解决办法有两种第一种当前终端临时放开权限推荐日常用不改系统配置Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass执行完后当前终端窗口的 PowerShell 就不会再拦截任何脚本了。第二种以管理员身份打开 PowerShell永久修改策略Set-ExecutionPolicy RemoteSigned推荐直接选第二种改一次就好了。更改之前系统会给出提示输 Y 确认就行。4.2 端口被占用EADDRINUSE 的快速处理启动时终端报Error: listen EADDRINUSE: address already in use :::8080说明 8080 端口被别的程序占用了。可能你之前启动过项目没关掉也可能是其他服务占了这个端口。最简单的处理方式换一个端口启动在vue.config.js或vite.config.js里把端口改成别的值。如果一定要用原端口就先找到占用进程再杀掉。Windows 下执行netstat -ano | findstr :8080找到PID那一列的数字然后执行taskkill /PID 1234 /F把 1234 替换成实际的 PID 即可。4.3 依赖安装失败cb() never called 与 node_modules 修复这个报错在依赖安装阶段特别常见原因基本逃不过三个网络不稳定导致下载中断、缓存损坏、依赖包版本冲突。我的处理顺序是这样的切到镜像源上一篇提过不再重复执行npm cache clean --force清理 npm 缓存删掉node_modules和锁文件再重新安装如果项目内部依赖版本之间的确冲突我通常会先看一下package.json里相关包的重大版本号是否一致比如一个包要求vue: ^2.6.0另一个要求vue: ^3.0.0这属于不可调和的冲突只能看包文档有没有兼容方案。还有一个冷门的坑Windows 的路径超长也会导致安装失败。如果项目路径很深比如C:\Users\xxx\Desktop\新建文件夹\新建文件夹\...\project依赖安装时会报文件路径太长此时把项目挪到磁盘根目录附近能解决。4.4 接口跨域前端 proxy 的正确姿势前后端分离项目联调时接口跨域是最恶心的一个问题。前端跑在localhost:8080后端接口在http://192.168.1.100:9090浏览器直接发起请求必被拦截因为跨域了。解决跨域的首选方案不是让后端去配 CORS而是通过前端开发服务器的代理转发。在 Vue CLI 项目的vue.config.js里加devServer: { proxy: { /api: { target: http://192.168.1.100:9090, changeOrigin: true } } }Vite 项目在vite.config.js里加server: { proxy: { /api: { target: http://192.168.1.100:9090, changeOrigin: true } } }配置的意思是所有以/api开头的请求开发服务器会帮你转发到http://192.168.1.100:9090并且把请求来源伪装成目标服务器从而绕过浏览器的同源策略限制。配置完成后一定要重启项目修改配置文件不会热更新。这里提一个和流媒体相关的场景如果项目里要播放 m3u8 格式的视频流很多监控视频、HLS 直播流都是这个格式后端返回的地址如果是 http 或者其他跨域资源同样可以在 proxy 里配置把请求代理到流媒体服务地址。这个场景在 Vue 项目里做现场演示或者线上直播业务时会经常遇到。4.5 版本不兼容Vue2 项目跑在 Vue3 工具链上现在 Vue3 已经非常普及但企业里还有大量 Vue2 的老项目在维护。如果你拿到一个 Vue2 项目用了 Vue3 的 DevTools 或者新版 Vite 去跑大概率会报各种诡异错误比如组件 API 不识别、Composition API 报错。判断项目是 Vue2 还是 Vue3最简单的方法看根目录package.json里vue的版本号。装依赖时也建议直接使用项目锁文件指定的版本不要随便升级大版本。Vue2 项目的维护重心是稳定性不是新功能。5. 生产构建与部署从 npm run build 到 Nginx运行项目不只是开发环境跑通就万事大吉最终还要打包上线这一章讲生产构建的关键点和部署时最容易踩的坑。5.1 打包命令与打包产物说明开发环境跑的是实时编译生产环境则需要执行一次完整打包npm run buildVite 项目对应脚本是vite buildVue CLI 项目是vue-cli-service build。打包完成之后项目根目录会生成一个dist文件夹里面是压缩、混淆过的静态文件HTML、CSS、JS、图片字体等。这个dist文件夹就是你要部署到服务器上的东西把它的内容扔给 Nginx、Apache 或者其他静态资源服务器即可。这里强调一下不要把dist文件夹直接拖到浏览器打开很多资源路径是绝对路径直接 file:// 协议访问会 404。5.2 打包后路由404和布局异常的常见原因开发环境下一切正常一打包部署到 Nginx刷新页面就 404这是历史模式路由的经典问题。Vue Router 默认有两种模式hash 模式和 history 模式。hash 模式 URL 里带#比如http://example.com/#/home部署时基本不会出问题。history 模式 URL 很干净比如http://example.com/home但刷新时浏览器会向服务器请求/home这个路径服务器没有这个真实文件就会返回 404。解决办法是配置 Nginx。在 Nginx 的站点配置文件的location块里加上location / { try_files $uri $uri/ /index.html; }意思是请求的路径在服务器上找不到对应文件时就回退到index.html让 Vue Router 自己去处理路由。至于打包后布局异常常见原因有两个一是资源路径问题。默认打包出来的资源路径可能用的绝对路径/assets/xxx.css部署在服务器根目录没问题但如果部署在子目录http://example.com/myapp/下资源全都会加载失败页面布局自然就崩了。解决办法是在配置文件里把 publicPathVite 项目是 base改成./或者对应的子路径。二是浏览器缓存。改完代码重新打包但用户浏览器缓存了旧的 CSS 和 JS 文件也容易看到布局异常。在 Nginx 里对静态资源做指纹缓存文件名带 hash 的静态资源缓存一年入口 HTML 不缓存是经验之谈的做法。5.3 部署到服务器子目录的 publicPath 配置如果你要把项目部署到http://example.com/myapp/这样的子路径下仅靠 Nginx 配置还不够前端打包配置也要改。Vite 项目在vite.config.js里export default defineConfig({ base: /myapp/ })Vue CLI 项目在vue.config.js里module.exports { publicPath: /myapp/ }注意base和publicPath的开头结尾都要带斜杠。改完重新打包部署路由也要记得用createWebHistory(/myapp/)来指定基础路径否则路由跳转会跑到根路径下面去。Nginx 部署多个 Vue 项目到同一个服务器的不同子路径是中小企业很常见的做法。每个项目配一个location /project1/和一个location /project2/互不干扰内存占用也比用 Docker 容器分别部署要轻量一些。如果涉及多个 Vue 项目部署到同一 Nginx建议把每个项目的资源配置、接口代理都配置在各自的 location 快里避免写成一个全局 location 导致项目串路由。我个人在实际操作中最深的体会是运行 Vue 项目的核心不是背命令而是理解项目的工程化结构。每次遇到报错先看是不是环境问题再看是不是依赖版本问题最后才是代码逻辑问题。按这个顺序排查大多数问题都能在十分钟内定位。尤其是node_modules反复安装不上、端口被占用、PowerShell 脚本策略限制这老三样解决过一次之后再遇到就是顺手的事。希望这篇文章能帮你少走一些弯路。
返回列表