一、less、css、sass不生效问题。
方案1
less或者css,sass需要用到模块化的话,后缀名全部要加上《module》如*.module.less。否则不会生效
js复制代码import styles from './index.module.less';
<div className={styles.oneApp}>生效。
vite.config.ts添加css和less
css: {
//* css模块化
modules: {
// css模块化 文件以.module.[css|less|scss]结尾
generateScopedName:'[name]__[local]___[hash:base64:5]',hashPrefix:'prefix',
},
// 预处理器配置项
preprocessorOptions: {
less: {
math: 'always',
javascriptEnabled: true,
},
},
},
方案2
npm install vite-plugin-style-modules
jsx复制代码import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import viteCssModule from 'vite-plugin-style-modules';
// 支持ESM和CommonJS两种方式引入
// const viteCssModule = require('vite-plugin-style-modules')
export default defineConfig({
plugins: [react(), viteCssModule()],
});
二、本地动态svg。
vite-plugin-svgr
安装依赖 "vite-plugin-svgr": "^3.2.0", vite.config.ts添加svgr()
js复制代码import svgr from 'vite-plugin-svgr';
plugins: [react(), svgr()]
tsconfig.json的compilerOptions加入属性
js复制代码"compilerOptions": {
"types": ["vite-plugin-svgr/client"],
渲染组件
jsx复制代码// 动态渲染图标
const IconRender: React.FC<{
icon: string;
className?: string;
}> = ({ icon, ...restIconProps }) => {
if (typeof icon !== 'string') return null; // 图标名称类型必定为string
const allIcons: any = import.meta.glob('/plugins/icons/svg/*/*.svg', { eager: true });
const Icon = allIcons[`/plugins/icons/svg/filled/${icon}.svg`].ReactComponent || null;
return <Icon {...restIconProps} />;
};
jsx复制代码<IconRender
icon={item.icon}
className={cn(styles.oneItemIcon, styles.menuIcon)}/>
其中,menuIcon的样式,注意:menuIcon里面一定要有fill:currentColor,颜色才会生效
less复制代码.oneItemIcon {
font-size: 16px;
vertical-align: top;
}
.menuIcon {
display: inline-block;
fill: currentColor;
color: inherit;
font-style: normal;
line-height: 0;
text-align: center;
text-transform: none;
vertical-align: -0.125em;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
width: 1em;
height: 1em;
}
SVG动态组件引用,vite每个本地svg可单独引用。
之前umi系统里面的用法