赞
踩
1 )通用的 cdn 前缀
const isProduction = process.env.NODE_ENV === 'production';
// 填入项目的 CDN 域名地址
const CDN_URL = 'https://xxx.cdn.com';
// 具体配置
{
base: isProduction ? CDN_URL: '/'
}
NODE_ENV=development
和 NODE_ENV=production
pnpm run build
打包后,可见<link rel="icon" type="image/svg+xml" href="https://xxx.cdn.com/assets/vite-DcBtz0py.svg" />
<script type="module" crossorigin src="https://xxx.cdn.com/assets/index-xyjhVKfF.js"></script>
<link rel="stylesheet" crossorigin href="https://xxx.cdn.com/assets/index-DiwrgTda.css">
2 ) 图片托管到其他地址
VITE_IMG_BASE_URL=https://image-cdn.com
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_TITLE: string;
// 自定义的环境变量
readonly VITE_IMG_BASE_URL: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
VITE_
开头,如 VITE_IMG_BASE_URL
<img src={new URL('./logo.png', import.meta.env.VITE_IMG_BASE_URL).href} />
src: new URL("./logo.png", "https://image-cdn.com").href
3 ) 打包成单文件或作为base64文件内联
build.assetsInlineLimit
自行配置,如下代码所示// vite.config.ts
{
build: {
// 8 KB
assetsInlineLimit: 8 * 1024
}
}
4 ) 图片的压缩
imagemin
,作为一个底层的压缩工具image-webpack-loader
vite-plugin-imagemin
,首先让我们来安装它
pnpm i vite-plugin-imagemin -D
import viteImagemin from 'vite-plugin-imagemin'; // 下面是具体的配置 { plugins: [ // 忽略前面的插件 viteImagemin({ // 无损压缩配置,无损压缩下图片质量不会变差 optipng: { optimizationLevel: 7 }, // 有损压缩配置,有损压缩下图片质量可能会变差 pngquant: { quality: [0.8, 0.9], }, // svg 优化 svgo: { plugins: [ { name: 'removeViewBox' }, { name: 'removeEmptyAttrs', active: false } ] } }) ] }
pnpm run build
可以验证图片压缩非常明显5 )雪碧图减少图片的HTTP的请求
5.1 没有优化前
import Logo1 from '@assets/icons/logo-1.svg';
import Logo2 from '@assets/icons/logo-2.svg';
import Logo3 from '@assets/icons/logo-3.svg';
import Logo4 from '@assets/icons/logo-4.svg';
import Logo5 from '@assets/icons/logo-5.svg';
import.meta.glob
的语法糖来解决这种批量导入的问const icons = import.meta.glob('../../assets/icons/logo-*.svg');
import.meta.globEager
const icons = import.meta.globEager('../../assets/icons/logo-*.svg');
5.2 使用雪碧图优化
vite-plugin-svg-icons
来实现这个方案,首先安装一下这个插件
pnpm i vite-plugin-svg-icons -D
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
// 下面是具体的配置信息
{
plugins: [
// 省略其它插件
createSvgIconsPlugin({
iconDirs: [path.join(__dirname, 'src/assets/icons')]
})
]
}
// SvgIcon/index.tsx export interface SvgIconProps { name?: string; prefix: string; color: string; [key: string]: string; } export default function SvgIcon({ name, prefix = 'icon', color = '#333', ...props }: SvgIconProps) { const symbolId = `#${prefix}-${name}`; return ( <svg {...props} aria-hidden="true"> <use href={symbolId} fill={color} /> </svg> ); }
const icons = import.meta.globEager('../../assets/icons/logo-*.svg');
const iconUrls = Object.values(icons).map((mod) => {
// 如 ../../assets/icons/logo-1.svg -> logo-1
const fileName = mod.default.split('/').pop();
const [svgName] = fileName.split('.');
return svgName;
});
// 渲染 svg 组件
{iconUrls.map((item) => (
<SvgIcon name={item} key={item} width="50" height="50" />
))}
import 'virtual:svg-icons-register';
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="icon-home" viewBox="0 0 24 24">
<!-- Home 图标的内容 -->
<path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/>
</symbol>
<symbol id="icon-search" viewBox="0 0 24 24">
<!-- Search 图标的内容 -->
<path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
</symbol>
<!-- 更多图标... -->
</svg>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。