动态生成 uniapp 配置文件 pages.json 的解决方案

动态生成 uniapp 配置文件 pages.json 的解决方案

最近接手了一个基于 uniapp 的开发项目,我个人对于它能够使用同一套代码就能够开发 h5\app\小程序 的强大功能表示非常钦佩。但是其配置文件 pages.json 也让我十分郁闷,原因无他,只因其是写死 JSON 文件,在管理的时候是十分不便的。

在搜索了一些资料,期望可以用 pages.js 文件来替代 pages.json 配置文件(JS的动态能力,可以很方便的拆分路由配置),但是没有找到很好的解决方案。倒是有一个,但是搞得过于繁琐,想想还是算球了。

于是,我自己用 Nodejs 手写了一个方案,虽然原始了一些,但是依赖十分轻,使用也比较便捷,个人感觉还是颇有用处的,所以特地撰文分享给大家。

构建文件构架

首先,我们在项目根目录中新建 router 文件夹,然后根据如下的格式构建文件结构。

router              # 动态路由文件夹
├── build.js        # 编译路由配置主文件
├── index.js        # 主配置文件
└── modules         # 动态路由模块文件
    └── small.js    # 拆分出来的模块路由文件

编写 build.js 文件

代码如下:

const fs = require('fs')
const path = require('path')
const router = require('./index.js')

// 将子路由模块配置文件转化为 uniapp 配置文件格式
const buildRouter = route => {
  const res = []
  const { baseUrl, children } = route
  children.forEach(i => {
    const obj = {
      path: baseUrl + i.path,
      style: {
        navigationBarTitleText: i.name
      }
    }
    Object.keys(i).forEach(ii => {
      !['path', 'name'].includes(ii) && (obj.style[ii] = i[ii])
    })
    res.push(obj)
  })
  return res
}

// 自动加载 './modules' 目录子路由配置文件
const getRouter = () => {
  const srcPath = path.resolve(__dirname, './modules')
  const result = fs.readdirSync(srcPath)
  let router = []
  result.forEach(r => {
    const route = require('./modules/' + r)
    router = [...router, ...buildRouter(route)]
  })
  return router
}

// 构建 pages 并写入 pages.json 文件
router.pages = getRouter()
fs.writeFile(
  __dirname + '/../pages.json',
  // 我这边是用两个空格来缩进 pages.json,如果喜欢制表符,第三个参数更换你为 \t 即可
  JSON.stringify(router, null, '  '),
  e => e ? console.error(e) : console.log('pages.json 配置文件更新成功')
)

build.js 文件为主文件,是用于编译 pages.json 的。如果你有 nodejs 编程基础的话,这是一个巨简单的问题。如果没有的话,就不用管了,直接复制走即可。

编写 index.js 文件

这个文件没啥说的,就是除了 pages.json 这个文件中的 pages 字段外的其他内容,导出即可。我这边示例文件如下:

module.exports = {
  globalStyle: {
    navigationBarTextStyle: 'white',
    navigationBarTitleText: '司机配送',
    navigationBarBackgroundColor: '#4a9ff8',
    backgroundColor: '#4a9ff8'
  },
  tabBar: {
    color: '#666',
    selectedColor: '#4a9ff8',
    backgroundColor: '#f7f7f7',
    borderStyle: 'white',
    list: [
      {
        pagePath: 'pages/index/index',
        iconPath: 'static/images/icon-homeed.png',
        selectedIconPath: 'static/images/icon-home.png',
        text: '首页'
      },
      {
        pagePath: 'pages/task/task',
        iconPath: 'static/images/icon-tasked.png',
        selectedIconPath: 'static/images/icon-task.png',
        text: '任务'
      },
      {
        pagePath: 'pages/my/my',
        iconPath: 'static/images/icon-myed.png',
        selectedIconPath: 'static/images/icon-my.png',
        text: '我的'
      }
    ]
  }
}

这里面都是根据官方的配置去写即可了。因为这部分内容不多,因此没有必要拆分。区别就是,这里是JS,所以不用写双引号~呵呵。。。

编写 modules 下子路由文件

上代码:

module.exports = {
  baseUrl: 'pages/small/',
  children: [
    {
      path: 'register',
      name: '注册'
    }, {
      path: 'login',
      name: '登录'
    }
  ]
}

导出一个对象,其中 baseUrl 是指你这些文件存放的位置目录。拆分出来的原因是不想在每个页面的路径里都要写这些重复的代码。

children 中就是该子路由涵盖的各个页面的路径以及标题了。

这里和 uniapp 默认的 pages.json 中的格式略有区别,我在 build.js 文件里面的 buildRouter() 函数就是做这个数据格式转化的。目的是为了让我们的子路由配置代码更加简洁。

这里需要注意的是,如果你需要使用到其他的配置项,就直接写就可以了。原来啥格式就是啥格式,比如这样:

module.exports = {
  baseUrl: 'pages/small/',
  children: [
    {
      path: 'register',
      name: '注册',
      'app-plus': {
        titleNView: {
          buttons: [
            {
              text: '消息',
              fontSize: '16px'
            }
          ]
        }
      }
    }, {
      path: 'login',
      name: '登录'
    }
  ]
}

上面的这个 'app-plus' 会自动插入进去的,官方文档要求怎么写,你在这边就怎么写就好了。一般这个用得比较少,所以这个我就不做额外的处理了。

使用

构建好这些代码之后,直接在命令行中运行 node router/build.js 就会在项目根目录中生成 pages.json 文件了。

这里需要说明的是,我这边项目是使用 hbuilder GUI界面生成的项目,所以根目录就是项目根目录。如果是使用的 CLI 工具生成的项目,上文中的根目录就变成了项目的 src 目录。

如果想直接下载代码,可以看我的仓库 https://github.com/fengcms/uniapp-pages-json-cli-build 如果去 github 下载的话,给我点个赞哦!

Copyright and License

Copyright by FungLeo(web@fengcms.com)

License: MIT

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: uniapp 是一款跨平台的开发框架,可以基于Vue.js进行快速应用的开发。为了方便项目管理,uniapp提供了动态生成配置文件pages.json的功能。 在uniapp中,pages.json文件是用来配置小程序各个页面路径的文件。通过动态生成pages.json文件,可以在开发中更灵活地管理项目中的页面。在创建新页面或对已有页面进行修改时,可以通过代码生成pages.json文件,无需手动添加或修改配置项。这样可以提高开发效率,减少人为错误。 使用动态生成pages.json文件的方式,可以根据实际情况进行灵活配置,减少不必要的重复操作。比如,可以使用循环遍历的方式 dynamically_generate_pages() 来创建新页面,并将新增页面的配置信息动态添加到pages.json文件中。当有页面删除或修改时,也可以通过代码去检测并更新pages.json文件的相应配置项。 动态生成pages.json文件还可以实现根据不同环境的需求去生成不同的配置文件。比如,在开发环境中,可以根据需要添加一些调试工具或增加一些辅助性页面。而在生产环境中,可以通过动态生成pages.json文件去过滤掉不需要的页面,从而减少项目的体积和加载时间。 总结来说,动态生成pages.json配置文件可以提高uniapp项目的开发效率和灵活性。通过代码生成配置文件,可以减少手动操作的繁琐,并且可以根据实际需求灵活配置。这样可以更好地管理和维护uniapp项目,提升开发的效率和质量。 ### 回答2: 动态生成uniapp配置文件pages.json可以方便地进行项目管理。pages.jsonuniapp框架中的重要配置文件,它定义了项目的页面路由、页面配置和导航栏样式等信息。 通过动态生成pages.json,我们可以实现以下好处: 1. 自动化配置:通过编写脚本或工具,我们可以根据项目需求自动生成pages.json,从而减少手动配置的工作量和出错的可能性。这样,开发者可以更便捷地维护项目结构和功能模块。 2. 增强可维护性:随着项目的不断迭代,页面数量和结构可能会发生变化,若手动更新pages.json将会非常繁琐且容易出错。而动态生成可以根据项目实际情况实时更新pages.json,使项目结构始终与实际一致,提高了代码的可维护性。 3. 多平台适配:uniapp支持多个平台的开发,如微信小程序、H5、APP等。通过动态生成pages.json,我们可以在不同平台下自动适配对应的页面配置和路由信息,提高了项目的跨平台开发效率和一致性。 总之,动态生成uniapp配置文件pages.json是一个值得推荐的做法,它能够提高项目的开发效率、可维护性和跨平台适配性,同时减少手动配置时的错误和工作量。通过合理利用脚本或工具,我们能更好地管理uniapp项目并提升开发体验。 ### 回答3: 动态生成 uniapp 配置文件 pages.json 是为了方便项目管理和维护。uniapp 是一款跨平台的开发框架,可以同时开发小程序、H5、App等,而配置文件 pages.json 是用于配置项目的页面路径和页面样式的文件。 动态生成配置文件可以通过自定义生成工具来实现。通过该生成工具,我们可以根据项目需要动态添加、删除和修改页面路径和样式,从而更加灵活地管理项目。这样一来,当有新的页面需要添加时,我们只需要通过工具进行配置,而不需要手动修改 pages.json 文件,大大减少了人工操作和出错的可能性。 另外,动态生成 pages.json 还可以实现页面权限管理。通过生成工具,我们可以根据不同用户的权限动态生成 pages.json 文件,从而限制用户能够访问的页面。这样一来,可以有效提升项目的安全性和隐私性。 总之,动态生成 uniapp 配置文件 pages.json 可以实现项目的灵活管理和页面权限的控制,提高项目的开发效率和安全性。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值