资讯动态

用宝塔面板部署Vue项目dist文件:从打包到Nginx配置全流程

发布时间:2026/10/9 3:52:44 来源:尧图企业网站定制
做前端开发的同学应该都遇到过这个场景代码在本地跑得飞起npm run build一敲dist 目录安安稳稳躺在那里可真要把它挂到服务器上给测试看、给领导演示反而容易卡壳。尤其是不太熟悉 Linux 命令和 Nginx 配置的小伙伴光是弄明白“文件放哪、根目录指哪、为什么刷新就 404”这几个问题就够折腾一下午的。后来我尝试用宝塔面板来干这件事才发现部署 Vue 项目其实就是“把静态文件托管出去”这么简单。宝塔面板把服务器环境、网站配置、文件管理都变成了可视化操作不需要你手写一堆 Nginx 配置也不用在服务器上敲命令敲到头秃。这篇内容我就把“用宝塔面板部署 Vue 项目打包后的 dist 文件”这件事从头到尾捋一遍包括为什么要这么做、打包时要注意什么、上传部署的完整步骤以及我实际踩过的坑和排查思路。无论你是刚接触部署的前端新人还是想理清前后端分离部署流程的开发者这篇内容应该都能给你参考。1. 部署前的核心思路与方案拆解1.1 为什么选宝塔面板来处理前端部署先说结论宝塔面板本质是一套服务器管理工具把 Linux 服务器上常见的操作安装软件、创建网站、管理数据库、调整 Nginx 配置做成了网页界面。部署 Vue 项目这种场景用宝塔的优势非常明显环境安装是“点一下”的事站点创建是“填表单”的事文件上传是“拖拽”的事。这就砍掉了很大一部分命令行门槛。做前端部署的常见方案其实不止一种。我见过有人直接把 dist 文件放在后端项目的 static 目录里让后端框架顺手托管也见过专门配一台 Nginx 服务器手动写server块还有用容器方案做镜像的。这三种方案放到不同场景都有道理但如果你手头只有一台云服务器又要快速把前端项目跑起来宝塔面板加 Nginx 静态托管绝对是最省心的组合。它帮我们把 Nginx 配置文件的格式、语法、目录规则都封装好了你在图形界面里填好域名、选择目录它就自动生成一套可用的配置之后需要微调时再改配置文件就行。1.2 前端部署的本质静态文件托管Vue 项目执行构建命令之后产出的是一个纯静态目录一堆 HTML、CSS、JavaScript 文件外加图片字体等资源。这不是一个需要编译的 PHP 后端项目也不是需要跑起来的 Node 服务它本质上就是一组浏览器可以直接读取的文件。所以部署 Vue 打包产物时并不需要专门跑起来一个应用服务只需要让 Nginx 这类 Web 服务器把 dist 目录“托管”出去。浏览器访问域名时Nginx 会根据规则去磁盘上找对应的文件找到 base 目录里的index.html就返回主页找到assets/xxx.js就返回对应的脚本。理解了这一点后面配置站点时你就能明白为什么根目录要指向 dist 内容所在的位置为什么不需要选 PHP 版本为什么 Nginx 配置里最关键的东西是那个try_files。1.3 两种常见部署场景的取舍把 dist 部署到宝塔实际上经常碰到两种不同诉求第一种是你只有一个前端项目没有后端接口或者接口在别的域名上你只需要把静态页面挂出去。这种最简单创建纯静态站点就行上传文件、绑定域名、访问完事。第二种是在原有服务器上已经跑着后端服务前端要跟后端用同一个域名或者前后端都在这台服务器上要挂到不同路径。这时候通常会借助 Nginx 反向代理把/的请求交给静态文件把/api的请求转发给后端进程。宝塔界面里有一个“反向代理”功能可以直接帮你配置这个我在后面会详细展开。我个人强烈建议不管用哪种场景都先让静态文件正常能访问再去处理代理、跨域、缓存这些进阶问题。不要一步到位全部配置完万一出了问题你根本分不清是文件问题还是代理问题。2. 本地打包细节如何产出可部署的 dist2.1 构建命令与产物结构这一步看似简单实际很多人栽在这里。Vue 项目如果是基于 Vue CLI 创建的命令通常是npm run build如果是 Vite 创建的项目同样是npm run build。执行完后项目根目录会生成dist文件夹。Vite 项目还会有build参数配置比如vite.config.js里配置的outDir默认也是dist。构建完成后你要确认 dist 目录里至少有index.html这是整个 SPA 的入口。剩下的资源文件通常在assets/目录下里面是根据内容算出的哈希文件名的 CSS、JS。偶尔会有favicon.ico、public目录里的静态资源等。你要部署的就是这个 dist 目录内部的所有内容。2.2 路径配置为什么不建议遇到白屏就乱改Vue 打包后加载资源的方式取决于你在构建时配置的baseVue CLI或base/baseUrlVite / Vue CLI 3 对应的是publicPath之后改为base。很多同学部署后直接白屏打开控制台发现 JS、CSS 都是 404十有八九就是这里的问题。如果项目部署在域名根路径比如https://example.com/那么构建时的配置用默认值/就行。但如果你的静态文件要部署在子路径比如https://example.com/web/那base必须配置为/web/否则构建出的资源路径全是/assets/xxx.js你的页面会在域名根路径去找资源自然找不到。绝大多数情况下我们都推荐部署在根路径省心省力。但如果后端同学非要你把前端挂到子路径那就需要动一下构建配置再打包。我自己经历过好几次“改完路径忘记重新构建上传的还是旧 dist”的情况特此提醒改完base后一定要执行一次干净的构建再打包上传。2.3 生产环境接口地址的处理另外一个和打包相关的问题是接口地址。你的 Vue 代码在开发环境里可能用的是http://localhost:8080/api这种地址通过 Vite 或 Webpack 的 proxy 做代理。但打包到生产环境后代码里不能再出现这种指向本机的接口地址。通常我们会在项目里加环境判断比如读取.env.production中的变量让构建产物走生产环境接口或者直接把接口路径写成相对路径/api交给 Nginx 去做转发。这个我建议在部署前就要想清楚否则页面出来之后接口全挂你会误以为是部署问题折腾半天才发现是代码里写死了地址。2.4 打包前检查清单我整理了一个自己的检查清单部署前过一遍能省很多事[ ] 确认要部署到根路径还是子路径检查base配置是否正确。[ ] 确认环境变量是否正确加载不同框架用VITE_前缀或VUE_APP_前缀。[ ] 确认接口地址按环境区分不要硬编码。[ ] 确认npm run build成功执行退出码为 0没有报错。[ ] 确认 dist 目录刚生成不是残留的旧包。[ ] 本地预览一下比如用serve工具或nginx起个静态服务验证 dist 内容可访问。3. 宝塔面板实操部署流程3.1 安装面板与前置准备如果你的服务器上还没有宝塔面板那第一步是去宝塔官网拿安装命令SSH 登录服务器后执行即可。安装完面板登录面板首页第一件事是去“软件商店”安装 Nginx。注意这里不需要安装 PHP因为纯静态站点用不到 PHP选 Nginx 就够了。然后你需要一个用于访问站点的域名。开发测试用的话某个二级域名也可以如果用 IP 直接访问也能跑但有些 cookie 和资源路径处理起来可能麻烦。建议操作前先在域名解析服务商那里把域名解析到服务器 IP。3.2 创建站点时怎么填根目录进入宝塔面板左侧菜单找到“网站”点击“添加站点”。在“域名”一栏填上你的域名比如web.example.com。“根目录”它会自动生成一个路径通常是/www/wwwroot/web.example.com这个目录就是你将来放 dist 内容的地方。创建完站点后它会自动生成一个 Nginx 配置文件。你会在网站列表看到这一条点击“设置”就能进入站点管理界面里面有很多功能包括“配置文件”、“伪静态”、“反向代理”、“SSL”等等。刚创建完你什么都不用改先进入“根目录”对应的文件夹。我习惯在“文件”菜单里找到/www/wwwroot/web.example.com然后把本地 dist 目录内的文件全部上传到这里注意不是上传 dist 文件夹本身。3.3 上传 dist 文件的三种途径宝塔面板里传文件有好几种方式我按个人推荐度排个序。最方便的是直接在浏览器里用“文件”上传。你可以压缩 dist 目录为 zip然后上传到站点根目录再右键解压解压后确保文件都直接躺在根目录下不要多出一层 dist 文件夹。这里有个讲究如果解压后出现/www/wwwroot/web.example.com/dist/index.html访问域名时网站会自动尝试找根目录下的 index.html结果是 404你需要把 dist 里的内容移动到根目录。第二种方式是使用宝塔自带的“网站 → 站点 → 设置 → 配置文件”里的文件说明它对这种场景支持很好但略不直接。第三种是用 SFTP 工具比如常见的 FTP 类软件FileZilla 等连上服务器的 SSH 信息直接把本地 dist 目录里的文件拖到远程站点目录。这种方式在部署大文件或需要频繁迭代时比较顺手因为可见性强还能对比本地和远程文件。我个人的建议是测试环境用面板上传 zip 再解压最省事上线部署或频繁更新时用代码托管平台的构建-发布流程或者 SFTP 都比逐个文件传靠谱。3.4 配置 Nginx核心就一条 try_files站点创建完、文件放进去之后你以为就结束了访问一下会发现问题首页能打开但刷新内页或者直接访问某个路由路径立马 404。这就是著名的 Vue history 路由模式问题。Vue Router 有 hash 模式和 history 模式。hash 模式 URL 里有#刷新时浏览器会带着#后的内容不产生真实请求所以不会有 404history 模式 URL 看起来干净但刷新/about时浏览器会向服务器请求/aboutNginx 找不到这个对应的文件就返回 404。解决办法是在 Nginx 配置里加try_files规则。宝塔面板操作路径是网站列表 → 你的站点 → “设置” → “配置文件”在location / {}块里加上一行location / { try_files $uri $uri/ /index.html; }这段配置的意思是用户请求某个路径时先去磁盘找对应的真实文件$uri找得到就返回找不到就尝试找目录$uri/再找不到就把请求重写到index.html让 Vue Router 自己根据 URL 去匹配路由组件。这是 SPA 部署的黄金配置没有它你的 history 路由就没法用。如果你用的是 hash 模式那这一步可以跳过但我还是建议你了解try_files的含义后面排查很多问题都能用上。3.5 访问验证配置改完记得在宝塔“网站 → 设置 → 配置文件”页面底部点一下保存然后去“服务”那里重载 Nginx 配置不同版本面板可能叫“重载配置”或“重启”。然后打开浏览器访问你的域名。打开开发者工具F12看 Network 面板确认首页返回 200静态资源加载正常没有红色 404。再点击页面里的路由跳转比如从首页点到关于页正常的话 URL 变化、页面渲染。然后手动刷新这个子路径如果页面还在恭喜你部署成功了。3.6 小概率的权限/目录问题有一个点很容易被忽视文件权限。宝塔默认创建站点的目录属主和属组通常是www这是给 Nginx 使用的。如果你上传的文件权限不对Nginx 读取时会返回 403。在宝塔文件管理里选中文件可以右键查看权限通常文件 644、目录 755 就是没问题的。如果遇到 403先检查一下权限。4. 常见问题与排查记录4.1 白屏问题JS/CSS 加载不出来白屏是最常见的。可能的原因第一个是base路径配置不对资源请求指向了错误目录第二个是上传目录层级不对页面找到了index.html但里面的资源地址是/assets/xxx.js而实际文件在/web/assets/xxx.js等于找不到资源。排查思路先在浏览器打开域名按 F12 看 Console 和 Network。如果看到Failed to load resource: the server responded with a status of 404再点一下具体是哪个请求 404是 JS 还是 CSS。如果是资源请求 404先看请求 URL 和实际文件路径是否一致如果不一致基本就是 base 路径问题要么调整构建配置重新打包要么把文件放到请求路径对应的位置。还有一种情况刷新页面直接 404 的基本就是try_files没配置好。4.2 接口跨域用 Nginx 反向代理解决如果你的 Vue 项目需要请求接口而接口域名和前端域名不一致浏览器会有跨域限制。这时候有两种思路让后端开启 CORS跨域资源共享或者在前端服务器上做反向代理把/api的请求转发到后端实际地址。宝塔面板的反向代理配置比较简单在站点“设置”里找到“反向代理”添加一条规则比如将路径/api代理到http://127.0.0.1:8080你的后端服务地址。Nginx 会自动生成对应的proxy_pass配置。注意一点如果你的后端接口内部还包含路径前提比如实际接口是http://127.0.0.1:8080/api/user/list你要确认代理后的 URL 拼接对不对。通常我会把proxy_pass http://127.0.0.1:8080;写到配置里不写末尾斜杠这样/api/user/list会完整透传过去避免丢失/api前缀产生 404。4.3 刷新 404 的排查这个问题前面已经提到这里再给一个完整排查流程打开需要刷新才 404 的页面看地址栏 URL。确认 Vue Router 用的是 history 模式还是 hash 模式。如果是 hash 模式URL 有#刷新通常不会 404。如果是 history 模式那问题 100% 出在 Nginx 的try_files。进入宝塔站点配置文件找到location /确认是否存在try_files $uri $uri/ /index.html;。保存后重载 Nginx再刷新页面试试。有一种例外你的站点是子路径部署比如访问/web/about那try_files回退地址应该写成/web/index.html而不是/index.html否则子路径页面刷新时会跳到根路径的入口文件。4.4 更新后页面还是旧的缓存问题部署新版本后发现页面还是旧的多半是浏览器缓存。浏览器对带哈希的静态资源比如app.3a9f2b.js会缓存这是正常的资源名变了它会自然请求新文件。问题往往出在入口文件index.html被缓存了页面还是引用旧版本的 JS。解决方法在 Nginx 配置里设置index.html不缓存或者设置较短缓存而带哈希的assets目录可以设置较长缓存。示例配置location /index.html { expires -1; add_header Cache-Control no-store; } location /assets/ { expires 30d; add_header Cache-Control public, immutable; }如果你没有这个需求也可以统一定为不缓存测试阶段省心。4.5 问题速查表下面是我实际用下来整理的一张速查表遇到问题直接对号入座。现象可能原因快速处理首页打开白屏base 路径不对 / 上传层级错误检查资源请求路径调整构建配置或文件位置刷新子路由 404未配置 try_filesNginx location 中加入 try_files 规则接口请求跨域前后端域名不同配置 Nginx 反向代理 / 后端开启 CORS更新后没变化浏览器缓存 index.html设置 index.html 不缓存加版本号参数访问目录返回 403文件权限不对检查目录权限是否为 755 或 644服务器 CPU 高可能存在历史遗留进程顺手看看站点访问日志确定是不是正常业务量4.6 一个容易忽略的诊断技巧排查 Nginx 相关问题时强烈建议你养成看错误日志的习惯。宝塔面板里网站“设置”有“网站日志”和“错误日志”。大多数时候404 和 500 的线索都写在错误日志里。例如open() /www/wwwroot/xxx/index.html failed (2: No such file or directory)就是明确的文件找不到Permission denied就是权限问题。日志非常贴脸比你瞎猜强得多。5. 进阶优化建议5.1 开启 Gzip 压缩Vue 打包出来的 JS、CSS 文件通常不小不压缩的话传输耗时影响首屏。Nginx 的 Gzip 模块可以在宝塔“软件商店”→“Nginx”→“设置”→“性能调整”里找到也可以直接在配置文件里加gzip on; gzip_min_length 1k; gzip_comp_level 5; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript image/svgxml;开启后访问响应头里能看到Content-Encoding: gzip文件体积减少 60% 以上效果很明显。5.2 配置 SSL 证书宝塔面板对 HTTPS 的支持非常友好。站点“设置”里面找到“SSL”可以申请免费证书使用面板自带的申请入口也可以传已有的证书文件。申请之后面板会自动配置 Nginx 的 443 监听。做完之后还需要在站点设置里开“强制 HTTPS”把 HTTP 请求 301 跳到 HTTPS。有证书后浏览器地址栏的小锁标就出来了用户访问更放心接口也不会因为混用 HTTPS 和 HTTP 产生混合内容警告。5.3 后续迭代的自动部署思路部署过一次后最烦人的事就是每次更新都要本地打包、上传、覆盖。如果项目在代码托管平台上可以体验一下“网页构建加发布”的思路代码 push 到某个分支后服务器上有一个脚本自动拉取代码、执行构建、把产物复制到站点目录。对于中小项目来说这需要前置的代码仓库和 git 环境配置如果不具备这个条件也可以退而求其次在宝塔的“计划任务”里把 git pull 和 build 脚本串起来。不过我的个人建议是先别一上来就搞自动化。第一二次用宝塔 手动上传把流程理顺弄清楚目录、配置、日志位置再上自动部署。自动化只是把“手动做”变成“脚本做”前提是你已经知道了每一步的细节否则脚本出错了更无从下手。5.4 文件目录结构的小习惯上传文件时我习惯在站点根目录下留一个带日期或版本的目录比如/releases/20250115然后把当前版本软链或复制到/current宝塔站点根目录指到/current。这样回滚版本时只要重新指一下站点根目录或者做一下目录替换就行特别适合线上频繁迭代的项目。虽然小项目不一定需要但它给我养成了部署的规范感值得推荐。还有个小技巧如果只是更新一个模块不要整个 dist 重新上传覆盖先看构建产物变化了哪些文件能省不少时间。不过模块化改造没有统一标准手动按文件替换时要注意入口文件名称可能会变直接覆盖旧文件有时候不彻底还是重新整包解压更保险。6. 最后再分享一个实际体会部署这件事一开始看起来像是“非核心技能”但实际做多了就会发现它对项目交付质量影响极大。我见过太多前端开发把 dist 打出来跟后端同学说“你来搞一下”结果后端同学也不知道该怎么配浪费了大半天时间。其实你用宝塔面板跑一遍整个流程十分钟都用不到之后每次更新都是固定套路心里非常有底。还有一点体会宝塔面板虽然好用但它的本质只是封装了 Linux 和 Nginx 的操作不要因为有了面板就完全依赖于它。你至少要能看懂站点配置文件里root、index、try_files、proxy_pass这些指令的含义。一旦哪天遇到特殊需求比如要在配置前面加一段重写规则或者要调整访问权限你能直接在配置文件里动手就不会被界面操作限制住。这也是我建议所有前端开发都自己亲手部署至少一次的原因你会突然明白构建产物到服务器之间到底发生了什么Node 开发时的一些迷思也会就此解开。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑