uni-app路由配置文件pages.json平台化拆分

目录
  • 对uni-app路由配置文件pages.json进行平台化拆分
    • 例子:
    • 优化思路:
    • 过程:

对uni-app路由配置文件pages.json进行平台化拆分

背景:公司打造小程序矩阵化,以uni-app作为技术栈生成不同平台的小程序代码。小程序项目包含5个平台的代码,虽然是一份代码运行5个平台,但是各个平台又有差异,在代码里面需要做很多条件编译进行兼容处理。随着项目的壮大与页面的增多,控制路由的pages.json已经异常庞大且代码可读性差(想找一个页面需要找到上下文切换,浪费时间并且可能误删不同平台的页面),亟需优化。

例子:

"globalStyle": {
    // #ifndef MP-TOUTIAO
    "navigationStyle": "custom",
    // #endif
    // #ifdef MP-TOUTIAO
    "navigationStyle": "default",
    // #endif
    // #ifdef MP-WEIXIN
    "backgroundColor": "#F3F5F8",
    // #endif
    // #ifdef MP-TOUTIAO || MP-BAIDU
    "backgroundColor": "#fff",
    // #endif
    "enablePullDownRefresh": false,
    "navigationBarTextStyle": "black",
    // #ifndef MP-ALIPAY
    "navigationBarTitleText": "XXXX",
    // #endif
    // #ifdef MP-ALIPAY
    "navigationBarTitleText": "XXXXXX",
    // #endif
    "navigationBarBackgroundColor": "#fff",
    // #ifdef MP-WEIXIN
    // 华为P40Pro 设备 key
    "qbDebugKey": ["59fc8a158775abbe1fd9809abc887b31"],
    // #endif
    "backgroundTextStyle": "light"
  },

优化思路:

将pages.json拆分,共同配置放到pages.json,差异配置新建不同平台文件维护,构建时再进行合并。

过程:

  • 翻阅资料与查看uni打包构建源码,在@dcloudio/webpack-uni-pages-loader/lib/index.js与@dcloudio/uni-cli-shared/lib/pages.js中发现,在处理pages.json的过程中会执行./src/pages.js,该js需返回全局配置对象(结构与pages.json一致),pages.js要求CommonJS规范,直接通过module.exports输出一个钩子函数,钩子函数返回配置对象。所以,我们只需要新建pages.js,然后根据process.env.UNI_PLATFORM返回不同平台的路由配置即可
// pages.js关键代码
const pagesJsonJsFileName = 'pages.js'
function processPagesJson (pagesJson, loader = {
  addDependency: function () {}
}) {
  const pagesJsonJsPath = path.resolve(process.env.UNI_INPUT_DIR, pagesJsonJsFileName)
  if (fs.existsSync(pagesJsonJsPath)) {
    delete require.cache[pagesJsonJsPath]
    const pagesJsonJsFn = require(pagesJsonJsPath)
    if (typeof pagesJsonJsFn === 'function') {
      pagesJson = pagesJsonJsFn(pagesJson, loader)
      if (!pagesJson) {
        console.error(`${pagesJsonJsFileName}  ${uniI18n.__('cliShared.requireReturnJsonObject')}`)
      }
    } else {
      console.error(`${pagesJsonJsFileName} ${uniI18n.__('cliShared.requireExportFunction')}`)
    }
  }
  return pagesJson
}
  • 新建src/router文件夹 文件夹下新建5个平台的路由文件。 如下例子(src/router/weixin.js):
  module.exports = {
    pages: [
      {
          path: 'pages/index/index',
          style: {
              enablePullDownRefresh: false,
          }
      },
      // ...
    ],
    subPackages: [
      {
          root: 'servicePackage',
          pages: [
            {
              path: 'xxx/xxxx/xxxx'
            }
          ]
      }
      // ...
    ]
  }

新建src/pages.js,根据process.env.UNI_PLATFORM加载不同配置文件

 /**
 * 此文件为@dcloudio/webpack-uni-pages-loader的一个钩子入口,遵循CommonJs规范
 * 源码路径:node_modules\@dcloudio\uni-cli-shared\lib\pages.js
 */
 const platform = process.env.UNI_PLATFORM.substring(3) // 获取platform mp-weixin
 const path = require('path')
 const routerFilePath = path.join(__dirname, `router/${platform}.js`)
 const platformPageConfig = require(routerFilePath)
 // pagesJson参数是pages.json值
 module.exports = (pagesJson, loader) => {
     return {
         ...platformPageConfig,
         ...pagesJson
     }
 }

由于不是webpack的标准运行依赖,所以需要手动添加依赖项(使用addDependency),并且需要每次清除模块的缓存,修改一下src/pages.js代码

/**
 * 此文件为@dcloudio/webpack-uni-pages-loader的一个钩子入口,遵循CommonJs规范
 * 可以直接使用require引入其他依赖,但是不会有热重载的效果,需要加上addDependency
 */
 const platform = process.env.UNI_PLATFORM.substring(3) // 获取platform mp-weixin
 const path = require('path')
 const routerFilePath = path.join(__dirname, `router/${platform}.js`)
 const platformPageConfig = require(routerFilePath)
 // pagesJson参数是pages.json值
 module.exports = (pagesJson, loader) => {
     // 开发模式下才需要热重载
     if (['test', 'development'].includes(process.env.NODE_ENV)) {
         console.warn(`-----${process.env.NODE_ENV}----\n`)
         // 动态添加依赖,告诉webpack改文件需要热重载
         loader.addDependency(require.resolve(routerFilePath))
         // 手动清除缓存
         delete require.cache[require.resolve(routerFilePath)]
     }
     return {
         ...platformPageConfig,
         ...pagesJson
     }
 }

大功告成,项目的路由配置一下清晰了许多,由于路由配置文件为js,可以加入代码进行条件化判断生成的路由。如果只需要生成一个平台的代码,也可以在此基础上对路由进行模块化。

参考文章 https://www.jb51.net/article/272944.htm

以上就是uni-app路由配置文件pages.json平台化拆分的详细内容,更多关于uni-app路由配置pages.json的资料请关注我们其它相关文章!

(0)

相关推荐

  • uni-app使用swiper实现轮播图的方法

    目录 uni-app轮播图实现之swiper 补充:uniapp swiper 自定义轮播图指示点 总结 uni-app轮播图实现之swiper 首先在data中定义一个图片数据的对象数组 data() { return { rotation: [ { id: 1, url: 'https://imgcps.jd.com/ling4/100035927374/5Lqs6YCJ5aW96LSn/5L2g5YC85b6X5oul5pyJ/p-5bd8253082acdd181d02fa42/60f0

  • uni-app多环境部署解决方案详解

    目录 前言 尝试几种方式 解决方案 部署方式 获取接口 部署路径 命令行 其他 总结 前言 最近几周都在处理公司的移动业务,而为在后期能统一多端,解放自己,迎合公司的技术栈:选用了 uni-app 来开发.开发前期重新对公司移动业务做深入了解,重构大部分业务逻辑,也抽离出基础组件:但实际到部署的时候,出现来问题:由于现在只考虑 H5 端,部署和测试会出现多环境配置,但是我使用的 HBuilderX 工具创建的工程,所以只存在开发环境:development 和生产环境:production. 尝

  • uni-app动态修改主题色的方法详解

    目录 前言 一.uni.scss 使用方式 二.暗黑主题 三.自定义主题配置 1.在根目录下新建 theme 文件夹 css-theme uni.scss中引入 css-variate cue-theme main.js 导入 system-theme 2.vuex 配置 index.js 全局导出 main.js中导入 3.页面中使用 四.黑夜 白天主题展示 总结 前言 老是碰到初版制作完成没多久,就整一出说什么要更改整个项目的色彩体系.真的是宝宝心里苦啊! 起初都是通过uni项目自带的uni

  • uni-app禁用返回按钮/返回键的具体实现

    目录 前言 实现 具体演示代码 附:uni-app H5的返回拦截经验分享 总结 前言 使用uni-app开发原生应用时,遇到需求: 需要禁用物理返回按钮.手势返回. uni.navigateBack仍可使用. 实现 当前页面的onBackPress()中,禁用物理返回 pages.json中,去除当前页面的返回按钮 当前页面的mounted()中,隐藏当前页面的返回按钮(针对pages.json中设置无效的情况) 具体演示代码 1.当前页面中,在onBackPress()控制是否禁用返回按钮.

  • uni-app弹出层uni-popup使用及修改默认样式的方法实例

    uni-popup官方文档 我这里的背景是弹出一个选择规格的菜单.使用vue3+ts,使用组合式api 首先看看在vue3+ts+setup下的使用: <template> <!-- 定义一个按钮,用于打开弹出层 --> <view style="width: 200px"> <button @click="openSpecs">弹出</button> </view> <!-- 弹出层视图

  • 使用uni-app打包H5的图文教程

    1. 找到项目中 manifest.json --- H5 配置---运行时的基础路径, 将路径修改为 相对路径(./ ) 2. 修改完后,点击工具栏 --- 发行 --- 网站pc web或手机 h5 3. 弹出弹窗,修改网站标题与网站域名(网站域名取对应项目的域名,一般为https/http开头)填完后直接点击发行. 4. 点击发行后如图 5. 发行成功后,找到 unpackage --- dist --- build --- h5 文件夹, 在外部资源中打开,将 h5 文件夹打包成 zip

  • uni app仿微信顶部导航条功能

    最近一直在学习uni-app开发,由于uniapp是基于vue.js技术开发的,只要你熟悉vue,基本上很快就能上手了. 在开发中发现uni-app原生导航栏也能实现一些顶部自定义按钮+搜索框,只需在page.json里面做一些配置即可.设置app-plus,配置编译到App平台的特定样式.dcloud平台对app-plus做了详细说明:app-plus配置,需注意 目前暂支持H5.App端,不支持小程序. 在page.json里配置app-plus即可 { "path": "

  • 手机Web APP如何实现分享多平台功能

    话说App一般都带有分享到社交平台的入口,web网页的分享也有很不错的框架,但是随着HTML5的不断发展,手机web页面越来越多的进入到我们的生活中,那如何在我们的手机上完成分享呢?话说各大分享平台都有针对Android.Ios的SDK,作为开发者,我们只需要将SDK集成的我们的项目中即可,通过提供的外部接口,我们可以很容易的完成分享的功能:web网页呢,网上也存在很多优秀的分享框架,例如:bShare分享 .JiaThis分享:我们可以很方便的集成到我们的项目中:但是手机web页面实现分享就需

  • Python 中urls.py:URL dispatcher(路由配置文件)详解

    urls.py:URL dispatcher(路由配置文件) URL配置(URLconf)就像是Django所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表.以这样的方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码.url的加载就是从配置文件中开始. urlpatterns的两种形式 没有前缀的情况,使用的列表(推荐方式) URL模式 urlpatterns = [ url(正则表达式, view函数, 参数, 别名, 前缀), ]

  • php写app接口并返回json数据的实例(分享)

    第一步:conn.PHP文件,用于连接数据库并定义接口格式,代码如下: <?php header("charset=utf-8"); $servername="localhost"; $username="root"; $password="root"; $dbname="test"; $conn = mysql_connect($servername,$username,$password); if

  • 获取App.config配置文件中的参数值

    下面通过代码示例给大家展示下,具体内容如下: 首先添加System.Configuration引用 向App.config配置文件添加参数 App.config添加 向App.config配置文件添加参数 例子: 在这个App.config配置文件中,我添加了4个参数,App.config参数类似HashTable都是键/值对 <?xml version="1.0" encoding="utf-8" ?> <configuration> &l

  • ASP.NET Core应用程序配置文件AppSetting.json

    AppSetting.json 当我们使用空项目模板或Razor页面或MVC模板或Web API模板创建ASP.NET Core Web应用程序时,Visual Studio会自动为我们创建appsettings.json文件,如下图所示. appsettings.json文件是一个应用程序配置文件,用于存储配置设置,例如数据库连接字符串,任何应用程序范围的全局变量等.如果打开ASP.NET Core appsettings.json文件,则默认情况下会看到以下代码 这是由Visual Stud

  • Django多app路由分发(纯后端)

    目录 1.环境搭建 2.生成django项目 3.创建app 4.在每个app下创建templates文件夹,用于创建html页面 5.每个app创建urls.py用于构建每个app的分路由 6.项目总路由urls.py 7.每个app的前端页面 8.每个app的view.py 1.环境搭建 Python3.6.7 pip install django==2.2.6 2.生成django项目 django-admin startproject yourproject 3.创建app python

  • C#中读取App.config配置文件代码实例

    App.config是C#开发WinForm程序的配置文件,开发Web程序的配置文件叫Web.config.本文介绍App.config的简介使用. 我们先来打开一个App.config文件,看看它的内容像什么样子. <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="conn" co

  • pm2发布node配置文件ecosystem.json详解

    背景 最近在搭建一个node+koa+vue的项目使用到了pm2发布 这里简单的记录一下 在根目录新建文件 ecosystem.json { "apps": [ { "name": "ant-help-center", "script": "./bin/www", //启动脚本 "env": { "COMMON_VARIABLE": "true"

  • node.js微信公众平台开发教程

    用nodejs怎样来实现对微信公众平台的开发呢? 别的就不多说了,先来简单介绍微信公众平台的基本原理. 微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这里就是我们的具体实现).服务处理完毕,然后转发给微信服务器,微信服务器再将具体响应回复到终端:通信协议为:HTTP:数据格式为:XML. 具体的流程如下图所示: 其实,我们需要做的事情,就是对HTTP请求,做出响应.具体的请求内容,我们按照特定的XML格式去解析,处理完毕后,

随机推荐