Vue学习-1(18)svgo-loader删除svg自带fill

  • svg fill里有预设颜色,active不能生效
    image-20201230205819067

  • 自动删fill颜色
    image-20201230210137283

  • 加个loader
    image-20201230210031684

svgo-loader
image-20201230210116041

yarn add --dev svgo-loader
  • svg-sprite-loader-mod
Vue3 项目中使用 `svg-sprite-loader` 可以实现 SVG 图标的集中管理与高效复用,尤其适用于图标数量较多的项目。以下是一个完整的配置指南和使用方法。 ### 配置步骤 1. **安装依赖** 首先需要安装 `svg-sprite-loader` 和 `svgo-loader`(用于优化 SVG 文件): ```bash npm install svg-sprite-loader svgo-loader --save-dev ``` 2. **创建 SVG 图标目录** 在项目 `src` 目录下创建一个专门存放 SVG 图标的文件夹,例如 `icons/svg`,并将所有 SVG 图标文件放入该目录中 [^3]。 3. **配置 `vite.config.js` 或 `webpack.config.js`** 如果你使用的是 Vite 构建工具,可以在 `vite.config.js` 中添加如下配置;如果是 Webpack5,则修改 `webpack.config.js`: - **Vite 配置示例:** ```js import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import path from 'path'; export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': path.resolve(__dirname, './src'), }, }, build: { assetsDir: 'static', }, optimizeDeps: { include: ['svg-sprite-loader'], }, css: { preprocessorOptions: { scss: {}, }, }, server: { port: 3000, }, configureWebpack: { module: { rules: [ { test: /\.svg$/, loader: 'svg-sprite-loader', include: [path.resolve(__dirname, 'src/icons')], options: { symbolId: 'icon-[name]', }, }, { test: /\.svg$/, loader: 'svgo-loader', exclude: [path.resolve(__dirname, 'src/icons')], options: { plugins: [{ removeTitle: true }, { convertColors: { currentColor: '#000' } }], }, }, ], }, }, }); ``` - **Webpack 配置示例:** ```js const path = require('path'); module.exports = { entry: './src/main.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, module: { rules: [ { test: /\.svg$/, use: [ { loader: 'svg-sprite-loader', options: { symbolId: 'icon-[name]', }, }, { loader: 'svgo-loader', options: { plugins: [{ removeTitle: true }, { convertColors: { currentColor: '#000' } }], }, }, ], include: [path.resolve(__dirname, 'src/icons')], }, ], }, }; ``` 4. **封装 SVG 图标组件** 创建一个全局组件 `SvgIcon.vue` 来统一调用 SVG 图标: ```vue <template> <svg :width="size" :height="size" viewBox="0 0 24 24"> <path :d="path" :fill="color" /> </svg> </template> <script> export default { name: 'SvgIcon', props: { name: { type: String, required: true, }, color: { type: String, default: '#333', }, size: { type: [String, Number], default: 24, }, }, data() { return { path: '', }; }, mounted() { this.loadSvg(); }, methods: { async loadSvg() { const res = await import(`@/icons/${this.name}.svg?raw`); const parser = new DOMParser(); const doc = parser.parseFromString(res.default, 'image/svg+xml'); const pathElement = doc.querySelector('path'); if (pathElement) { this.path = pathElement.getAttribute('d'); } }, }, }; </script> ``` 5. **全局注册组件** 在 `main.js` 中注册 `SvgIcon` 组件为全局组件: ```js import { createApp } from 'vue'; import App from './App.vue'; import SvgIcon from './components/SvgIcon.vue'; const app = createApp(App); app.component('SvgIcon', SvgIcon); app.mount('#app'); ``` 6. **使用方式** 在模板中通过传入图标名称、颜色和尺寸来使用 SVG 图标: ```vue <template> <div> <SvgIcon name="home" color="#f00" size="32" /> </div> </template> ``` ### 注意事项 - 确保 SVG 文件命名规范且没有多余样式,避免加载时出现问题。 - 使用 `symbolId` 选项可以自定义生成的 SVG 符号 ID,便于在 HTML 中引用。 - 若项目中使用 TypeScript,需确保 SVG 文件导入方式支持类型声明 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值