新商家系统性能优化实践
商家系统新版本上线后,团队持续针对构建效率与用户体验做了一轮系统性优化。本文记录核心方案与落地结果,供后续版本复用。
1. 优化目标
本轮优化聚焦以下三个方向:
- 构建产物体积控制;
- 静态资源加载效率提升;
- 发布后更新体验优化(减少长时间等待刷新)。
项目技术栈:Vite + Vue 3 + Element Plus + TypeScript + Sass + Pinia。
2. 构建产物优化
2.1 压缩策略
使用 vite-plugin-compression 生成 gzip 或 brotli 产物,降低网络传输体积:
import compressPlugin from "vite-plugin-compression";
export const createCompress = (compress: any) => {
if (compress === "brotli") {
return compressPlugin({
ext: ".br",
algorithm: "brotliCompress",
});
}
if (compress === "gzip" || compress) {
return compressPlugin({
filter: /\.(js|mjs|json|css|html)$/i,
ext: ".gz",
algorithm: "gzip",
threshold: 10240,
deleteOriginFile: false,
});
}
return [];
};
2.2 分包与缓存策略
通过 manualChunks 拆分公共依赖与大模块,并结合文件哈希策略提升缓存命中率:
// vite.config.ts
export default defineConfig({
build: {
chunkSizeWarningLimit: 10240,
cssCodeSplit: true,
reportCompressedSize: true,
rollupOptions: {
treeshake: true,
cache: true,
output: {
chunkFileNames: outputHash ? "static/js/[name]-[hash].js" : "static/js/[name].js",
entryFileNames: outputHash ? "static/js/[name]-[hash].js" : "static/js/[name].js",
assetFileNames: outputHash
? "static/[ext]/[name]-[hash].[ext]"
: "static/[ext]/[name].[ext]",
manualChunks: {
vue: ["vue", "vue-router", "pinia", "axios"],
player: ["xgplayer", "xgplayer-hls.js"],
utils: ["@vueuse/core", "@vueuse/head"],
// ...
},
minify: true,
sourcemap: false,
...(minify === "terser"
? {
terserOptions: {
compress: prod
? {
defaults: true,
drop_console: true,
drop_debugger: true,
pure_funcs: ["console.log", "console.warn"],
}
: false,
mangle: prod,
format: {
comments: !prod,
beautify: prod,
},
},
}
: {}),
},
},
},
});
3. 静态资源治理
- 图片资源进行压缩与分级管理;
- 大图优先上传 CDN,避免全部进入
dist; - 小体积资源可按需保留在本地打包产物中;
- 配合懒加载降低首屏资源压力。
4. 优化结果(阶段性)
本次优化后,主要收益如下:
- 构建效率提升:Linux 环境构建约
40s,完整部署约1min;Mac 环境构建约20s。 - 首屏加载体验改善:核心页面加载明显加快。
- 大体积文件拆分:约
3MB文件拆分至约700KB级别,并启用压缩传输。 - 发布后等待刷新问题得到优化。
- 构建与语法兼容策略完善,兼容
ES6+主流环境。 - 清理冗余文件与部分臃肿逻辑,降低维护成本。
- 修复外部链接跨域与访问异常问题。
- 控制台错误/警告持续清理,稳定性提升。
- 图片懒加载与渐进式加载落地,进一步优化首屏表现。
- 完成部分 UI 细节优化,提升整体观感与可用性。
5. 后续建议
- 引入持续性能监控(如构建时长、包体积、LCP/FCP);
- 对
manualChunks规则做版本化管理,避免分包策略回退; - 将“压缩 + 分包 + 缓存”作为新项目默认基线配置。
相关文章
老系统升级与兼容改造实践
公司原有业务系统采用 Node + jQuery 架构,长期运行后暴露出典型遗留系统问题:
GridView 宫格加载渲染优化
系统首页 GridView 宫格模块接口耗时不高,但首次进入总耗时接近 22s。复盘耗时分层定位过程、代码层面的瓶颈(约 2000 行、100 个 tab 重复节点)、优化手段与最终指标对比。
防篡改水印
在各类管理后台、SaaS 平台或内部系统中,页面水印已经是非常常见的能力:一方面在截图时携带账号、姓名、时间等信息,降低截图外传的风险;另一方面在上传图片或文档预览时,通过水印标记上传者与时间,满足审计和合规需求。
企业微信 uni-app H5:OAuth 回退白屏与列表缓存
第三方 BI 报表项目,企业微信内嵌 H5,uni-app 编译,history 模式。主页面 BiLink 同时承担静默授权和列表展示,上线后碰到两个问题:授权完清掉 URL 参数,iOS 侧滑返回还是白屏;列表加了缓存以后,刷新行…
内部插件 / 工具库开发实践
在企业前端项目中,utils、hooks、libs 这类通用能力通常分散在多个仓库,常见问题包括:
图片上传前的自定义水印实践
项目需要在图片上传前叠加动态水印。水印内容不是固定文案,而是由多个动态元素组成(如时间、地点、业务字段等)。
Series
team documents
13 / 22