故事背景:
vue H5老項目通過 js文件監(jiān)聽body變化動態(tài)設(shè)置跟字體大小, 新項目通過npm插件 amfe-flexible && postcss-pxtorem 做的適配, 新項目開發(fā)一部分后需要將老項目部分模塊遷移進入老項目發(fā)現(xiàn)出現(xiàn)布局錯亂現(xiàn)象, 分析原因是樣式單位導(dǎo)致的(老項目 rem, 新項目 px),解決方法只能是替換老項目像素單位, 故寫了下面 node 腳本.
① node ${此文件名}
② 輸入需要轉(zhuǎn)化的文件或文件夾相對根目錄絕對路勁
const fs = require('fs')
const readline = require('readline')
const path = require('path')
const isFile = stats => stats.isFile()
const isDir = stats => stats.isDirectory()
const accMul = (arg1, arg2) => {
var m = 0, s1 = arg1.toString(), s2 = arg2.toString()
try {
m += s1.split('.')[1].length
} catch (e) {}
try {
m += s2.split('.')[1].length
} catch (e) {}
return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}
const scan = readline.createInterface({
input: process.stdin,
output: process.stdout
})
const getTargetContent = content => {
return content.replace(/(\<style[\S\s]*?\>)([\S\s]*?)(\<\/style\>)/g, (_, $1, $2, $3) => {
return `${$1}${$2.replace(/((-?\.?\d+)(\.\d+)?)rem/g, (_, str) => {
return `${accMul(str, 50)}px`
})}${$3}`
})
}
const remToPx = path => {
const content = fs.readFileSync(path, 'utf-8')
const str = getTargetContent(content)
fs.writeFileSync(path, str)
}
const fileTransform = (filePath) => {
const stat = fs.statSync(filePath)
if (isFile(stat)) {
remToPx(filePath)
return
}
//根據(jù)文件路徑讀取文件伟骨,返回文件列表
fs.readdir(`${__dirname}${filePath}`, (err, files) => {
if (err) return
//遍歷讀取到的文件列表
files.forEach(filename => {
//獲取當(dāng)前文件的絕對路徑
const filedir = path.join(filePath, filename)
//根據(jù)文件路徑獲取文件信息垮庐,返回一個fs.Stats對象
fs.stat(filedir, (eror, stats) => {
if (eror) {
console.warn('獲取文件stats失敗')
return
}
if (isFile(stats)) {
remToPx(`${filePath}/${filename}`)
}
if (isDir(stats)) {
fileTransform(filedir)
}
})
})
})
}
scan.question('請輸入需要轉(zhuǎn)化的文件夾或文件(必須相對項目根路徑):', filePath => {
const path = `${filePath.startsWith('/') ? filePath : `/${filePath}`}`
fileTransform(path)
scan.close()
})