前端部署:从开发到生产的最后一公里

前端部署:从开发到生产的最后一公里

毒舌时刻

前端部署?这不是运维的事吗?

"我只负责写代码,部署交给运维"——结果部署失败,互相甩锅,
"我直接把文件上传到服务器"——结果更新不及时,缓存问题频发,
"我用FTP上传,多简单"——结果文件传丢,网站崩溃。

醒醒吧,前端部署是前端开发的重要环节,不是别人的事!

为什么你需要这个?

  • 快速上线:自动化部署,减少人工操作
  • 环境一致性:确保开发、测试、生产环境一致
  • 回滚能力:出现问题时可以快速回滚
  • 监控和日志:实时监控网站状态和错误

反面教材

# 反面教材:手动部署 # 1. 本地构建 npm run build # 2. 手动上传文件 ftp ftp://example.com > put -r dist/* # 3. 手动清除缓存 ssh [email protected] > rm -rf /var/www/html/* > cp -r dist/* /var/www/html/ > systemctl restart nginx # 4. 手动检查 curl https://example.com 

正确的做法

# 正确的做法:使用CI/CD # .github/workflows/deploy.yml name: Deploy to Production on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Build run: npm run build - name: Test run: npm test - name: Deploy to Vercel uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-args: '--prod' vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} 
# 正确的做法:使用Docker # Dockerfile FROM node:18-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] 
# 正确的做法:Nginx配置 # nginx.conf server { listen 80; server_name example.com; root /usr/share/nginx/html; index index.html; # 处理单页应用路由 location / { try_files $uri $uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 30d; add_header Cache-Control "public, max-age=2592000"; } # Gzip压缩 gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; } 
// 正确的做法:使用CDN // vite.config.js import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [react()], build: { outDir: 'dist', assetsDir: 'assets', // 生成带哈希的文件名,便于缓存 rollupOptions: { output: { entryFileNames: 'assets/[name].[hash].js', chunkFileNames: 'assets/[name].[hash].js', assetFileNames: 'assets/[name].[hash].[ext]' } } }, // 配置CDN base: 'https://cdn.example.com/' }); 

毒舌点评

看看,这才叫前端部署!不是简单地手动上传文件,而是使用CI/CD、Docker、CDN等现代化工具。

记住,前端部署不是一次性的任务,而是一个持续的过程。你需要考虑构建优化、缓存策略、回滚机制等多个方面。

所以,别再觉得部署是运维的事了,它是你作为前端开发者的责任!

总结

  • CI/CD:使用GitHub Actions、GitLab CI等自动化部署
  • Docker:使用容器化技术,确保环境一致性
  • CDN:使用内容分发网络,提高访问速度
  • 缓存策略:合理设置缓存,减少重复请求
  • 监控:使用监控工具,实时了解网站状态
  • 日志:收集和分析日志,快速定位问题
  • 回滚:准备回滚方案,出现问题时快速恢复
  • 环境变量:使用环境变量管理不同环境的配置

前端部署,让你的代码快速、安全地到达用户手中!

Read more

无人机航拍检测实战:用YOLOv8打造高空鹰眼系统

无人机航拍检测实战:用YOLOv8打造高空鹰眼系统 1. 引言:从工业缺陷到高空之眼 在上一期《YOLOv8【第八章:特殊场景检测篇·第12节】一文搞懂,工业缺陷检测专业化!》中,我们深入探讨了如何将YOLOv8应用于高精度、高标准的工业质检场景。面对微小缺陷、复杂纹理和样本不均等挑战,我们通过锚框重聚类、Focal Loss优化与数据增强策略,实现了对焊点、划痕等细微异常的精准识别。 而今天,我们将视角从“微观”转向“宏观”,聚焦于一个更具挑战性的应用场景——无人机航拍目标检测。 随着无人机技术的普及,其在农业植保、电力巡检、灾害救援、交通监控等领域发挥着越来越重要的作用。然而,要让无人机真正具备“智能感知”能力,仅靠高清摄像头远远不够。我们需要为它装上一双“会思考的眼睛”——即基于深度学习的目标检测系统。 🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类

AI Skills:前端新的效率神器!

近来,AI 领域有个火爆的话题:Skills。 Github 上被疯狂 star 的仓库,很多都是和 skills 有关的。 有的仓库仅仅上线三个月就获得了快 50K 的 star,Skills 的火热可见一斑。 不管是大模型,还是 Cursor、Codex、Claude、Trae、Copilot 等编程 IDE 都在争先支持 Skills。 围绕 Skills,它们在做的就是为了完成一件事情:技能是通过学习和反复练习获得的,而 Skills 是把经验和最佳实践沉淀为 AI 能力,将“知道”转化为“做到”的本领。 详解什么是 Skills 要说清楚什么是 Skills,先来了解一下关于 AI 的 2

零基础前端模拟器完整指南:在浏览器中畅玩经典游戏

零基础前端模拟器完整指南:在浏览器中畅玩经典游戏 【免费下载链接】EmulatorJSThe official home of the EmulatorJS project 项目地址: https://gitcode.com/GitHub_Trending/em/EmulatorJS 想在浏览器中重温童年经典游戏吗?浏览器游戏模拟器让这一切成为可能!无需安装复杂软件,只需一个网页就能畅玩从任天堂到世嘉的数十种经典游戏主机。本指南将带你从零开始,掌握EmulatorJS的部署、配置与优化技巧,让你轻松搭建属于自己的网页游戏怀旧站🎮 一、为什么选择EmulatorJS?3大核心优势解析 EmulatorJS作为一款基于Web前端的RetroArch模拟器界面,自4.0版本完全重写后,带来了三大革命性提升: * 纯Web技术栈:无需任何插件,直接在浏览器中运行 * 模块化架构:核心功能与界面分离,定制灵活 * 多平台支持:从8位机到32位机,覆盖数十种经典游戏系统 二、3种部署方案对比:哪种最适合你? 2.1 如何用CDN快速启动?5分钟上手方案 最简单的方式,

【Spring Boot】Spring Boot调用 WebService 接口的两种方式:动态调用 vs 静态调用 亲测有效

文章目录 * 前言 * 0、前提准备,添加依赖(Spring Boot + CXF) * 一、 方法一:动态调用 WebService(推荐用于调试) * 1. 添加依赖(Spring Boot + CXF) * 2、调用示例代码 * 3、注意事项 * 二、方法二:静态调用 WebService(推荐用于生产) * 1. 添加依赖(Spring Boot + CXF) * 2、获取 WSDL 文件 * 3、使用 `wsimport` 生成 Java 类 * 1. 检查 `wsimport` 是否存在 * 2. 进入存放 `service.wsdl`