feat:部分项目中心
This commit is contained in:
68
scripts/extract-vue-styles.mjs
Normal file
68
scripts/extract-vue-styles.mjs
Normal file
@@ -0,0 +1,68 @@
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'src')
|
||||
|
||||
function walk(dir, files = []) {
|
||||
for (const name of fs.readdirSync(dir)) {
|
||||
const full = path.join(dir, name)
|
||||
if (fs.statSync(full).isDirectory())
|
||||
walk(full, files)
|
||||
else if (name.endsWith('.vue'))
|
||||
files.push(full)
|
||||
}
|
||||
return files
|
||||
}
|
||||
|
||||
function extractVue(vuePath) {
|
||||
const content = fs.readFileSync(vuePath, 'utf8')
|
||||
const base = path.basename(vuePath, '.vue')
|
||||
const dir = path.dirname(vuePath)
|
||||
const scssPath = path.join(dir, `${base}.scss`)
|
||||
|
||||
const patterns = [
|
||||
{
|
||||
regex: /<style scoped lang="scss">\r?\n([\s\S]*?)<\/style>/,
|
||||
replacement: () => `<style scoped lang="scss">\n@import './${base}.scss';\n</style>`,
|
||||
},
|
||||
{
|
||||
regex: /<style lang="scss">\r?\n([\s\S]*?)<\/style>/,
|
||||
replacement: () => `<style lang="scss">\n@import './${base}.scss';\n</style>`,
|
||||
},
|
||||
{
|
||||
regex: /<style scoped>\r?\n([\s\S]*?)<\/style>/,
|
||||
replacement: () => `<style scoped lang="scss">\n@import './${base}.scss';\n</style>`,
|
||||
},
|
||||
{
|
||||
regex: /<style>\r?\n([\s\S]*?)<\/style>/,
|
||||
replacement: () => `<style lang="scss">\n@import './${base}.scss';\n</style>`,
|
||||
},
|
||||
]
|
||||
|
||||
for (const { regex, replacement } of patterns) {
|
||||
const match = content.match(regex)
|
||||
if (!match)
|
||||
continue
|
||||
|
||||
const styleBody = match[1].trimEnd()
|
||||
if (styleBody.includes(`@import './${base}.scss'`))
|
||||
return false
|
||||
|
||||
fs.writeFileSync(scssPath, `${styleBody}\n`, 'utf8')
|
||||
const next = content.replace(regex, replacement())
|
||||
fs.writeFileSync(vuePath, next, 'utf8')
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
const vueFiles = walk(root)
|
||||
let count = 0
|
||||
for (const file of vueFiles) {
|
||||
if (extractVue(file))
|
||||
count += 1
|
||||
}
|
||||
|
||||
console.log(`Extracted styles from ${count} Vue files.`)
|
||||
Reference in New Issue
Block a user