将css文件中的px转化为rem

pxToRem.js

/**
 * 使用方式:
 * 与引入的文件放在同一目录下进行引用配置,执行:node (定义的文件)
 */
const fs = require('fs')
const path = require('path')
/**
 * entry:入口文件路径 type:Strng
 * pxtopx:以倍数转化px数值,计算方式为除法 ,type:Boolean
 * pxtorem:以倍数转化rem数值,计算方式为除法 ,type:Boolean
 * baseNumber:指定除数的基数,type:Number
 * includeFileTypeList:指定包含的文件类型后缀,type:Array
 * excludeFile:不包括的文件,可以是路径,type:Array
 */
class pxToRemUtil {
  /**
   * @type {entry: String, pxtopx: boolean, pxtorem: boolean, baseNumber: number, includeFileTypeList: Array, excludeFile: Array}
   * @param {初始化参数} option
   */
  constructor(option) {
    if (!option) {
      this._logError('请传入配置参数')
      process.exit(0)
    }
    if (!option.entry || !option.entry.trim()) {
      this._logError('未指定入口文件,请指定')
      process.exit(0)
    }
    if (!option.pxtopx && !option.pxtorem) {
      this._logError('未指定pxtopx或者pxtorem,检查配置')
      process.exit(0)
    }
    if (!option.baseNumber) {
      this._logError('未指定基数')
      process.exit(0)
    }
    if (option.pxtopx && option.pxtorem) {
      this._logError('未指定pxtopx或者pxtorem错误,检查配置')
      process.exit(0)
    }

    this._beginPath = option.entry
    this._pxtopx = option.pxtopx
    this._pxtorem = option.pxtorem
    if (this._pxtopx) this._unit = 'px'
    if (this._pxtorem) this._unit = 'rem'
    this.BASENUMBER = option.baseNumber
    this._includeFileTypeList = option.includeFileTypeList || []
    this._excludeFile = option.excludeFile || []
    this._timer = null
    this._fileNumber = 0
    this._writeFileTimer = null
    this._arr = []
    this.getRegFile()
    this.sureHandler()
  }
  getRegFile() {
    let _strconnect = ''
    this._includeFileTypeList.forEach(item => {
      _strconnect += `(${item})$|`
    })
    _strconnect = _strconnect.length > 1 ? _strconnect.slice(0, _strconnect.length - 1) : ''
    _strconnect = this._includeFileTypeList.length > 0 ? '^.+' + _strconnect : ''
    this.regFile = new RegExp(_strconnect)
  }
  sureHandler() {
    process.stdin.setEncoding('utf8')
    process.stdout.write('此操作不可逆,确认是否进行(Y/n)?')
    process.stdin.on('data', input => {
      input = input.toString().trim()
      if (['Y', 'y', 'YES', 'yes'].indexOf(input) > -1 || !Boolean(input)) {
        this.fileDisplay(this._beginPath, this.changeFile.bind(this))
      }
      if (['N', 'n', 'NO', 'no'].indexOf(input) > -1) process.exit(0)
    })
  }
  fileDisplay(url, cb) {
    const filePath = path.resolve(url)
    fs.readdir(filePath, (err, files) => {
      if (err) return console.error('Error:(spec)', err)
      files.forEach(filename => {
        const filedir = path.join(filePath, filename)
        fs.stat(filedir, (eror, stats) => {
          if (eror) return console.error('Error:(spec)', err)
          const isFile = stats.isFile()
          const isDir = stats.isDirectory()
          if (isFile) {
            let exclude = this._excludeFile.some(item => {
              return filedir.includes(item)
            })
            let checkIsImage = filedir.match(/\.(png|jpg|gif|jpeg|webp|ttf|svg)$/)
            if (filedir.match(this.regFile) && !exclude && !checkIsImage) {
              this._arr.push({
                modified: false,
                path: filedir.replace(__dirname, '').replace(/\\/gim, '/'),
              })
            }
            if (this._timer) clearTimeout(this._timer)
            this._timer = setTimeout(() => cb && cb(this._arr), 200)
          }
          // 如果是文件夹
          if (isDir) this.fileDisplay(filedir, cb)
        })
      })
    })
  }
  changeFile() {
    /**重新写入文件 替换掉文件的px数值 */
    const self = this
    this._arr.forEach(item => {
      fs.readFile('.' + item.path, (err, data) => {
        let result = data.toString()
        var reg = /(\-|- |\+ )?([0-9]*\.[0-9]*|\d)+(px\)?)/gi
        let newStr = result.replace(reg, function (_x) {
          item.modified = true
          let n = _x.search(/px\)/) >= 0 ? 'px\\)' : 'px'
          let reg = new RegExp(eval(`/(- |\\+ )+([0-9]*\\.[0-9]*|\\d)+${n}/gi`))
          if (_x.match(reg)) {
            let C = ''
            if (_x.search(/\+/) >= 0) {
              C = '+'
            } else if (_x.search(/\-/) >= 0) {
              C = '-'
            }
            if (_x.search(/px\)/)) _x = _x.replace(/(- |\+ )/, '').replace(/px/i, '')
            if (_x.search(/\)/) >= 0) return `${C} ` + parseFloat(_x) / self.BASENUMBER + `${self._unit})`
            if (!_x.search(/\)/) >= 0) return `${C} ` + parseFloat(_x) / self.BASENUMBER + `${self._unit}`
          }
          return parseFloat(_x) / self.BASENUMBER + `${self._unit}`
        })
        const opt = {
          flag: 'w',
        }
        if (newStr) {
          fs.writeFile('.' + item.path, newStr, opt, (err, success) => {
            if (this._writeFileTimer) clearTimeout(this._writeFileTimer)
            this._writeFileTimer = setTimeout(() => {
              this._logSuccess(self._fileNumber + ' 个文件写入成功')
              process.exit(0)
            }, 200)
            if (err) {
              this._logError(err)
              process.exit(0)
            } else {
              if (item.modified) {
                self._fileNumber++
                this._logSuccess('更改并写入:' + item.path.slice(1) + ' 成功')
              }
            }
          })
        }
      })
    })
  }
  _logSuccess(str) {
    console.log('\x1B[32m%s\x1B[39m', str)
  }
  _logError(str) {
    console.log('\x1B[31m%s\x1B[39m', str)
  }
}
module.exports = pxToRemUtil 

execFile.js

//将上面文件引入
let pxToRemUtil = require('./pxToRemUtil')
 /**
  * 接受的参数含义
  * entry:入口文件路径 type:Strng
  * pxtopx:以倍数转化px数值,计算方式为除法 ,type:Boolean
  * pxtorem:以倍数转化rem数值,计算方式为除法 ,type:Boolean
  * baseNumber:指定除数的基数,type:Number
  * includeFileTypeList:指定包含的文件类型后缀,type:Array
  * excludeFile:不包括的文件,可以是路径,type:Array
  */
new pxToRemUtil({
  entry:'./',//需要修改的文件入口
  pxtorem:true,//设置为px转rem
  baseNumber:100,//将整体的数值除100,例如10px变成0.1rem
  excludeFile:[''],//可选值,排除的文件名
  includeFileTypeList:['.vue','.css']//可选值,包含改那些文件的后缀list
})

然后再控制台中执行:

node execFile.js

`postcss-pxtorem` 是一个用于将 CSS px 单位换为 rem 单位的 PostCSS 插件。它可以帮助实现响应式布局和字体大小的适配。 要使用 `postcss-pxtorem` 将字体大小换为 rem 单位,你需要按照以下步骤进行配置: 1. 安装 `postcss-pxtorem`:在项目运行以下命令安装 `postcss-pxtorem`: ``` npm install postcss-pxtorem --save-dev ``` 2. 创建 PostCSS 配置文件:在项目根目录下创建一个 `postcss.config.js` 文件,并添加以下内容: ```javascript module.exports = { plugins: { 'postcss-pxtorem': { rootValue: 16, // 设置根元素的字体大小,通常为网页的基准字体大小 propList: ['font-size'], // 需要换的属性列表,这里只包含字体大小 selectorBlackList: [], // 不需要换的选择器列表 }, }, }; ``` 请根据你的具体需求调整 `rootValue` 的值,它表示根元素的字体大小,一般情况下为网页的基准字体大小,通常是 `16px`。 3. 使用 PostCSS:在构建过程使用 PostCSS 处理 CSS 文件,并应用 `postcss-pxtorem` 插件。具体的配置方法取决于你使用的构建工具(如 webpack 或 gulp)。 例如,在 webpack 配置 PostCSS 的方法如下: - 安装必要的 webpack loader: ``` npm install postcss-loader --save-dev ``` - 在 webpack 配置文件添加 PostCSS loader: ```javascript module.exports = { // ... module: { rules: [ // ... { test: /\.css$/, use: [ 'style-loader', 'css-loader', 'postcss-loader', ], }, ], }, // ... }; ``` 请确保在你的构建工具正确配置了 PostCSS 插件。 这样,当你在 CSS 文件使用 `font-size` 属性设置字体大小时,`postcss-pxtorem` 将会自动将其换为 rem 单位。 请注意,`postcss-pxtorem` 的具体配置和使用方式可能会因个人需求和项目设置而有所不同。确保阅读并遵循 `postcss-pxtorem` 的文档和示例,以确保正确地配置和使用该插件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值