'use strict'; /** * 语法自检脚本:递归 `require` 所有源码文件,捕获语法错误与模块加载错误。 * * 之所以不引入 ESLint,是为了不额外增加依赖与配置; * 本脚本已能覆盖「语法错误 / 顶层抛异常 / 循环依赖缺失导出」这类最常见问题。 */ const fs = require('fs'); const path = require('path'); const ROOT = path.join(__dirname, '..', 'src'); const failures = []; let checked = 0; /** * 递归遍历目录下的所有 .js 文件。 * @param {string} dir * @returns {string[]} */ function walk(dir) { const out = []; for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { const full = path.join(dir, entry.name); if (entry.isDirectory()) { if (entry.name === 'node_modules' || entry.name === 'public') continue; out.push(...walk(full)); } else if (entry.name.endsWith('.js')) { out.push(full); } } return out; } for (const file of walk(ROOT)) { checked++; try { require(file); } catch (err) { failures.push(`${path.relative(ROOT, file)}: ${err.message}`); } } if (failures.length > 0) { console.error(`语法自检失败(${failures.length}/${checked}):`); for (const failure of failures) console.error(' - ' + failure); process.exit(1); } console.log(`语法自检通过:${checked} 个文件`);