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

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

ruisui881个月前 (03-30)技术分析17

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

2024前端面试真题之—VUE篇

添加图片注释,不超过 140 字(可选)1.vue的生命周期有哪些及每个生命周期做了什么? beforeCreate是new Vue()之后触发的第一个钩子,在当前阶段data、methods、computed以及watch上的数据和方法都不能被访问。 created在实例创建完成后发生,当前阶段已...

vue 3 学习笔记 (八)——provide 和 inject 用法及原理

在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传很多次,会很麻烦。像这种情况,可以使用 provide 和 inject 解决这种问题,不论组件嵌套...

如何在GitLab上回退指定版本的代码?GitLab回退指定版本问题分析

在Git中,回退到指定版本并不是删除或撤销之前的提交,而是创建一个新的提交,该提交包含指定版本的内容。这意味着您需要将当前代码更改与指定版本之间的差异进行比较,并将其合并到一个新的提交中。如果您没有更新本地代码,并且您希望将 GitLab 仓库回退到指定版本,您可以使用以下命令:git fetchg...

编码 10000 个小时后,开发者悟了:“不要急于发布!”

【CSDN 编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理:慢即是快,重视架构设计和代码质量,确保每一行代码都经得起时间的考验。作者 | Sotiris Ko...

HTML5学习笔记三:HTML5语法规则

1.标签要小写2.属性值可加可不加””或”3.可以省略某些标签 html body head tbody4.可以省略某些结束标签 tr td li例:显示效果:5.单标签不用加结束标签img input6.废除的标签font center big7.新添加的标签将在下一HTML5学习笔记中重点阐述。...

html5迁移到微信小程序的 方法 亲测可用

切图网习惯于在做小程序之前先做成html5+vuejs的形式,因为html5切图是我们比较熟悉的方式,而且有专业的工具 以及浏览器调试也会更加的方便 灵活,效率高,而且html5的方式可以方便预览看效果,方便调整,当html5页面做好确认没问题以后 再转成小程序或者官方出品wepy的方式,这个时候就...