123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /**
- * 转换svg元素成React组件
- */
- const svgr = require('@svgr/core').default;
- const { optimize } = require('svgo');
- const fs = require('fs');
- const { resolve, basename, extname } = require('path');
- const camelCase = require('camelcase');
- const prettier = require('prettier');
- /**
- *
- * @param {*} entryDir 存放svg文件夹
- * @param {*} outDir 输出React组件文件夹
- * @param {*} decolorize 是否去色
- * @param {*} prefix 图标前缀
- * @param {*} suffix 图标后缀
- */
- async function build(entryDir, outDir, prefix, suffix, svgoPlugins = [], svgrOptions = {}) {
- const prettierConfig = require(resolve(__dirname, '../.prettierrc.js'));
- fs.rmdirSync(outDir, { recursive: true });
- fs.mkdirSync(outDir);
- // 读取svg文件夹下的文件,转译成React组件,并输出
- const files = fs.readdirSync(entryDir, 'utf-8');
- const indexFileName = 'index.ts';
- const batches = files.filter(f => extname(f) === '.svg').map(async file => {
- try {
- const svgFileName = basename(file, '.svg');
- const componentName = `${prefix}${camelCase(svgFileName, { pascalCase: true })}${suffix}`;
- const reactFileName = `${componentName}.tsx`;
- const svgContent = fs.readFileSync(resolve(entryDir, file), 'utf-8');
- const svgProps = {
- focusable: '{false}',
- 'aria-hidden': true
- };
- const result = optimize(svgContent, {
- plugins: svgoPlugins,
- });
- const jsxCode = await svgr(result.data, {
- plugins: ['@svgr/plugin-jsx'],
- svgProps,
- iconType: svgFileName,
- ...svgrOptions,
- });
- const formattedCode = prettier.format(jsxCode, prettierConfig);
- fs.writeFileSync(resolve(outDir, reactFileName), formattedCode, 'utf-8');
- return { fileName: reactFileName, componentName };
- } catch (error) {
- console.error(error);
- throw error;
- }
- });
- const arr = await Promise.all(batches);
- const indexFileContent = arr.map(a => `export { default as ${a.componentName} } from './${a.componentName}';`).join('\n');
- fs.writeFileSync(resolve(outDir, indexFileName), indexFileContent, 'utf-8');
- return arr;
- }
- module.exports = build;
|