项目检查器 (projectChecker)

项目检查器模块用于检测项目结构,确认是否为有效的 Vue + Vite + TypeScript 项目。

API 参考

checkProject

检查项目结构,返回项目信息。

函数签名

1async function checkProject(projectPath: string): Promise<ProjectInfo>;

参数

  • projectPath: 项目路径,字符串类型

返回值

  • Promise<ProjectInfo>: 包含项目信息的 Promise

示例

1import { checkProject } from "ew-auto-import-tool";
2
3async function checkMyProject() {
4  try {
5    const projectInfo = await checkProject("/path/to/project");
6
7    if (projectInfo.isValid) {
8      console.log("项目有效!");
9      console.log(`使用的包管理器: ${projectInfo.packageManager}`);
10      console.log(`是否使用TypeScript: ${projectInfo.hasTypeScript}`);
11    } else {
12      console.log("项目无效!");
13      console.log("错误信息:", projectInfo.errors);
14    }
15  } catch (error) {
16    console.error("检查项目时出错:", error);
17  }
18}
19
20checkMyProject();

实现细节

checkProject 函数执行以下检查:

  1. 检查 package.json 是否存在
  2. 检查是否安装了 Vue 依赖
  3. 检查是否使用 Vite 作为构建工具
  4. 检查是否存在 vite.config.ts 或 vite.config.js 文件
  5. 检查是否使用 TypeScript(是否存在 tsconfig.json 文件)
  6. 检测使用的包管理器(npm、yarn 或 pnpm)

返回的 ProjectInfo 对象

1interface ProjectInfo {
2  isValid: boolean; // 项目是否有效
3  isVue: boolean; // 是否为Vue项目
4  isVite: boolean; // 是否使用Vite
5  hasTypeScript: boolean; // 是否使用TypeScript
6  packageManager: PackageManager; // 使用的包管理器
7  viteConfigPath?: string; // Vite配置文件路径
8  tsConfigPath?: string; // TypeScript配置文件路径
9  errors?: string[]; // 错误信息
10}

有效项目的条件

项目被认为是有效的,需要满足以下条件:

  • 是 Vue 项目(package.json 中包含 Vue 依赖)
  • 使用 Vite 作为构建工具(package.json 中包含 Vite 依赖)
  • 存在 vite.config.ts 或 vite.config.js 文件

如果项目不满足这些条件,isValid 将被设置为 false,并且 errors 数组将包含相应的错误信息。

源码分析

1export async function checkProject(projectPath: string): Promise<ProjectInfo> {
2  const result: ProjectInfo = {
3    isValid: false,
4    isVue: false,
5    isVite: false,
6    hasTypeScript: false,
7    packageManager: "npm",
8    errors: [],
9  };
10
11  try {
12    // 检查package.json是否存在
13    const packageJsonPath = path.join(projectPath, "package.json");
14    if (!fs.existsSync(packageJsonPath)) {
15      result.errors?.push(
16        "未找到package.json文件,请确保在Vue项目根目录中运行此工具"
17      );
18      return result;
19    }
20
21    // 读取package.json
22    const packageJson = await fs.readJSON(packageJsonPath);
23
24    // 检查是否为Vue项目
25    if (!packageJson.dependencies?.vue && !packageJson.devDependencies?.vue) {
26      result.errors?.push("未检测到Vue依赖,请确保这是一个Vue项目");
27    } else {
28      result.isVue = true;
29    }
30
31    // 检查是否使用Vite
32    if (!packageJson.devDependencies?.vite) {
33      result.errors?.push("未检测到Vite依赖,此工具仅支持Vite项目");
34    } else {
35      result.isVite = true;
36
37      // 查找vite.config文件
38      const viteConfigPaths = [
39        path.join(projectPath, "vite.config.ts"),
40        path.join(projectPath, "vite.config.js"),
41      ];
42
43      for (const configPath of viteConfigPaths) {
44        if (fs.existsSync(configPath)) {
45          result.viteConfigPath = configPath;
46          break;
47        }
48      }
49
50      if (!result.viteConfigPath) {
51        result.errors?.push("未找到vite.config.ts或vite.config.js文件");
52      }
53    }
54
55    // 检查是否使用TypeScript
56    const tsConfigPath = path.join(projectPath, "tsconfig.json");
57    if (fs.existsSync(tsConfigPath)) {
58      result.hasTypeScript = true;
59      result.tsConfigPath = tsConfigPath;
60    }
61
62    // 检测包管理器
63    if (fs.existsSync(path.join(projectPath, "yarn.lock"))) {
64      result.packageManager = "yarn";
65    } else if (fs.existsSync(path.join(projectPath, "pnpm-lock.yaml"))) {
66      result.packageManager = "pnpm";
67    } else {
68      result.packageManager = "npm";
69    }
70
71    // 判断项目是否有效
72    result.isValid = result.isVue && result.isVite && !!result.viteConfigPath;
73
74    return result;
75  } catch (error) {
76    result.errors?.push(`检查项目结构时出错: ${error}`);
77    return result;
78  }
79}