uni-app的pages.json动态生成的方法

举报
薛定喵君 发表于 2021/09/15 08:45:13 2021/09/15
【摘要】 分享如何动态修改 uni-app 项目的 pages.json。 前言最近遇到一个需求:项目中某些功能不在需求清单内,需要藏掉某些 h5 页面的入口不再对部分用户开放。 pages.json 介绍pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生 tabbar 等。由于 pages.json 文件在项目中是写死的,所以就无法...

分享如何动态修改 uni-app 项目的 pages.json。

前言

最近遇到一个需求:项目中某些功能不在需求清单内,需要藏掉某些 h5 页面的入口不再对部分用户开放。

pages.json 介绍

pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生 tabbar 等。

由于 pages.json 文件在项目中是写死的,所以就无法动态配置页面入口了 🐶。

解决方法

配置文件既然是写死的那怎么处理动态的页面配置需求呢?当然是有办法的,我们可以选择在打包前根据自己的需求动态修改这个配置文件成为我们需要的样子就可以了。

所以答案就是我们可以写(定制)一个 Node.js 脚本去读取这个全局配置文件进行修改加工之后再回写到 pages.json 即可。

实现步骤

需求介绍(适用场景)

这里的具体需求是某地区用户在打开页面之后隐藏底部的 tabbar ,因为隐藏掉 tab 之后页面上就只剩一个 tabbar 了,所以效果与不设置 tabbar 一致。

脚本思路

使用 fs 读取 pages.json ,得到一个 json 字符串,把字符串转换为 json 对象后对需要裁剪的部分进行相应处理,最后再写入 pages.json

在项目根目录新建一个 resetPages.js 文件用于存放脚本内容。

参考内容如下:


const fs = require('fs');
const path = './src/pages.json';
fs.readFile(path, function(err, data) {
  if (err) {
    return console.error(err);
  }
  var pages = data.toString(),
    tmpJSON = pages;
  tmpJSON = tmpJSON.replace('/* 应用 */', '');
  tmpJSON = tmpJSON.replace(/\/\//g, '');
  let newPageObject = JSON.parse(tmpJSON);
  // 清空底部 tabbar
  newPageObject.tabBar.list.length = 0;
  fs.writeFile(path, JSON.stringify(newPageObject), function(err) {
    if (err) {
      console.error(err);
    }
    console.log('----------全局配置修改成功-------------');
  });
});

使用方法

在根目录执行命令 node resetPages.js 即可。
打包项目时只需要 npm install && node resetPages.js && npm run build:h5 就行了。

因为每次部署时会先清空输出目录再拉取代码执行构建,所以中间执行一个额外命令修改全局配置的副作用就比较小,属于一种轻量级的方法。

总结

可以发现方法的核心就是把配置转为一个 js 对象来修改,改成我们需要的样子之后再转回去,因为配置文件里面可能存在一些转换不支持的代码,所以我们需要预先过滤掉可能会引起报错的字符。

本文所述方法只是提供一个思路,具体使用的时候可以结合自己的实际情况进行修改及扩展,比如我们可以把配置存放在数据库,脚本中通过接口拉取配置之后重新生成再进行打包等等。

参考资料

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。