• Shopify Theme 开发 —— 性能优化


    一、概述

    关于 Shopify Theme 的性能优化,通常有以下几点:

    1、卸载未使用的应用程序

    有些 app 会在 theme 里面插入一些代码,即使 app 未被使用,也可能会加载一些脚本文件,影响页面渲染速度,所以建议不使用的 app 都卸载掉。

    2、适当埋点,太多的埋点上报会影响网站速度

    添加过多的埋点,也会影响网页加载速度,所以要适当添加必要的埋点。

    3、为不同的设备提供最适合的图片

    在下文中细说。

    4、保持主题的版本最新

    主题的更新经常会涉及到性能的优化,所以如果使用的是 Shopify 主题商店中的主题,最好保持主题的版本最新;如果是基于 dawn 主题自主开发的,也应该随时关注官方代码更新。

    二、如何提供最适合的图片

    官方博客:Shopify 上的响应式图片与 Liquid

    1、目标

    • 图片质量高
    • 图片文件大小较小
    • 图片以最佳方式加载,页面呈现快

    2、image_url 和 image_tag 过滤器

    shopify 提供了image_url 和 image_tag 过滤器来帮助生成响应式图像。

    ① image_url

    用来生成图片在 Shopify CDN 的地址。它可以调整大小、裁剪、添加填充以及生成多种文件格式。

    1
    2
    3
    4
    5
    {{ section.settings.image | image_url: width: 300 }}
     
    //cdn.shopify.../files/dog.jpg?width=300

    ② image_tag

    用来生成 HTML 的 img 标签,默认图片懒加载。

    1
    2
    3
    4
    5
    {{ section.settings.image | image_url: width: 300 | image_tag }}
     
    "//cdn.shopify.../files/dog.jpg?width=300" width="300" height="393" />

    3、关于图片格式

    推荐 JPEG 或 JPG,如果浏览器兼容性允许,可以考虑 WEBP、AVIF、JPEG XL 等新的文件格式

    不使用GIF,如果需要动图,也选择MP4

    小 icon 之类的选择 svg 格式

    ⭐️ 使用 image_url 过滤器,Shopify image API 会自动选择最合适的图片格式,可能是 WEBP、AVIF,在不支持新文件格式的浏览器,也会选择合适的格式

    4、根据宽度设置不同尺寸图片

    这里需要用到 img 标签的 srcset 和 sizes 属性。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {{ section.settings.image |
      image_url: width: 600 |
      image_tag:
        widths: '300, 600',
        sizes: '(min-width: 400px) 298px, 78.75vw',
        style: 'width: 300px' }}
      src="//cdn.shopify.../files/dog.jpg?width=600"
      srcset="
        //cdn.shopify.../files/dog.jpg?width=300 300w,
        //cdn.shopify.../files/dog.jpg?width=600 600w"
      width="600"
      height="785"
      sizes="(min-width: 400px) 298px, 78.75vw"
      style="width: 300px">

    在上面的代码中,给浏览器提供了 2 个候选文件 - 一个为 300 像素宽,另一个为 600 像素宽,浏览器将根据用户的屏幕尺寸和设备像素比 (DPR) 来最终决定下载哪个。

    ⚠️ 注意不要过度使用 srcset,尤其是网站流量不高的情况下,用户访问的图片可能还没有在 CDN 中缓存,这样加载时间会更长。

    如果没有多尺寸图片,那么建议选择 2x 图。

    5、 标签

     标签是一个比较新的 HTML 标签,可以根据浏览器支持的类型、屏幕尺寸等提供合适的图片。

    ① 根据浏览器选择合适的图片类型(的type属性)

    1
    2
    3
    4
    5
      "image/avif" srcset="pug_life.avif" />
      "image/webp" srcset="pug_life.webp" />
      "pug_life.jpg" alt="pug wearing a striped t-shirt like a boss" />

      浏览器会按顺序读取里面的类型,提供第一个匹配到的图片源,都不支持,则选择保底。(在 liquid 中使用 image_url 过滤器可以达到一样的效果)

    ②根据屏幕尺寸提供不同的图片(的media属性)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      
        media="(min-width: 800px)"
        srcset="wide_800.jpg 800w, wide_1600.jpg 1600w"
      />
      
        media="(min-width: 400px)"
        srcset="narrow_400.jpg 400w, narrow_800.jpg 800w"
      />
      "wide_800.jpg" alt="Woman with dog looking at Grand Canyon" />

    ③避免手机端图片过大

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       media="(max-width: 800px)"
       srcset="
         {{ section.settings.image | image_url: width: 300 }} 1x,
         {{ section.settings.image | image_url: width: 600 }} 2x,
         ">
     {{ section.settings.image |
       image_url: width: 2000 |
       image_tag:
         widths: '1000, 2000',
         sizes: '(min-width: 1000px) 760px, (min-width: 800px) calc(100vw - 380px), (min-width: 400px) 298px, 78.75vw',
         class: 'mobile-size-fix' }}

      这个例子中800px以下的屏幕,只提供1x和2x的图,不会因为手机分辨率过高提供的图片太大。(1x的屏现在也很少了,这个1x可以按需保留)

    6、结论

    为了更好的加载图片,在写的时候,至少要用上 image_url 和 image_tag 过滤器,这样 Shopify image API 会帮你选择最合适的图片格式,还能懒加载。

    1
    {{ section.settings.image | image_url: width: 300 | image_tag }} 

    其次,如果同一张图,想在不同尺寸的设备上,加载不同尺寸的图,可以用 image_tag 的 sizes 和 widths

    1
    2
    3
    4
    5
    6
    {{ section.settings.image |
      image_url: width: 600 |
      image_tag:
        widths: '300, 600',
        sizes: '(min-width: 400px) 298px, 78.75vw',
        style: 'width: 300px' }}

    如果还希望不同尺寸使用不同的图片,那就可以试试使用 标签。(具体看5,感觉 image_url 和 image_tag 基本上够用了)。

    关于加载优化,看这篇文章

    END--------------------------------

    风是透明的河流,雨是冰凉的流星。

     

  • 相关阅读:
    大厂基本功 | MySQL 三大日志 ( binlog、redo log 和 undo log ) 的作用?
    【AOP系列】8.API统一处理
    人工智能AI 生成的艺术:从文本到图像
    java计算机毕业设计高校学生党建管理系统源码+mysql数据库+系统+lw文档+部署
    Vue-计算属性、监视属性、深度监视、计算属性与监视属性对比
    164. 最大间距
    基于MySQL内核的SQL限流设计与实现|得物技术
    UE4运用C++和框架开发坦克大战教程笔记(十九)(第58~60集)完结
    DAMA-第三章(数据治理)
    进大厂必须要会的单元测试
  • 原文地址:https://www.cnblogs.com/MaiJiangDou/p/18186776