Webpack 5中使用svg-chunk-webpack-plugin为SVG ID添加前缀的方法
解决svg-chunk-webpack-plugin雪碧图ID前缀不生效的问题
问题根源
你混淆了两个不同的ID处理环节:
- SVGO的
prefixIds插件负责给SVG文件内部的元素ID(比如<clipPath id="xxx">、<path id="yyy">这类)添加前缀 - svg-chunk-webpack-plugin本身会在打包时,给雪碧图中每个
<symbol>的id赋值,这个ID默认是SVG文件名,不受SVGO配置影响
所以你当前的配置只处理了SVG内部元素的ID,并没有修改雪碧图symbol的ID。
正确解决方案
要给雪碧图的symbol ID添加自定义前缀,需要使用svg-chunk-webpack-plugin提供的symbolId配置项,而不是依赖SVGO:
修改webpack.config.js中的插件配置
new SvgChunkWebpackPlugin({ filename: 'icons.svg', generateSpritesManifest: true, generateSpritesPreview: true, // 自定义symbol的ID格式,[name]会替换为原SVG文件名 symbolId: 'inm-icon-[name]' })
(可选)同时处理SVG内部元素ID
如果你还需要给SVG内部的元素ID也添加前缀,确保SVGO的prefixIds配置正确,注意要开启prefixIds参数,同时可按需设置prefixClassNames避免样式冲突:
修改svgo.config.js:
export default { multipass: true, plugins: [ { name: 'preset-default', params: { overrides: { inlineStyles: { onlyMatchedOnce: false }, removeViewBox: false, removeDoctype: false } } }, { name: 'convertStyleToAttrs' }, { name: 'prefixIds', params: { prefix: 'inm-icon', // 开启对内部元素ID的前缀处理 prefixIds: true, // 可选:给SVG内部的类名也添加前缀 prefixClassNames: true } } ] };
验证结果
重新执行webpack打包后:
- 雪碧图中的每个
<symbol>的id会变为inm-icon-原文件名 - SVG内部的元素ID(如clipPath)也会被添加
inm-icon-前缀(如果开启了可选配置)
内容的提问来源于stack exchange,提问作者Mitesh Agrawal
相关产品推荐
相关产品推荐

