通过npm run XXX命令生成uniapp的pages.json文件

1 引入必要的依赖

javascript 复制代码
const fs = require("fs");
const path = require("path");

2 定义初始变量

javascript 复制代码
const defaultPages = [
  {
    path: "pages/index/index"
  }
];
const defaultSettings = {
  globalStyle: {
    h5: {
      animationType: "fade-in",
      animationDuration: 300
    },
    navigationBarBackgroundColor: "#0081ff",
    navigationBarTitleText: "",
    navigationStyle: "custom",
    navigationBarTextStyle: "white"
  }
};
const inputUrl = "src/pages";
const outputUrl = "src/pages.json";

3 读取目标目录

递归读取目录中的所有.vue文件

javascript 复制代码
/**
 * @param {string} dir - 要读取的目录
 * @returns {Promise<string[]>} .vue文件的完整路径数组
 */
async function readVueFilesRecursive(dir) {
  let results = [];
  const entries = await fs.promises.readdir(dir, { withFileTypes: true });
  for (const entry of entries) {
    const fullPath = path.join(dir, entry.name);
    if (entry.isDirectory()) {
      // 递归读取子目录
      const subDirResults = await readVueFilesRecursive(fullPath);
      results = results.concat(subDirResults);
    } else if (entry.isFile() && entry.name.endsWith(".vue")) {
      // 只处理.vue文件
      results.push(fullPath);
    }
  }
  return results;
}

4 生成文件

异步生成pages.json配置文件

javascript 复制代码
/**
 * 该函数会扫描项目src/pages目录下的所有.vue文件,
 * 并根据这些文件生成一个包含页面路由信息的pages.json配置文件。
 *
 * @returns {Promise<void>} 无返回值的Promise
 */
async function generatePagesJson() {
  console.info("正在生成 pages.json...");
  const projectRoot = process.cwd();
  const srcDir = path.join(projectRoot, inputUrl);
  const outputFile = path.join(projectRoot, outputUrl);

  // 确保输出文件的目录存在
  const outputDir = path.dirname(outputFile);
  if (!fs.existsSync(outputDir)) {
    fs.mkdirSync(outputDir, { recursive: true });
    console.info(`已创建目录: ${outputDir}`);
  }

  try {
    // 递归读取所有.vue文件
    const vueFiles = await readVueFilesRecursive(srcDir);
    const pages = [];
    // 添加默认页面到pages数组
    pages.push(...defaultPages);
    // 遍历所有.vue文件并将其转换为页面路径
    for (let i = 0; i < vueFiles.length; i++) {
      const file = vueFiles[i];
      const load = path
        .relative(projectRoot, file)
        .replace("src\\", "")
        .replace(/\\/g, "/")
        .replace(/\.vue/g, "");

      // 过滤掉components目录中的文件
      if (new RegExp("/components/").test(load)) continue;

      // 过滤掉已在默认页面中定义的路径
      if (defaultPages.findIndex(item => item.path === load) > -1) continue;
      pages.push({
        path: load
      });
    }
    // 创建JSON内容
    const jsonContent = JSON.stringify(
      {
        ...defaultSettings,
        pages: pages
      },
      null,
      2
    );

    // 写入文件
    await fs.promises.writeFile(outputFile, jsonContent, "utf8");
    console.info(`已更新 pages.json,包含 ${pages.length} 个Vue文件`);
  } catch (error) {
    console.error(`生成pages.json时出错: ${error.message}`);
    process.exit(1);
  }
}

5 配置运行命令

将配置放入到package.json中的scripts下

json 复制代码
"pages": "node ./src/utils/generate-pages.js"

需要运行时,直接运行

复制代码
npm run dev
相关推荐
Dumbness2 天前
订阅消息弹窗必须在用户点击里调:联调实验室里 timing 和 Mock 支付通知踩的坑
javascript·uni-app
Hello_Pyhx2 天前
NWinfo 导出 Windows 硬件信息:从 JSON 报告到缺项排查
windows·json
程序员大阳3 天前
副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发
javascript·json·实战·待办事项·本地存储·案例
码间留白3 天前
uni-app 鸿蒙离线打包:一个改动从源码到真机要穿过几条链
uni-app·鸿蒙·deveco·离线打包·uts插件
多客:duokelijie4 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
视觉小萌新4 天前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
码间留白4 天前
鸿蒙端对接 BLE 血压计:从一次握手到读数入库(二)设备篇
物联网·uni-app·鸿蒙·蓝牙ble·血压计
翊众建站4 天前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
Patrick_Wilson5 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
华玥作者5 天前
Vue 3 + TypeScript + uni-app 组件库推荐:hy-app(华玥组件库)
vue.js·typescript·uni-app