通过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
相关推荐
数研小生44 分钟前
构建命令行单词记忆工具:JSON 词库与艾宾浩斯复习算法的完美结合
算法·json
fanruitian4 小时前
uniapp 创建项目
javascript·vue.js·uni-app
编码者卢布7 小时前
【Azure Stream Analytic】用 JavaScript UDF 解决 JSON 字段被转成 Record 的关键点
javascript·json·azure
2501_915921437 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone
电商API&Tina9 小时前
电商数据采集 API 接口 全维度解析(技术 + 商业 + 合规)
java·大数据·开发语言·数据库·人工智能·json
liwulin050610 小时前
【JSON】使用com.fasterxml.jackson解析json字符串
java·数据库·json
yqcoder10 小时前
uni-app 之 设置导航
uni-app
2501_9159184110 小时前
把 iOS 性能监控融入日常开发与测试流程的做法
android·ios·小程序·https·uni-app·iphone·webview
木子啊11 小时前
UniApp全端水印组件muzi-watermark
uni-app·水印·全局水印·uniapp水印
木子啊11 小时前
Uni-app企业级网络请求封装实战
uni-app·网络请求·request封装