vite图片处理

文章讲述了作者在从webpack迁移到vite时遇到的问题,尝试使用require插件导致打包速度变慢。作者意识到vite和webpack的编译方式不同,于是改用vite内置的import.meta.globEager方法,创建了一个插件来转换require语法,并提供了一个全局方法$getImgSrc来动态获取图片资源。这种方法提高了构建效率,遵循了使用框架原生功能的原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

踩坑点:之前在webpack中引用方式是require,后面我就一直想用require插件,然后就在网上查到了下面的方法,就是这个导致打包速度很久,后来我想了想,webpack和vite的编译方式都不一样啊,嗯,这不强扭的瓜不甜。后来我就用了vite内部的import.meta.globEager,写了一个getImgSrc方法,通过inject引入。

主要问题点:解决打包速度,尽量用框架自带的方法,不要想着以前的。就像人总会变。

写一个插件

export default function requirePlugin() {

    return {

      // 插件名称

      name: "vite-plugin-vue-requireToUrlPlugin",

      // 默认值post:在 Vite 核心插件之后调用该插件,pre:在 Vite 核心插件之前调用该插件

      // enforce: "post",

      // 代码转译,这个函数的功能类似于 "webpack" 的 "loader"

      transform(code, id, opt) {

        const vueRE = /\.vue$/;

        const require = /require/g;

       

        // 过滤掉非目标文件

        if (!vueRE.test(id) || !require.test(code)) return code;

        // 匹配 require() 内的内容

        const requireRegex = /require\((.*?)\)/g;

        // 将 require() 内的内容替换为 new URL 的写法

        const finalCode = code.replace(requireRegex, "new URL($1,import.meta.url).href");

         

        // 将转换后的代码返回

        return finalCode;

      },

    };

  }

引用

import requireToUrlPlugin from './plugins/requireToUrlPlugin'; 
export default defineConfig({
  base: process.env.NODE_ENV === 'production' ? './' : '/',
  plugins: [
    vue(),
  ],
  css: {
    preprocessorOptions: {
      // 全局样式引入
      scss: {
        additionalData: '@import "./src/theme/element.scss";@import "./src/theme/main.scss";',
        javascriptEnabled: true,
      }
    }
  },
  resolve: {
    alias: {
      "@": path.join(__dirname, "./src"),
    },
  },
  build:{
    minify: 'terser',
    productionSouceMap: false,
    rollupOptions: {
      output: {
        chunkFileNames: 'static/js/[name]-[hash].js',
        entryFileNames: 'static/js/[name]-[hash].js',
        assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    },
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true,
      },
    }
  }
  
})
 

1.在plugins/elementPlus.js中

app.provide('$getImgSrc',(name)=>{

      if (typeof name === 'undefined') return 'error.png'

      const modules = import.meta.globEager('/src/**/*.{png,svg,jpg,jpeg}')

      if (modules[name]) return modules[name].default

    })

2.在项目中引用

<template>

</template>
<script>
import { reactive, toRefs, defineComponent, onMounted, inject } from 'vue';
export default defineComponent({
    components: {},
    setup() {
        const getImgSrc = inject('$getImgSrc')
        const state = reactive({
            app:[
                {
                    icon: getImgSrc('/src/assets/homeIcon/01.png'),
                    txt: '目标职责'    
                },
                {
                    icon: getImgSrc('/src/assets/homeIcon/02.png'),
                    txt: '制度化管理'
                },
                {
                    icon: getImgSrc('/src/assets/homeIcon/03.png'),
                    txt: '教育培训'
                },
                {
                    icon: getImgSrc('/src/assets/homeIcon/04.png'),
                    txt: '事故管理'
                },
                {
                    icon: getImgSrc('/src/assets/homeIcon/05.png'),
                    txt: '应急管理'
                },
                {
                    icon: getImgSrc('/src/assets/homeIcon/06.png'),
                    txt: '数据中心'
                },
                {
                    icon: getImgSrc('/src/assets/homeIcon/07.png'),
                    txt: '试题库'
                },
            ],
        });
        onMounted(()=>{});
        return {
            ...toRefs(state),
            getImgSrc,
        };
    },
    methods:{
        clickExamine(v){
            this.examineRef.open(v);
        }
    }
});
</script>
<style scoped lang="scss">
</style>
  

### 如何在 Vite 中配置图片打包 在现代前端开发中,Vite 是一种快速高效的构建工具。对于图片等静态资源的处理,Vite 提供了一套简洁而强大的机制来实现自动化的打包和加载。 #### 1. 图片路径解析方式 在 Vite 中,可以通过 `import` 或者动态导入的方式引入本地图片文件。这种方式会触发 Vite 的内置插件(如 `rollup-plugin-url` 和 `esbuild`),从而将图片转换为模块形式并进行打包[^2]。 ```javascript // 示例:通过 import 导入图片 import logo from './assets/logo.png'; console.log(logo); // 输出打包后的图片路径 ``` 当使用上述方法时,Vite 默认会对小于指定大小(默认 4KB)的图片执行 Base64 编码嵌入到 JavaScript 文件中;如果超过该阈值,则将其作为独立文件输出至 dist/assets 目录下,并返回对应的相对路径。 #### 2. 自定义图片打包行为 为了满足特定需求,可以调整 Vite 对于图片资产的处理逻辑。这主要涉及修改项目的 `vite.config.js` 配置文件中的 `assetsInclude` 属性以及设置合适的选项参数: - **Base64 转换条件** 如果希望更改图片转成 base64 的临界尺寸,可以在 `vite.config.js` 设置如下内容: ```javascript export default { build: { assetsInlineLimit: 8 * 1024, // 将最大限制设为 8 KB (单位字节) }, }; ``` - **支持更多类型的媒体文件** 若要让 Vite 处理其他格式的多媒体素材(比如 SVG、WebP 等),需扩展其识别范围: ```javascript export default { server: {}, optimizeDeps: {}, resolve: { alias: {}, // 别名映射表 }, assetsInclude: ['**/*.svg', '**/*.webp'], // 添加额外的支持类型 }; ``` #### 3. 动态引用本地图片的方法 除了静态导入外,在某些场景下可能还需要根据变量或者表达式的计算结果去获取不同的图片源链接。此时可以直接利用模板字符串拼接完整的 URL 地址: ```html <template> <img :src="getImageUrl('example')" alt="Example Image"> </template> <script setup lang="ts"> function getImageUrl(name:string):string{ return new URL(`/src/images/${name}.jpg`, import.meta.url).href; } </script> ``` 以上代码片段展示了如何借助 Vue SFC 结构内的 `<script setup>` 定义辅助函数用于生成正确的资源定位符(URL)[^5]。 --- ### 总结 综上所述,Vite 在处理图片类静态资源方面提供了灵活多样的解决方案。无论是采用同步还是异步的形式加载所需数据,都能轻松应对各种复杂的业务诉求。与此同时,合理运用官方文档推荐的最佳实践能够进一步提升工作效率与产品质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值