通过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
相关推荐
diygwcom5 分钟前
UniApp 鸿蒙NEXT蓝牙连接及数据写入
华为·uni-app·harmonyos
00后程序员张39 分钟前
数据流抓包实战指南,TCPUDP 流量分析、HTTPS 解密与多工具协同方案
网络协议·http·ios·小程序·https·uni-app·iphone
jenchoi4131 小时前
【2025-11-30】软件供应链安全日报:最新漏洞预警与投毒预警情报汇总
网络·安全·web安全·网络安全·npm
2501_915921431 小时前
iOS 性能分析工具全景解析,构建从底层诊断到真机监控的多层级性能分析体系
android·ios·小程序·https·uni-app·iphone·webview
小毛驴8501 小时前
快速设置 npm 源
前端·npm·node.js
2501_915909061 小时前
如何防止 IPA 被反编译,从攻防视角构建一套真正有效的 iOS 成品保护体系
android·macos·ios·小程序·uni-app·cocoa·iphone
随风一样自由1 小时前
React内逐行解释这个 package.json 文件,最近搞了个工厂AI生产平台,顺便来学习一下
学习·react.js·json·package
2501_916007471 小时前
专业的 IPA 处理工具 构建可维护、可回滚的 iOS 成品加工与加固流水线
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者81 小时前
Charles抓包工具怎么用 Charles抓包教程、网络调试技巧与HTTPS配置全流程
网络·ios·小程序·https·uni-app·php·webview
小毛驴8502 小时前
npm 代理配置
前端·npm·node.js