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

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

ruisui884周前 (03-30)技术分析15

之前分享了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插件” 的相关文章

vue项目-父页面数据变化使子页面更新的几种情况

当操作页面时候,特别是增删改操作之后,数据会有所改变,这个时候我们希望组件中的数据要和最新数据一致,就需要重新更新渲染。以下是针对几种不同情况下方式:一.子页面调用接口后重新渲染1.使用ref方式父组件中用ref=“xxx” 来声明子组件,然后通过在父组件值改变的地方来调用子组件中的方法this.$...

「2022」打算跳槽涨薪,必问面试题及答案——VUE篇

1、为什么选择VUE,解决了什么问题?vue.js 正如官网所说的,是一套构建用户界面的渐进式框架。与其它重量级框架不同的是,vue 被设计为可以自底向上逐层应用。vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另外一方面,当与现代化工具链以及各种支持类库结合使用时,vu...

Gitlab之间进行同步备份

目前,我们公司有两个研发团队,分别在北京和武汉,考虑到访问速度的问题,原有武汉的研发环境在近端部署。也就是北京和武汉分别有两套独立的研发管理环境,虽然这解决了近端访问速度的问题,但是管理上较为分散,比如研发环境备份和恢复就是最重要的问题之一。最近,处于对安全性和合规性的考虑,希望将北京和武汉的源代码...

有效地简化导航-Part 1:信息架构

「四步走」——理想的导航系统要做一个可用的导航系统,网页设计师必须按顺序回答以下4个问题:1. 如何组织内容?2. 如何解释导航的选项?3. 哪种导航菜单最适合容纳这些选项?4. 如何设计导航菜单?前两个问题关注构建和便签内容,通常称为信息架构。信息架构师通常用网站地图(site map diagr...

最快清除数组空值?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!大家好,我是大澈!本文约 600+ 字,整篇阅读约需 1 分钟。今天分享一段优质 JS 代码片段,用最简洁的代码清除了数组中的空值。老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!const arr...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing 发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。早在2021年,腾讯的 TDesing 刚发布不久,我就写了一篇简短的文章来介绍,当时主要关注的是 TDesign 的 Vue 组件库和用来搭建 admin 后台系统的实用性。虽然当时看起来不错,但还处于测试版,...