关注SmartSoftHelp 魔法精灵工作室,关注波哥,开发不迷路,不一样的视角看编程!

1.GitHub      (托管)          
https://github.com/512929249/SmartSoftHelpProGlobalEco.githttps://github.com/512929249/SmartSoftHelpProGlobalEco.git
2.Gitee         (码云)          
https://gitee.com/sky512929249/SmartSoftHelpProGlobalEco.githttps://gitee.com/sky512929249/SmartSoftHelpProGlobalEco.git
3.Download (下载地址):
https://github.com/512929249/SmartSoftHelpProGlobalEco/archive/refs/heads/master.ziphttps://github.com/512929249/SmartSoftHelpProGlobalEco/archive/refs/heads/master.zip

想在 uniapp 开发中进行极致优化html5客户端,将从你提到的 9 个方向,为你提供具体、可执行的代码方案和优化建议。

一、网页加载顺序优化

  1. 核心 CSS 内联,非核心 CSS 异步加载

    • 将关键 CSS(如首屏渲染必需的样式)内联到<head>,减少 HTTP 请求;非关键 CSS 通过link标签异步加载。

    html

    预览

    <!-- 内联核心CSS -->
    <style>
      /* 首屏关键样式,如布局、颜色等 */
      body { margin: 0; padding: 0; font-family: sans-serif; }
      .header { height: 60px; background: #fff; }
    </style>
    <!-- 异步加载非核心CSS -->
    <link rel="stylesheet" href="/static/css/other.css" media="print" onload="this.media='all'">
    
  2. JS 脚本异步加载

    • 使用deferasync属性加载 JS 脚本,避免阻塞 DOM 解析。defer按顺序执行,async不保证顺序,根据需求选择。

    html

    预览

    <!-- 异步加载JS,不阻塞DOM解析 -->
    <script src="/static/js/vendor.js" defer></script>
    <script src="/static/js/app.js" defer></script>
    
  3. 预加载关键资源

    • 对首屏必需的图片、字体等资源使用<link rel="preload">提前加载,提升渲染速度。

    html

    预览

    <!-- 预加载首屏图片 -->
    <link rel="preload" href="/static/images/banner.jpg" as="image">
    <!-- 预加载字体 -->
    <link rel="preload" href="/static/fonts/iconfont.woff2" as="font" type="font/woff2" crossorigin>
    

二、网页渲染优化

  1. 减少 DOM 操作,使用虚拟 DOM

    • 避免频繁操作 DOM(如多次 appendChild),尽量批量处理。Uniapp 基于 Vue,已使用虚拟 DOM,减少直接操作真实 DOM 的场景。

    javascript

    运行

    // 不推荐:频繁操作DOM
    const list = document.getElementById('list');
    data.forEach(item => {
      const li = document.createElement('li');
      li.textContent = item;
      list.appendChild(li); // 多次DOM操作
    });
    
    // 推荐:批量处理后一次性插入
    const fragment = document.createDocumentFragment();
    data.forEach(item => {
      const li = document.createElement('li');
      li.textContent = item;
      fragment.appendChild(li); // 操作文档片段,不触发重排
    });
    list.appendChild(fragment); // 一次性插入,仅触发一次重排
    
  2. 避免布局抖动(Layout Thrashing)

    • 避免频繁读取和修改 DOM 布局属性(如offsetWidthclientHeight),导致浏览器反复重排重绘。

    javascript

    运行

    // 不推荐:频繁读写DOM布局
    const div = document.getElementById('box');
    for (let i = 0; i < 100; i++) {
      div.style.width = `${div.offsetWidth + 10}px`; // 每次循环都读+写,触发多次重排
    }
    
    // 推荐:先读取所有必要属性,再批量修改
    const div = document.getElementById('box');
    let width = div.offsetWidth; // 先读取一次
    for (let i = 0; i < 100; i++) {
      width += 10;
    }
    div.style.width = `${width}px`; // 仅写入一次,触发一次重排
    
  3. 使用 CSS 硬件加速

    • 对需要动画的元素,使用transformopacity等属性触发 GPU 加速,避免重排重绘。

    css

    /* 硬件加速动画元素 */
    .animate-box {
      transform: translateZ(0); /* 触发GPU加速 */
      transition: transform 0.3s ease;
    }
    .animate-box:hover {
      transform: scale(1.05);
    }
    
  4. 减少重排重绘

    • 避免使用box-shadowgradient等耗性能的 CSS 属性;
    • 图片提前设置宽高,避免加载后改变布局;
    • 使用will-change提前告知浏览器元素可能发生的变化,优化渲染准备。

    css

    /* 提前告知浏览器元素将变化 */
    .slide-item {
      will-change: transform;
    }
    

三、HTML 头部优化,CSS 缓存,JS 缓存优化

  1. HTML 头部优化

    • 设置正确的文档类型和编码;
    • 使用<meta name="viewport">优化移动端显示;
    • 添加<link rel="icon"><meta name="theme-color">提升体验;
    • 避免在<head>中放置非必要脚本。

    html

    预览

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta name="theme-color" content="#ffffff">
      <link rel="icon" href="/static/favicon.ico">
      <title>Uniapp优化示例</title>
      <!-- 其他头部资源 -->
    </head>
    
  2. CSS 和 JS 缓存优化

    • 通过 HTTP 响应头设置缓存策略,如Cache-ControlExpires
    • 对静态资源(CSS、JS)使用版本号或哈希值命名,实现强制缓存和缓存更新。

    html

    预览

    <!-- 使用哈希值命名资源,实现缓存更新 -->
    <link rel="stylesheet" href="/static/css/app.[hash].css">
    <script src="/static/js/app.[hash].js" defer></script>
    
    • 服务端配置(以 Nginx 为例):

    nginx

    # 静态资源缓存配置
    location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff2)$ {
      expires 30d; # 缓存30天
      add_header Cache-Control "public, max-age=2592000";
      # 对带哈希值的资源设置永久缓存
      if ($request_filename ~* \.[0-9a-f]+\.(css|js|png|jpg)) {
        expires 1y;
      }
    }
    

四、HTML,CSS,JS 压缩优化

  1. 代码压缩

    • 使用构建工具(如 Webpack、Vite)对 HTML、CSS、JS 进行压缩,去除空格、注释、冗余代码。
    • Uniapp CLI 项目默认集成了压缩功能,可在vue.config.js中配置:

    javascript

    运行

    // vue.config.js
    module.exports = {
      configureWebpack: {
        optimization: {
          minimize: true, // 开启JS压缩
          minimizer: [
            // 自定义压缩配置
            new TerserPlugin({
              terserOptions: {
                compress: {
                  drop_console: true, // 移除console.log
                },
              },
            }),
          ],
        },
      },
      css: {
        extract: true,
        sourceMap: false,
        loaderOptions: {
          css: {
            // 压缩CSS
            minimize: true,
          },
        },
      },
    };
    
  2. HTML 压缩

    • 使用html-minifier-terser插件压缩 HTML,去除空格、注释、多余属性。

    javascript

    运行

    // vue.config.js
    const HtmlMinifierPlugin = require('html-minifier-terser').HtmlMinifierPlugin;
    
    module.exports = {
      configureWebpack: {
        plugins: [
          new HtmlMinifierPlugin({
            minifyCSS: true, // 压缩HTML中的CSS
            minifyJS: true, // 压缩HTML中的JS
            removeComments: true, // 移除注释
            collapseWhitespace: true, // 折叠空格
            removeRedundantAttributes: true, // 移除冗余属性
          }),
        ],
      },
    };
    

五、JS,CSS,HTML 异步加载优化

  1. 动态加载非首屏资源

    • 对非首屏的 CSS 和 JS,通过动态创建linkscript标签实现异步加载。

    javascript

    运行

    // 动态加载CSS
    function loadCSS(url) {
      const link = document.createElement('link');
      link.rel = 'stylesheet';
      link.href = url;
      document.head.appendChild(link);
    }
    
    // 动态加载JS
    function loadJS(url, callback) {
      const script = document.createElement('script');
      script.src = url;
      script.defer = true;
      script.onload = callback;
      document.body.appendChild(script);
    }
    
    // 首屏加载完成后,加载非首屏资源
    window.addEventListener('load', () => {
      loadCSS('/static/css/non-critical.css');
      loadJS('/static/js/non-critical.js', () => {
        console.log('非首屏JS加载完成');
      });
    });
    
  2. 懒加载组件和路由

    • 在 Uniapp 中,使用路由懒加载和组件懒加载,减少初始加载资源体积。

    javascript

    运行

    // 路由懒加载(pages.json)
    {
      "pages": [
        {
          "path": "/pages/index",
          "style": {
            "navigationBarTitleText": "首页"
          },
          "lazyCodeLoading": "requiredComponents" // 仅加载当前页面必需的组件
        }
      ]
    }
    
    // 组件懒加载(Vue组件中)
    export default {
      components: {
        // 懒加载非首屏组件
        LazyComponent: () => import('@/components/LazyComponent'),
      },
    };
    

六、AJAX 访问,异步访问接口优化

  1. 接口请求优化

    • 合并接口请求,减少 HTTP 请求次数;
    • 使用缓存(如本地存储、SessionStorage)缓存接口返回数据,避免重复请求;
    • 实现接口请求防抖和节流,避免频繁触发请求。

    javascript

    运行

    // 接口请求缓存示例
    const requestCache = new Map();
    
    async function request(url, params, options = {}) {
      const cacheKey = `${url}-${JSON.stringify(params)}`;
      // 检查缓存
      if (requestCache.has(cacheKey) && !options.forceRefresh) {
        return requestCache.get(cacheKey);
      }
    
      try {
        const response = await uni.request({ url, data: params });
        const data = response.data;
        // 缓存数据(设置过期时间)
        requestCache.set(cacheKey, data);
        setTimeout(() => {
          requestCache.delete(cacheKey); // 过期清除缓存
        }, options.cacheTime || 300000); // 默认缓存5分钟
        return data;
      } catch (error) {
        console.error('请求失败:', error);
        throw error;
      }
    }
    
    // 防抖函数
    function debounce(fn, delay) {
      let timer = null;
      return function(...args) {
        clearTimeout(timer);
        timer = setTimeout(() => {
          fn.apply(this, args);
        }, delay);
      };
    }
    
    // 节流函数
    function throttle(fn, interval) {
      let lastTime = 0;
      return function(...args) {
        const now = Date.now();
        if (now - lastTime >= interval) {
          fn.apply(this, args);
          lastTime = now;
        }
      };
    }
    
    // 使用防抖处理搜索接口
    const search = debounce(async (keyword) => {
      const result = await request('/api/search', { keyword });
      console.log('搜索结果:', result);
    }, 300);
    
  2. 使用 HTTP/2 或 HTTP/3

    • 服务端启用 HTTP/2 或 HTTP/3,支持多路复用,减少连接开销,提升接口请求效率。
  3. 接口错误重试和降级

    • 实现接口请求失败后的重试机制(如使用axios-retry插件),并在多次失败后进行服务降级(如返回缓存数据或默认数据)。

    javascript

    运行

    // 接口重试示例(使用axios)
    import axios from 'axios';
    import axiosRetry from 'axios-retry';
    
    axiosRetry(axios, {
      retries: 3, // 重试3次
      retryDelay: (retryCount) => {
        return retryCount * 1000; // 每次重试间隔增加1秒
      },
    });
    
    axios.get('/api/data')
      .then(response => console.log(response.data))
      .catch(error => {
        console.error('接口请求失败,已降级处理');
        // 返回缓存数据或默认数据
        return { code: 0, data: cachedData };
      });
    

七、减少绘制时间,减少服务器访问次数优化

  1. 减少绘制时间

    • 简化页面 DOM 结构,避免过深的嵌套;
    • 减少使用floatposition: absolute等可能触发复杂布局的属性;
    • 使用 CSScontain属性隔离元素,限制重排重绘范围。

    css

    /* 隔离元素,仅自身重排重绘 */
    .card {
      contain: layout paint;
    }
    
  2. 减少服务器访问次数

    • 静态资源本地缓存(如图片、JS、CSS);
    • 接口数据缓存(如上述第六点);
    • 使用 CDN 分发静态资源,减少源服务器访问压力;
    • 预加载常用资源,避免用户操作时的延迟。

八、图片,视频缓存优化

  1. 图片优化

    • 使用适当的图片格式(如 WebP、AVIF,比 JPG/PNG 更小);
    • 图片压缩(如使用 TinyPNG、Squoosh 工具);
    • 图片懒加载,仅加载可视区域内的图片;
    • 使用srcsetsizes属性,根据设备分辨率加载合适尺寸的图片。

    html

    预览

    <!-- 图片懒加载(Uniapp中使用uni-app的lazy-load组件) -->
    <image src="/static/images/default.png" lazy-load mode="aspectFill" data-src="/static/images/real.jpg"></image>
    
    <!-- 使用srcset和sizes加载响应式图片 -->
    <img src="/static/images/image-480w.jpg"
         srcset="/static/images/image-480w.jpg 480w,
                 /static/images/image-800w.jpg 800w"
         sizes="(max-width: 600px) 480px,
                800px"
         alt="响应式图片">
    
  2. 视频优化

    • 使用preload属性控制视频预加载(如preload="auto"自动预加载,preload="none"不预加载);
    • 视频懒加载,仅当用户进入视频区域时才加载;
    • 使用poster属性设置视频封面,避免黑屏等待。

    html

    预览

    <!-- 视频懒加载示例 -->
    <video poster="/static/images/video-cover.jpg" controls preload="none" data-src="/static/videos/video.mp4">
      您的浏览器不支持视频播放
    </video>
    
    <script>
      // 监听滚动,实现视频懒加载
      document.addEventListener('scroll', () => {
        const videos = document.querySelectorAll('video[data-src]');
        videos.forEach(video => {
          const rect = video.getBoundingClientRect();
          if (rect.top < window.innerHeight && rect.bottom > 0) {
            video.src = video.dataset.src;
            video.removeAttribute('data-src');
          }
        });
      });
    </script>
    
  3. 缓存策略

    • 图片和视频资源通过 HTTP 响应头设置长期缓存(如expires: 1y),并使用版本号或哈希值命名,实现缓存更新。

九、其他前端优化方面

  1. 字体优化

    • 使用系统字体或轻量级字体;
    • 字体文件压缩(如使用 WOFF2 格式);
    • 字体预加载和异步加载,避免 FOIT(字体加载时文本不可见)。

    html

    预览

    <!-- 字体预加载 -->
    <link rel="preload" href="/static/fonts/iconfont.woff2" as="font" type="font/woff2" crossorigin>
    
    <!-- 字体异步加载,避免FOIT -->
    <style>
      @font-face {
        font-family: 'MyFont';
        src: url('/static/fonts/myfont.woff2') format('woff2');
        font-weight: normal;
        font-style: normal;
        font-display: swap; /* 异步加载,使用备用字体直到加载完成 */
      }
    </style>
    
  2. 减少第三方依赖

    • 避免引入不必要的第三方库,优先使用原生 API;
    • 对必需的第三方库,按需引入(如使用lodash-es替代lodash,并通过import { debounce } from 'lodash-es'引入)。
  3. 代码分割

    • 使用 Webpack/Vite 的代码分割功能,将代码拆分为多个小 chunk,按需加载。

    javascript

    运行

    // 动态导入,实现代码分割
    button.addEventListener('click', async () => {
      const module = await import('./heavy-module');
      module.doSomething();
    });
    
  4. 使用 Web Workers

    • 将复杂计算(如数据处理、加密解密)移至 Web Workers,避免阻塞主线程,提升页面流畅度。

    javascript

    运行

    // main.js
    const worker = new Worker('/static/js/worker.js');
    
    // 向Web Worker发送数据
    worker.postMessage({ type: 'compute', data: [1, 2, 3, 4] });
    
    // 接收Web Worker的计算结果
    worker.onmessage = (e) => {
      console.log('计算结果:', e.data);
    };
    
    // worker.js
    self.onmessage = (e) => {
      const { type, data } = e.data;
      if (type === 'compute') {
        const result = data.reduce((sum, item) => sum + item, 0);
        self.postMessage(result); // 发送结果回主线程
      }
    };
    
  5. 性能监控和分析

    • 使用 Chrome DevTools(Performance、Lighthouse)分析页面性能瓶颈;
    • 集成第三方性能监控工具(如百度统计、阿里云 ARMS),实时监控线上性能问题。
  6. Uniapp 专项优化

    • 减少pages.json中不必要的配置,避免冗余页面;
    • 合理使用uni.createSelectorQuery,避免频繁查询 DOM;
    • 对列表数据使用v-for时,添加key属性,提升渲染效率;
    • 避免在onLoadonShow中执行复杂逻辑,移至onReady或异步执行。

    javascript

    运行

    // Uniapp中优化列表渲染
    <template>
      <view>
        <view v-for="item in list" :key="item.id">
          {{ item.name }}
        </view>
      </view>
    </template>
    
    <script>
      export default {
        data() {
          return {
            list: [],
          };
        },
        onLoad() {
          // 异步加载列表数据,避免阻塞页面渲染
          this.fetchList();
        },
        methods: {
          async fetchList() {
            const res = await uni.request({ url: '/api/list' });
            this.list = res.data;
          },
        },
      };
    </script>
    

总结

前端优化是一个系统性的工程,需要从加载、渲染、缓存、代码质量等多个维度综合考虑。以上方案涵盖了 Uniapp 开发中常见的优化方向,你可以根据项目实际情况,有针对性地选择和实施。同时,建议结合性能监控工具,持续跟踪优化效果,不断迭代改进。

1.GitHub      (托管)          
https://github.com/512929249/SmartSoftHelpProGlobalEco.githttps://github.com/512929249/SmartSoftHelpProGlobalEco.git
2.Gitee         (码云)          
https://gitee.com/sky512929249/SmartSoftHelpProGlobalEco.githttps://gitee.com/sky512929249/SmartSoftHelpProGlobalEco.git
3.Download (下载地址):
https://github.com/512929249/SmartSoftHelpProGlobalEco/archive/refs/heads/master.ziphttps://github.com/512929249/SmartSoftHelpProGlobalEco/archive/refs/heads/master.zip

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐