记一次用雨云搭建web千恋万花——从希望到破灭的踩坑实录

记一次用雨云搭建web千恋万花——从希望到破灭的踩坑实录

前言

最近在GitHub上发现了一个有趣的项目——serenbanka-Web版,这是一个基于Vue.js开发的web版《千恋万花》。作为一名前端开发者,看到能在浏览器里运行galgame,瞬间就心动了。考虑到项目包含大量多媒体资源(近2.5GB的音频图片),我放弃了GitHub Pages方案,决定使用雨云云服务器进行部署。本以为能绕过各种限制,结果…现实给了我一记重拳。

今天就来记录这次从满怀希望到彻底失败的踩坑经历,希望能给想部署大型前端项目的伙伴们提个醒。


项目初探

技术栈分析

这个web版千恋万花的技术架构相当完整:

  • 核心框架:Vue.js 2.x(略显陈旧但够用)
  • 构建工具:Webpack(配置复杂但功能强大)
  • 状态管理:Vuex + Vue Router
  • 资源处理:SCSS预处理器 + 多媒体加载器

项目结构

serenbanka-Vue/
├── public/          # 公共资源
├── src/
│   ├── assets/      # 1.8GB音频 + 600MB图片
│   ├── components/  # 游戏UI组件
│   ├── views/       # 场景页面
│   ├── store/       # 游戏状态管理
└── vue.config.js    # Webpack配置入口

为什么选择雨云?

决策过程

考虑到项目的特殊需求:

  1. 资源海量:2.5GB多媒体文件
  2. 构建压力:Webpack处理大资源时内存吃紧
  3. 国内访问:目标用户主要在国内

对比方案:

平台 内存限制 存储空间 国内访问速度 环境自由度
GitHub Pages 7GB 1GB推荐 较慢
Vercel 8GB 不限 一般
雨云 自定义 SSD存储 优秀 完全控制

最终选择雨云的AMD EPYC高级套餐(4核8G + 200GB SSD),月费约68元(用了[5折优惠链接](https://www.rainyun. com/yCENzh_))


雨云部署踩坑全记录

第一阶段:环境搭建(30分钟)

# 连接服务器
ssh root@rainyun-server

# 安装基础环境
apt update && apt install -y nginx nodejs npm

# 检查版本
node -v  # v18.12.1
npm -v   # 9.8.1

# 克隆项目
git clone https://gith ub.co m/yCENzh/seren banka-We b.git
cd serenbanka-Web

:white_check_mark: 进展顺利:雨云的Ubuntu 22.04镜像干净整洁,包管理器速度飞快


第二阶段:依赖安装(噩梦开始)

npm install

立即遭遇连环报错:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR! 
npm ERR! While resolving: webpack-dev-server@4.15.1
npm ERR! Found: webpack@4.46.0
npm ERR! node_modules/webpack
npm ERR!   dev webpack@"^4.46.0" from the root project

问题根源

  1. 项目使用老旧的Webpack 4.x
  2. 新版Node.js(v18)不兼容部分依赖
  3. 项目中有32个deprecated包

尝试修复

# 尝试降级Node
nvm install 16.20.2

# 使用legacy模式安装
npm install --legacy-peer-deps --force

# 手动修改package.json
"resolutions": {
  "webpack": "^4.46.0"
}

:warning: 结果:依赖勉强装上,但收到48个warning


第三阶段:构建大逃杀

npm run build

问题1:内存溢出(首次崩溃)

FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

解决方案

# 扩大Node内存限制
export NODE_OPTIONS="--max-old-space-size=8192"

问题2:图片解析错误

Module parse failed: Unexpected character '�' (1:0)
You may need an appropriate loader for this file type.

原因排查

  • 部分.jpg文件实际是.webp格式
  • 文件名包含中文导致路径解析失败

问题3:诡异的语法报错

 ERROR  Failed to compile with 18 errors
These dependencies were not found:
* @/components/SpecialEffect in ./src/views/GameScene.vue
* core-js/modules/es.array.push in ./src/store/modules/game.js

:three_o_clock: 耗时3小时:通过注释代码+分段构建,勉强生成dist目录


第四阶段:Nginx配置(最后的希望)

server {
    listen 80;
    server_name senrenbanka.site;

    # 静态资源配置
    location / {
        root /var/www/serenbanka/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # 媒体资源缓存
    location ~* \.(mp3|jpg|png)$ {
        expires 30d;
        add_header Cache-Control "public";
    }
}

重启服务systemctl restart nginx


最终失败:浏览器中的绝望

访问服务器IP后:

![报错截图](https://i. im gur. com/8f3KbQl.png)

致命问题汇总

  1. 资源加载失败:30%的图片返回404
  2. 音频不同步:BGM播放卡顿严重
  3. 路由崩溃:切换场景后页面白屏
  4. 控制台报错
    Uncaught TypeError: Cannot read properties of undefined (reading 'dispatch')
    AudioContext error: DOMException: Unable to decode audio data
    

失败原因深度复盘

技术层面

  1. 项目本身问题

    • 代码年久失修(最后更新2年前)
    • 依赖版本锁死无法升级
    • 资源文件管理混乱
  2. 环境适配问题

    graph LR
    A[Node.js版本] --> B(API变更)
    C[Webpack4] --> D(现代浏览器ESM)
    E[音频编码] --> F(浏览器兼容)
    
  3. 操作失误

    • 未提前完整测试项目
    • 低估了老旧项目的适配成本
    • 缺乏大型Webpack项目调优经验

认知层面

  1. 云服务器≠万能解药

    • 解决了资源存储问题
    • 但无法修复代码缺陷
    • 环境配置复杂度远超预期
  2. 技术债需要偿还

    • 强行运行过期技术栈
    • 技术选择存在路径依赖
    • 缺乏渐进式重构意识

收获与反思

意外收获

  1. 深度掌握Webpack调优技巧

    • 学会了memory-cache优化
    • 掌握了多进程构建配置
    • 理解了资源分块策略
  2. 雨云使用经验

    • 服务器监控很有用
    top - 15:20:32 up 3 days,  1:37,  load average: 2.01, 1.73, 1.48
    MiB Mem :   7986.8 total,    102.3 free,    ️5120.2 used  # 内存吃紧!
    
    • 快照功能挽回多次误操作
    • 国内访问速度确实优秀(ping值<30ms)

血泪教训

  1. 老旧项目部署前必须:

    • 检查commit记录活跃度
    • 在本地完整跑通流程
    • 评估技术债偿还成本
  2. 云服务器使用原则:

    • 先从小型测试项目入手
    • 善用服务器快照功能
    • 监控资源使用情况

后续计划

短期行动

  1. 回退到本地运行
    npm install --legacy-peer-deps
    npm run dev  # 至少能玩!
    
  2. 提交issue给原项目
    • 整理完整的依赖问题清单
    • 提供Node16兼容方案

长期策略

  1. 技术栈升级方案

    组件 现状 目标 风险
    Vue 2.6 3.2
    Webpack 4.46 Vite 5
    状态管理 Vuex Pinia
  2. 容器化部署研究

    FROM node:16-bullseye
    WORKDIR /app
    COPY package*.json .
    RUN npm install --legacy-peer-deps
    COPY . .
    RUN npm run build
    CMD ["npm", "run", "serve"]
    

写在最后

这次部署尝试虽然失败,但收获远超预期:

  1. 云服务器实操经验:掌握了雨云从配置到监控的全流程
  2. 前端工程化认知:理解了大型项目的构建优化要点
  3. 技术选型方法论:老旧项目的评估框架

关键领悟:服务器再强大也救不了问题项目,就像再好的手术台也治不好先天疾病

建议想尝试类似项目的朋友:

  1. 先用小项目练手云服务
  2. 仔细评估开源项目状态
  3. 做好技术攻坚准备

虽然雨云之旅翻车了,但它的稳定性和性价比确实不错。下次我定会带着更成熟的项目回来!

此类应用是docker的最佳实践环境,非常推荐使用dockerfile将项目打包成镜像,可以丢在云服务器用docker或者直接在云应用部署~

1 个赞

ai味好浓

2 个赞

打包内存溢出的坑我也踩过了(但是我是问题发生在 Nuxt 框架上),从那之后我就是构建部署分离了。

类似的,我还有个教训:一定要留下lockfile,一定要在package.json 中填写engine和packageManager字段。

能不能部署一个老项目,关键其实就是能复现多少当时的环境。开发时候留下的信息越多,越有利于日后重新部署。

当然,就像上面说的,现在打包成镜像绝对是另一个更好的方式。容器应用现在应该是很多情况下的首选了。