通过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
相关推荐
Wang15302 小时前
js核心概念
json
2501_916007475 小时前
iOS开发中抓取HTTPS请求的完整解决方法与步骤详解
android·网络协议·ios·小程序·https·uni-app·iphone
弹简特8 小时前
【Vue3速成】01-npm+vue初体验+vite构建vue工程化
vue.js·arcgis·npm
DogDaoDao8 小时前
Windows 下 Git 报错:`touch` 无法识别 —— 原因分析与 7 种解决方案(从入门到精通)
windows·git·程序员·npm·powershell·cmd·touch
00后程序员张10 小时前
Windows 下怎么生成 AppStoreInfo.plist?不依赖 Xcode 的方法
ide·macos·ios·小程序·uni-app·iphone·xcode
__zRainy__10 小时前
uni-app 全局容器实战系列(二):Vite 虚拟模块
windows·uni-app
__zRainy__11 小时前
uni-app 全局容器实战系列(一):全局容器的实现
uni-app·vite
天若有情67311 小时前
轻量级状态事件总线 eventbusx-js 开源使用教程
开发语言·javascript·npm·开源·事件·事件总线
逍遥德12 小时前
Java编程高频的“踩坑点”-01:fastjson.JSON 转换时泛型擦除问题
java·spring boot·spring·系统架构·json
Roselind_Yi12 小时前
【快速熟悉容器】企业 Docker 从 0 到落地全流程(分角色版)
java·运维·redis·docker·容器·json·改行学it