站点运维 · 视频编码兼容 · CloudBase 托管 · 自动化
本文记录了一个包含 16 个独立页面的课程类静态网站从"一批松散 HTML 文件"到"生产环境就绪"的全过程。重点分享视频编码兼容性排查、CSS/JS 批量注入、以及腾讯云 CloudBase 静态托管的部署实战。
维护多页面静态网站时常见的一类问题:
style="width:1152px"),移动端布局崩坏拿到一批新的页面文件后,通过脚本批量执行以下处理:
步骤 | 操作 | 目的 |
|---|---|---|
路径规范化 | 编码路径替换为相对路径 | 修复导出工具产生的绝对路径 |
CSS 注入 | 向每个页面追加统一样式 | 保证全站视觉一致性 |
JS 注入 | 向每个页面追加统一脚本 | 交互行为统一 |
内联宽度清理 | 清除 img 标签的固定 width | 移动端适配 |
懒加载标记 | img 标签添加 loading="lazy" | 首屏性能优化 |
索引更新 | 更新总索引页链接 | 导航完整性 |
实现方式:编写脚本遍历所有 HTML 文件,用 DOM 选择器精确定位目标元素进行修改。
部署后发现视频在手机端黑屏——这是最常见的视频兼容性问题。
iPhone 和微信拍摄的视频默认使用 HEVC(H.265)编码。Chrome/Edge 桌面端和大部分 Android 浏览器不支持硬件解码 HEVC:
用 ffprobe 检查视频流编码格式:
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 input.mp4输出含义:
输出值 | 编码 | 兼容性 |
|---|---|---|
| HEVC/H.265 | 大部分浏览器不支持 |
| H.264 | 全平台兼容 |
可以写成脚本批量扫描整个视频目录,一键找出所有不兼容的文件。
使用 ffmpeg 将 HEVC 转为 H.264:
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -maxrate 800k \
-bufsize 1600k -preset fast -pix_fmt yuv420p \
-movflags +faststart -c:a aac -b:a 96k output.mp4各参数说明:
参数 | 作用 | 推荐值 |
|---|---|---|
| 视频编码器 | H.264,兼容性最好 |
| 画质(0-51,越小越好) | 28 是体积/画质平衡点 |
| 峰值码率限制 | 防止码率飙升 |
| 码率缓冲区 | 配合 maxrate |
| 编码速度 | fast 兼顾速度和压缩率 |
| 像素格式 | 确保跨浏览器兼容 |
| 快启标记 | 边下边播 |
| 音频编码和码率 | AAC + 96kbps 适合语音 |
.mp4 只是容器,H.264 和 HEVC 都可以用它页面数量多时最大的风险是修改遗漏。解决方案:将样式和脚本抽取为模板块,通过脚本自动注入到所有页面。
/* 用 CSS 变量覆盖内联宽度,避免 !important 死锁 */
.long-img {
width: var(--mlw, 100%) !important;
max-width: none;
}
.card {
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 12px rgba(0, 0, 0, .08);
}
.avatar {
width: 36px !important;
height: 36px !important;
border-radius: 50%;
}关键点:用 CSS 变量 --mlw 配合 !important 覆盖内联宽度。直接设 style.width 在遇到已有 !important 时无效。
// 外链卡片:叠加透明锚点,利用浏览器原生行为打开链接
document.querySelectorAll(".card[data-url]").forEach(function(card) {
var a = document.createElement("a");
a.href = card.dataset.url;
a.target = "_blank";
a.style.cssText = "position:absolute;inset:0;z-index:5";
card.style.position = "relative";
card.appendChild(a);
});
// 图片点击预览
document.querySelectorAll("img").forEach(function(img) {
img.addEventListener("click", function() {
openPreview(img.src);
});
});外链卡片用透明 <a> 叠加而非 window.open(),因为在移动端 WebView 中程序化弹窗经常被拦截。
# 安装 CLI(如尚未安装)
npm install -g @cloudbase/cli
# 登录
tcb login
# 部署单个目录(必须指定 cloudPath,否则文件平铺到根目录导致 404)
tcb hosting deploy ./lesson1 lesson1 -e your-env-id关键注意事项:
cloudPath 参数必须指定,否则所有文件平铺到根目录,相对路径引用全部 404检查项 | 通过标准 | |
|---|---|---|
1 | 全站 CSS/JS 已更新 | 审计脚本扫描所有页面确认版本一致 |
2 | 视频编码扫描 | ffprobe 批量扫描,0 个 HEVC 文件 |
3 | 图片优化 | 已压缩 + 懒加载标记 |
4 | 头像尺寸 | CSS 强制 36px × 36px |
5 | 交互体验 | 弹窗滚动保持、触摸事件正常 |
6 | 临时文件清理 | 无 .bak/.py/pycache 等非发布文件 |
7 | 线上验证 | 部署后 curl 或浏览器访问确认 |
问题 | 现象 | 原因 | 解决 |
|---|---|---|---|
视频黑屏 | 有声有进度条画面全黑 | HEVC 编码不兼容 | ffprobe 扫描 + ffmpeg 转 H.264 |
画面压扁 | 宽高比异常 | 清除 width 时保留了 height | 宽高一起清除 |
页面显示源码 | 出现大段文本 | style 块残留在 body | 注入前检查 body 内容 |
错误做法 | 正确做法 |
|---|---|
部署后才发现视频有问题 | 本地预览验证后再部署 |
只改当前页忘了其他页 | 用审计脚本全站巡检 |
临时文件留在项目目录 | 部署前清理非发布文件 |
浪费方式 | 优化 |
|---|---|
反复搜索工具路径 | 先确认可用版本再写入脚本 |
手动轮询长任务状态 | 后台执行 + 完成通知 |
转码参数反复试错 | 先测单文件确定参数再批量 |
多页面静态网站运维的核心在于方法论的可复用性:
如果你也在维护类似的多页面静态项目(课程站、文档站、活动页集合),可以参考这套工作流的思路。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。