为方便引入svg,把所有的svg,node生成一个js

1,297

生成svg模版

/* 因为要在icon组件中使用到svgs文件,所以直接将文件写到icon组件目录下
  框架开发时候写入到src/lib/icon 目录底下
  业务开发的时候写入到node_modules/snk-mobile/src/lib/icon目录底下
  所以先判断是否存在路径 然后再写入
  这样就方便icon组件进行引用
*/

const path = require('path');
const fs = require('fs');

const svgDir = path.resolve(__dirname, '../../assets/svgs');

function startWirteSvgFile(successCallBack) {
  // 生成js文件
  console.log('start create svg file!');
  readSvgs().then((data) => {
    const svgFile = `export default${JSON.stringify(Object.assign.apply(this, data))}`;
    const pathForFrameWork = path.resolve(__dirname, '../../assets');
    const pathForBusiness = path.resolve(__dirname, '../../assets');

    writeSvgConfigIntoFile(pathForBusiness, svgFile, (isScuccess) => {
      if (!isScuccess) {
        writeSvgConfigIntoFile(pathForFrameWork, svgFile, (re, err) => {
          if (re) {
            successCallBack();
          } else {
            console.error(err);
            console.error('svg创建失败!');
          }
        });
      } else {
        successCallBack();
      }
    });
  }).catch((err) => {
    console.error(err);
    console.error('svg创建失败!');
  });
}

function writeSvgConfigIntoFile(pathUrl, svgFile, cb) {
  fs.exists(pathUrl, (isExists) => {
    if (isExists) {
      fs.writeFile(`${pathUrl}/svgs.js`, svgFile, (err) => {
        if (err) {
          cb && cb(false, err);
        } else {
          console.log('svg创建成功!');
          cb && cb(true);
        }
      });
    } else {
      cb && cb(false);
    }
  });
}

// 读取单个文件
function readfile(filename) {
  return new Promise((resolve, reject) => {
    fs.readFile(path.join(svgDir, filename), 'utf8', (err, data) => {
      data = data.replace(/<\?xml.*?\?>|<!--.*?-->|<path fill='#[a-zA-Z0-9]'|<!DOCTYPE.*?>/g, '');
      data = data.replace(/<path fill="#[a-zA-Z0-9]+"|<path/g, '<path fill="#ef473a"');
      data = data.replace(/class/g, 'c');
      if (err) reject(err);
      resolve({
        [filename.slice(0, filename.lastIndexOf('.'))]: data,
      });
    });
  });
}

// 读取SVG文件夹下所有svg
function readSvgs() {
  return new Promise((resolve, reject) => {
    fs.readdir(svgDir, (err, files) => {
      if (err) reject(err);
      Promise.all(files.map(filename => readfile(filename)))
        .then(data => resolve(data))
        .catch(() => reject(err));
    });
  });
}
startWirteSvgFile()