likes
comments
collection
share

vite插件之svgrsvgr插件 1.根据id入参过滤出svg资源 2.读取svg文件内容 3.利用@svgr/cor

作者站长头像
站长
· 阅读数 28

svgr插件

  • 1.根据id入参过滤出svg资源
  • 2.读取svg文件内容
  • 3.利用@svgr/core将svg转为React组件代码
  • 5.利用esbuild,将组件中的jsx代码转移为浏览器可运行的代码
import { Plugin } from 'vite';
import * as fs from 'fs';
import * as resolve from 'resolve';
import { transformWithEsbuild } from 'vite';

interface SvgrOptions {
  // svg 资源模块默认导出,url或者组件
  defaultExport: 'url' | 'component';
}

export default function viteSvgrPlugin(options: SvgrOptions) {
  const { defaultExport = 'url' } = options;
  return {
    name: 'vite-plugin-svgr',
    async transform(code, id) {
      // 1.根据id入参过滤出svg资源
      if (!id.includes('.svg')) {
        return code;
      }
      // console.log('id2',id)

      const svgrTransform = require('@svgr/core').transform;

      // 解析esbuild的路径,后续转移为jsx会用到,我们这里拿vite中的esbuild即可
      // const esbuildPackagePath = resolve.sync('esbuild',{
      //   basedir:require.resolve('vite')
      // })
      // const esbuild = require(esbuildPackagePath);

      // 2.读取svg文件内容
      const svg = await fs.promises.readFile(id, 'utf8');
      const { default: jsx } = await import('@svgr/plugin-jsx');
      //3.利用@svgr/core将svg转为React组件代码
      const svgrResult = await svgrTransform(
        svg,
        {},
        {
          // componentName:"ReactComponent"
          caller: {
            defaultPlugins: [jsx],
          },
        }
      );

      // 4.处理为默认的导出为url的情况
      let componentCode = svgrResult;
      if (defaultExport === 'url') {
        // 加上vite默认的 export default 资源路径
        componentCode += code;
        componentCode = componentCode.replace(
          'export default ReactComponent',
          'export { ReactComponent }'
        );
      }
      // 5.利用esbuild,将组件中的jsx代码转移为浏览器可运行的代码
      const result = await transformWithEsbuild(componentCode, id, {
        loader: 'jsx',
      });
      console.log('result', result.code);
      return {
        code: result.code,
        map: null,
      };
    },
  };
}

使用直接使用引入到vite-config.ts中即可

转载自:https://juejin.cn/post/7417310664220737586
评论
请登录