“requires 模块”不存在于标准生态,无法用于编译期检查,因其本质是运行时机制;真正有效的编译期拦截方式是使用ESM import语法配合tsconfig严格配置,使tsc在编译时即报“Cannot find module”错误。

requires 模块不是 Node.js 原生模块,也不参与编译阶段——它根本不存在于标准 JavaScript 或 TypeScript 生态中。因此,**无法利用 “requires 模块” 在编译阶段拦截缺失依赖导致的变量引用错误**。
为什么 “requires 模块” 不能用于编译期检查?
• Node.js 的 require() 是运行时动态加载机制,发生在代码执行阶段,而非编译(或类型检查)阶段;
• TypeScript 编译器(tsc)本身不解析或执行 require() 调用,它只基于类型声明(.d.ts)、ESM import 语句及模块解析配置做静态分析;
• 不存在名为 requires 的官方或广泛采用的编译期依赖校验工具模块——可能是对 require 的拼写误写,或混淆了 Webpack 的 require.context、Rollup 的 external 配置、或 ESLint/TypeScript 的导入检查规则。
真正能在编译/检查阶段拦截缺失依赖错误的实用方式
• 使用 TypeScript 的 import 语法 + 严格模块解析:将 require('xxx') 改为 import * as xxx from 'xxx' 或 import xxx from 'xxx',并确保 tsconfig.json 中启用:
– "module": "commonjs" 或 "nodenext"
– "moduleResolution": "node16" 或 "bundler"
– "noImplicitAny": true 和 "strict": true
这样,TS 会在编译时报错:无法找到模块 'xxx',或无法解析模块路径;
• 启用 TypeScript 的 --noUnusedLocals 和 --noUnusedParameters,配合 import,可间接暴露“引入但未使用”的依赖,提示冗余或误写;
• 用 ESLint + @typescript-eslint 插件校验 require 调用:虽然 require 是运行时的,但插件如 eslint-plugin-import 可在 lint 阶段静态分析 require() 字符串字面量,报告未安装、路径错误、循环依赖等问题(需配合 settings.import/resolver 配置);
• 构建工具层预检(如 ts-node + --files 或 vite build --mode production):触发 TS 全量类型检查,提前暴露 import 解析失败,等效于“编译阶段拦截”。
一个典型实战对比
❌ 错误做法(期望 requires 拦截,实际无效):
const utils = requires('utils-missing');
→ 运行时报 Error: Cannot find module 'utils-missing',编译和类型检查完全无感知;
✅ 正确做法(TS 编译期即报错):
import * as utils from 'utils-missing';
→ tsc 编译直接报:Cannot find module 'utils-missing'. Did you mean to set the 'moduleResolution' option?











