草庐IT

uni-app、小程序项目对pages.json文件拆分、动态生成pages.json文件、动态生成分包配置pages.json文件的解决方案

CodeDevMaster 2023-08-16 原文

动态生成pages.json文件

动态生成pages.json文件

小程序项目对pages.json文件拆分、动态生成pages.json文件,最终得到如下目录结构:

common/router/modules/*: 依据模块划分不同页面配置js文件

common/router/index.js: 对应pages.js中除了页面pages配置的参数外,其他在pages.js文件中配置的参数都放这里面

common/router/build.js:核心文件,主要是读取modules/目录下的文件以及router/index.js文件然后动态生成pages.json文件

依据模块划分不同页面配置js文件

这里创建user.js、process.js文件为例说明

user.js

baseUrl:页面文件存放的实际位置目录

children:相当于是在pages.json文件中对pages参数项进行相关页面配置
module.exports = {
    baseUrl: 'pages/user/',
    children: [
        {
            path: 'me',
            text: '个人中心',
        },
        {
            path: 'Logout',
            text: '退出',
        }
    ]
}

process.js

module.exports = {
    baseUrl: 'pages/process/',
    children: [
        {
            path: 'core/ProcessList',
            name: 'ProcessList',
            text: '流程列表',
        }
    ]
}

index.js(配置pages.json)

index.js文件对应pages.js中除了页面pages配置的参数外,其他在pages.js文件中配置的参数都放这里面

module.exports = {
    "easycom": {
        "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
    },
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "uni-app",
        "navigationBarBackgroundColor": "#F8F8F8",
        "backgroundColor": "#F8F8F8"
    },
    "tabBar": {
        "color": "#7A7E83",
        "selectedColor": "#3cc51f",
        "borderStyle": "black",
        "backgroundColor": "#ffffff",
        "list": [
            {
                "pagePath": "pages/index/index",
                "iconPath": "static/logo.png",
                "selectedIconPath": "static/logo.png",
                "text": "首页"
            },
            {
                "pagePath": "pages/index/todo",
                "iconPath": "static/logo.png",
                "selectedIconPath": "static/logo.png",
                "text": "待办"
            },
            {
                "pagePath": "pages/index/message",
                "iconPath": "static/logo.png",
                "selectedIconPath": "static/logo.png",
                "text": "消息"
            },
            {
                "pagePath": "pages/user/me",
                "iconPath": "static/logo.png",
                "selectedIconPath": "static/logo.png",
                "text": "个人中心"
            }
        ]
    }
}

build.js(动态编译、读取、写入生成pages.json文件)

build.js用于编译、动态读取、写入生成pages.json文件

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


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

/**
 * 将子路由模块配置文件转化为pages.json配置文件格式
 * @param route
 * @returns {*[]}
 */
const buildRouter = route => {
    const res = []
    const {baseUrl, children} = route
    children.forEach(item => {
        let obj = {};
        item.path ? obj.path = baseUrl + item.path : null;
        item.name ? obj.name = item.name : null;
        obj = {
            ...obj,
            style: {
                navigationBarTitleText: item.text
            }
        }
        item.style ? obj.style = item.name : null;
        res.push(obj)
    })
    return res
}

/**
 * 构建 pages 并写入 pages.json 文件
 * 用两个空格缩进pages.json,如果喜欢制表符,第三个参数更换你为\t即可
 * @type {*[]}
 */
router.pages = getRouter()

fs.rename('src/pages.json', 'src/pages.json.back', err => {
    if (err) {
        console.log(err)
    } else {
        console.log("pages.json文件备份成功!")
        fs.writeFile('src/pages.json',
            JSON.stringify(router, null, '  '),
            err => {
                err ? console.error(err) : console.log('pages.json文件更新成功!')
            }
        )
    }
})

配置package.json

配置package.json文件,主要是在执行npm脚本命令时,先生成页面配置文件、或在启动小程序项目时生成pages.json文件

  "scripts": {
    "build:router": "node ./src/common/router/build.js",
    "serve": "(node ./src/common/router/build.js) & (npm run dev:mp-weixin --minimize)"
    }

执行测试

在命令行中运行node router/build.js命令,则会在项目根目录中生成pages.json文件

npm run build:router

> xxx-app@0.1.0 build:router
> node ./src/common/router/build.js

pages.json文件备份成功!
pages.json文件更新成功!

动态生成pages.json文件改进

改进原因

由于router/modules目录下的不同模块的不同页面配置文件的顺序关系,将按顺序读取文件并写入pages.json文件。

若按以下文件顺序读取、写入,则在pages.json文件中的pages参数配置项会最先配置error.js中配置的页面配置,通常pages参数中第一项作为小程序的初始访问页面,此处这样动态生成,则需要每次修改第一项页面配置,如改为/index/login

修改build.js文件的读写顺序

改进方案很简单,只需要基于动态生成pages.json文件的过程,改进、控制build.js对不同模块配置的js文件进行读写顺序控制即可得到想要的pages.json文件。

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

const home = require('./modules/home.js')
const error = require('./modules/error.js')
const process = require('./modules/process.js')
const user = require('./modules/user.js')

const allPageSetting = [
    home,
    error,
    process,
    user
]

/**
 * 加载'./modules'目录子路由配置文件
 * @returns {*[]}
 */
const getRouter = () => {
    let router = []
    allPageSetting.forEach(item => {
        router = [...router, ...buildRouter(item)]
    })
    return router
}

/**
 * 将子路由模块配置文件转化为pages.json配置文件格式
 * @param route
 * @returns {*[]}
 */
const buildRouter = route => {
    const res = []
    const {baseUrl, children} = route
    children.forEach(item => {
        let obj = {};
        item.path ? obj.path = baseUrl + item.path : null;
        item.name ? obj.name = item.name : null;
        obj = {
            ...obj,
            style: {
                navigationBarTitleText: item.text
            }
        }
        item.style ? obj.style = item.name : null;
        res.push(obj)
    })
    return res
}

/**
 * 构建 pages 并写入 pages.json 文件
 * 用两个空格缩进pages.json,如果喜欢制表符,第三个参数更换你为\t即可
 * @type {*[]}
 */
router.pages = getRouter()

fs.rename('src/pages.json', 'src/pages.json.back', err => {
    if (err) {
        console.log(err)
    } else {
        console.log("pages.json文件备份成功!")
        fs.writeFile('src/pages.json',
            JSON.stringify(router, null, '  '),
            err => {
                err ? console.error(err) : console.log('pages.json文件更新成功!')
            }
        )
    }
})

执行测试

使用改进后的build.js动态生成pages.json文件,得到如下正确、需要的页面配置顺序。

动态生成配置分包pages.json文件

原因

微信小程序规定主包大小不能超过2M,随着5G时代的到来,2M是真的小,通常一个小程序项目轻轻松松达到2M的限制,于是乎必须进行分包配置。

由于都已经是动态生成pages.json文件了,分包配置当然也应该动态生成,于是乎有了动态生成配置分包pages.json文件的解决方案。

修改build.js文件

要想动态生成配置分包pages.json文件,同样只需要按开发文档要求如何配置pages.json文件的结构去构造生成即可。

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

const home = require('./modules/home.js')
const error = require('./modules/error.js')
const process = require('./modules/process.js')
const user = require('./modules/user.js')

const mainPackagesPages = [
    home,
    error,
    user
]

/**
 * 加载'./modules'目录子路由配置文件
 * @returns {*[]}
 */
const getRouter = () => {
    let router = []
    mainPackagesPages.forEach(item => {
        router = [...router, ...mainPackagesPagesBuildRouter(item)]
    })
    return router
}

const subPackagesPages = [
    process,
]

/**
 * 加载需要分包的路由配置文件
 */
const getSubPackagesRouter=()=>{
    let router = []
    subPackagesPages.forEach(item => {
        router = [...router, subPackagesBuildRouter(item)]
    })
    return router
}

/**
 * 将子路由模块配置文件转化为pages.json配置文件格式
 * @param route
 * @returns {*[]}
 */
const mainPackagesPagesBuildRouter = route => {
    const res = []
    const {baseUrl, children} = route
    children.forEach(item => {
        let obj = {};
        item.path ? obj.path = baseUrl + item.path : null;
        item.name ? obj.name = item.name : null;
        obj = {
            ...obj,
            style: {
                navigationBarTitleText: item.text
            }
        }
        item.style ? obj.style = item.name : null;
        res.push(obj)
    })
    return res
}

/**
 * 构建分包页面路由
 */
const subPackagesBuildRouter=(route)=>{
    const {baseUrl, children} = route
    const jo={
        root:baseUrl,
        pages:[]
    }
    children.forEach(item => {
        let obj = {};
        item.path ? obj.path = item.path : null;
        item.name ? obj.name = item.name : null;
        obj = {
            ...obj,
            style: {
                navigationBarTitleText: item.text
            }
        }
        item.style ? obj.style = item.name : null;
        jo.pages.push(obj)
    })

    return jo
}

/**
 * 构建 pages 并写入 pages.json 文件
 * 用两个空格缩进pages.json,或使用制表符:`\t`
 * @type {*[]}
 */
router.pages = getRouter()
router.subPackages = getSubPackagesRouter()

fs.rename('src/pages.json', 'src/pages.json.back', err => {
    if (err) {
        console.log(err)
    } else {
        console.log("pages.json文件备份成功!")
        fs.writeFile('src/pages.json',
            JSON.stringify(router, null, '\t'),
            err => {
                err ? console.error(err) : console.log('pages.json文件更新成功!')
            }
        )
    }
})

执行测试

确保pages.json文件存在如下npm脚本命令

"scripts": {
 "build:router": "node ./src/common/router/build.js"
 }

执行npm run build:router命令生成如下配置,同时进行项目测试全部正常。

有关uni-app、小程序项目对pages.json文件拆分、动态生成pages.json文件、动态生成分包配置pages.json文件的解决方案的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  9. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  10. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

随机推荐