当前位置:首页 > 技术分析 > 正文内容

【JS 图片预加载】图片预加载之Vite插件

ruisui883个月前 (03-30)技术分析49

之前分享了webpack版本的图片预加载插件,今天分享一下Vite的图片预加载插件,功能和配置与webpack一样。

场景需求

根据目标资源优先级来生成不同的预加载标签,【preload】和【prefetch】

插件功能

  • 根据不同加载策略生成不同的Link标签
  • 支持preload和prefetch配置可选
  • 默认支持preload加载

插件实现步骤

  1. 插件入参需支持对象和数组传入
  2. 入参进行参数归一化处理
  3. 在vite插件提供的的两个钩子函数里处理构建的资源
  4. generateBundle钩子函数里获取需要预加载的资源文件
  5. transformIndexHtml函数里插入预加载标签

插件效果示例

preload


prefetch



preload & prefetch



插件配置

// 支持单一对象配置
  VitePreloadImagesPlugin({
      strategy: 'preload',
      assetDir:'src/assets/preload',
  })
// 支持数组多策略配置
   VitePreloadImagesPlugin([
      {
        strategy: 'preload',
        assetDir: 'src/assets/preload',
      },
      {
        strategy: 'prefetch',
        assetDir:'src/assets/prefetch',
      },
  ])

代码实现

import fs from 'fs';
import path from 'path';

//入参进行参数归一化处理
function getOptions(options) {
  if (!options) {
    throw new Error('options is required! options is array or object');
  }
  if (Array.isArray(options)) {
    return options;
  }
  if (typeof options === 'object') {
    const { strategy = 'preload', assetDir } = options;
    if (!assetDir) {
      throw new Error('options is  object,the assetDir is required');
    }

    return [{ strategy, assetDir, }]
  }

}

function VitePreloadImagesPlugin(options) {
  const strategies = getOptions(options) || [];

  let assets: any[] = [];
  let config;

  return {
    name: 'vite-plugin-preload-images',
    configResolved(conf) {
      // 获取解析后的配置中的 base 选项
      config = conf;
    },
    transformIndexHtml(html) {
      // console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>transformIndexHtml');
      let links: string[] = []
      strategies.forEach((item) => {
        const { strategy, assetDir } = item;

        let imageFiles: string[] = [];
        
        if (config.mode === 'production') { // 生产环境
          imageFiles = assets.filter((f) => f.originalFileName.startsWith(assetDir))
            .map(file => (config.base + file.fileName));
        } else {
          const assetPath = path.join(process.cwd(), assetDir);
          const files = fs.readdirSync(assetPath);

          imageFiles = files.filter(file => /\.(png|jpe?g|gif|svg)$/i.test(file))
            .map(file => (path.join(config.base, assetDir, file)));

        }
        imageFiles.map(file_path => {
          links.push(` \n`)
        });


      })

      return html.replace('', `${links.join('')}`);
    },
    generateBundle(_options, bundle) {
      // console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>generateBundle', );
      // 遍历 bundle 对象,找到所有的图片文件
      assets = Object.keys(bundle)
        .filter(key => /^assets(.)*\.(png|jpe?g|gif|svg)$/i.test(key))
        .map((key) => bundle[key])
    },
  };
}

export default VitePreloadImagesPlugin;

vite在dev环境时是直接使用esbuild来加载文件,因此不要特殊处理文件资源,但生产环境时,因为是使用rollup来打包构建的,因此需要对打包资源特殊处理。


目前图片预加载插件的webpack和vite版都已实现了,并发布了npm包。有兴趣的童鞋可以在npm

下载试试

npm install images-preload-plugins --save-dev
// webpack.config.js

import WebpackPreloadImagesPlugin from 'images-preload-plugins/webpack';

// vite.config.js

import VitePreloadImagesPlugin from 'images-preload-plugins/vite';

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3155.html

标签: vite svg
分享给朋友:

“【JS 图片预加载】图片预加载之Vite插件” 的相关文章

Ubuntu Linux 24.04 LTS发行版现已开放下载

IT之家 4 月 25 日消息,Ubuntu 24.04 长期支持版(LTS)“Noble Numbat” 现已发布,有需要的用户请通过官网下载发行版 ISO 镜像进行安装。Ubuntu 24.04 采用了 Linux 6.8 内核,可利用 Netplan 在桌面上配置网络连接,还配备了现代化的桌面...

Vue组件通信之props深入详解!

props 是 Vue 组件中一个很重要的概念。它是用来从父组件向子组件传递数据的。为什么需要props?这是因为在Vue中,组件是相互隔离的。每个组件都有自己的作用域,子组件无法直接访问父组件的状态或值。通过props,父组件可以将数据传递给子组件。使用props的步骤:1. 在子组件中定义pro...

快速上手React

web前端三大主流框架1、Angular大家眼里比较牛的框架,甚至有人说三大框架中只有它能称得上一个完整的框架,因为它包含的东西比较完善,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能。对于刚开始学习使用框架的小伙伴们,可以推荐这个框架,学会之后简直能颠覆之前你对前端开发的认...

GitLab-创建分支

描述分支是独立的生产线,是开发过程的一部分。分支的创建涉及以下步骤。创建一个分支步骤1-登录您的GitLab帐户,然后转到“ 项目”部分下的项目。步骤2-要创建分支,请单击“ 存储库”部分下的“ 分支”选项,然后单击“ 新建分支”按钮。步骤3-在“ 新建分支”屏幕中,输入分支的名称,然后单击“ 创建...

身体越柔软越好?刻苦拉伸可能反而不健康 | 果断练

坐下伸直膝盖,双手用力向前伸,再用力……比昨天前进了一厘米,又进步了! 这么努力地拉伸,每个人都有自己的目标,也许是身体健康、线条柔美、放松肌肉、体测满分,也可能为了随时劈个叉,享受一片惊呼。 不过,身体柔软,可以享受到灵活的福利,也可能付出不稳定的代价,并不是越刻苦拉伸越好。太硬或者太软,都不安全...

Vue真是太好了 壹万多字的Vue知识点 超详细!

1??、Vue和其他两大框架的区别Angular 学习成本太高React 代码可读性差Vue 学习成本较低 很容易上手VUE官方: https://cn.vuejs.org/v2/guide/comparison.html?2??、Vue是什么Vue是一套用于构建用户界面的渐进式框架 "前端...