Uniapp有一个比较头疼的事情就是需要静态的配置页面路由pages.json > pages属性,我寻思这样一个一个配置,这么机械的操作可以搞个脚本让它自动化,于是我用NodeJs写了一个自动化配置pages属性工具,它可以自动删除不存在的页面或写入未添加的页面,还是比较方便的, 并且会在同目录下创建pages_log.json文件保存被删除的页面配置。
温馨提示:pages.json内容不要包含注释,因使用JSON格式解析(当前有做了正则去除单行注释,但是没法做到保留注释)。
这是我的Github,欢迎star,之后会提供更多的脚本能力,减少无意义的机械操作。
脚本需要配置UNIAPP_DIR为项目根路径或填为null并将文件放置项目根目录。
/**页面注册器 */
/**配置项目根路径 */
var UNIAPP_DIR = 'E:\\Users\\Edward Cho\\Documents\\HBuilderProjects\\plan_app'
if (!UNIAPP_DIR) {
UNIAPP_DIR = __dirname
}
var fs = require('fs')
var txt = fs.readFileSync(UNIAPP_DIR + '\\pages.json', 'utf-8').toString()
/**清洗去除注释 */
txt = txt.replace(/\/\/.*|/g, '')
var json = JSON.parse(txt)
var pages = {}
/**保存当前已有的页面配置 */
json.pages.forEach((page) => {
pages[page.path] = page
})
var getVueFiles = (path, logicPath = 'pages') => {
let files = []
let data = fs.readdirSync(path)
data.forEach((item) => {
let logicPathItem = logicPath + '/' + item
let pathItem = path + '\\' + item
let pathItemStat = fs.lstatSync(pathItem)
if (pathItemStat.isFile() && item.search(/\.vue/i) != -1) {
files.push(logicPathItem.replace(/\.vue/i, ''))
} else if (pathItemStat.isDirectory()) {
files = files.concat(getVueFiles(pathItem, logicPathItem))
}
})
return files
}
/** 获取pages文件夹下所有的vue文件路由 */
var vues = getVueFiles(UNIAPP_DIR + '/pages')
/** 注册未注册的页面 */
vues.forEach((vue) => {
if (pages[vue] === undefined) {
console.log('发现新文件 ' + vue)
pages[vue] = {
path: vue
}
}
})
var deleteVues = []
/** 去除已经不存在的注册页面 */
Object.keys(pages).forEach((vue) => {
if(vues.indexOf(vue) == -1){
/** 保存删除信息 */
deleteVues.unshift(pages[vue])
delete pages[vue]
console.log('去除不存在的页面 ' + vue)
}
})
/**替换原pages属性 */
json.pages = Object.values(pages)
logArray = []
let logFile = UNIAPP_DIR + '\\pages_log.json'
if(fs.existsSync(logFile)){
let logTxt = fs.readFileSync(logFile, 'utf-8').toString()
logArray = JSON.parse(logTxt)
}
logArray = deleteVues.concat(logArray)
fs.writeFileSync(logFile, JSON.stringify(logArray, "", "\t"))
console.log('备份删除信息于pages_log.json,仅pages参数信息。')
/** 保存pages.json内容 */
let stringify = JSON.stringify(json, "", "\t")
fs.writeFileSync(UNIAPP_DIR + '\\pages.json', stringify)
console.log('操作完成')