uni-app自动注册页面脚本

354 阅读2分钟
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('操作完成')