概述
vite2 vue3 加载svg 图片
import { readFileSync, readdirSync } from 'fs'
const path = require('path')
const svgTitle = /<svg([^>+].*?)>/
const clearHeightWidth = /(width|height)="([^>+].*?)"/g
const hasViewBox = /(viewBox="[^>+].*?")/g
const clearReturn = /(r)|(n)/g
/**
* @Date 2021/11/22
* @Author Varus
* @Description: 找到svg 图片并且替换文件信息
* @param dir svg 目录
* @param idPreFix svg symbol id
*
*/
function findSvgFile(dir, idPreFix) {
const svgRes = []
const dirEntries = readdirSync(dir, {
withFileTypes: true
})
for (const dirent of dirEntries) {
if (dirent.isDirectory()) {
svgRes.push(...findSvgFile(path.join(dir, dirent.name)))
} else {
const svg = readFileSync(path.join(dir, dirent.name))
.toString()
.replace(clearReturn, '')
.replace(svgTitle, ($1, $2) => {
let width = 0
let height = 0
let content = $2.replace(
clearHeightWidth,
(s1, s2, s3) => {
s3 = s3.replace('px', '')
if (s2 === 'width') {
width = s3
} else if (s2 === 'height') {
height = s3
}
return ''
}
)
if (!hasViewBox.test($2)) {
content += `viewBox="0 0 ${width} ${height}"`
}
return `<symbol id="${idPreFix}-${dirent.name.replace(
'.svg',
''
)}" ${content}>`
})
.replace('</svg>', '</symbol>')
svgRes.push(svg)
}
}
return svgRes
}
/**
* @Date 2021/11/18
* @Author Varus
* @Description: 加载svg 文件
*
*/
export default function (path, prefix = 'icon') {
if (path === '') return
const res = findSvgFile(path, prefix)
// console.log(res)
return {
name: 'svg-transform',
// vite 插件 直接替换 html 页签内容
transformIndexHtml(html) {
return html.replace(
'<body>',
`
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">
${res.join('')}
</svg>
`
)
}
}
}
引入
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import svgLoader from './src/plugins/svg-loader'
const path = require('path')
function resolve (dir) {
return path.join(__dirname, dir)
}
const setting = require('./src/setting.js')
export default defineConfig({
resolve: {
alias:{
'@': path.resolve(__dirname, "src")
},
},
server: {
fs: {
strict: false
},
},
plugins: [vue(), svgLoader(resolve('src/icons/svg/'))]
})
引用以下以下问题ISSUE
相关的git :https://github.com/JetBrains/svg-sprite-loader/issues/434
最后
以上就是积极高山为你收集整理的vite svg 插件的全部内容,希望文章能够帮你解决vite svg 插件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复