引言:“你的老朋友require突然隐身了”
\n\n你在编写TypeScript,一切进展顺利,然后——砰!编译器抛出一条冰冷的消息:“TS2304:找不到名称'require'”。熟悉吗?如果你从JavaScript转向TypeScript,或者正在处理Node.js项目,你很可能遇到过这个“幽灵”。到2025年,这个错误在Stack Overflow上仍然高居榜首(超过20万次浏览),但好消息是:它很容易被攻克。
\n\n在本文中,我们将分析为什么TypeScript看不到require,需要调整哪些配置,以及——最重要的是——如何编写现代代码,从而一劳永逸地忘记这个问题。我们开始吧!
什么是TS2304以及它为什么会出现?
\n\nTS2304:找不到名称'require'错误在TypeScript找不到全局函数require的定义时出现。在JavaScript中(尤其是在Node.js环境中),require是用于以CommonJS风格导入模块的原生函数。但TypeScript默认不知道Node.js环境。它认为你在浏览器中工作,而浏览器中不存在require。
典型场景:
\n\n// app.ts\nconst express = require('express');\n// ❌ TS2304:找不到名称'require'\n\n\n到2025年,TypeScript(已经是5.x版本)默认使用ES模块(import/export)。如果你试图在没有正确配置的情况下使用require,编译器会合理地提出抗议。
错误的主要原因:
\n- \n
- 未安装
@types/node包 — TypeScript不知道Node.js的全局API。 \n tsconfig.json配置错误 — 缺少types: ["node"]或module与CommonJS不匹配。 \n - 使用过时的语法 — 在2025年,最好使用
import代替require。 \n - CommonJS与ESModules之间的冲突 — 项目配置为ES模块,但你却用CommonJS风格编写代码。 \n
方法#1:安装@types/node(快速解决方案)
\n\n最简单且最常见的方法——让TypeScript“看到”Node.js。为此,请安装类型包:
\n\nnpm install --save-dev @types/node\n\n\n之后,在tsconfig.json中添加:
{\n "compilerOptions": {\n "types": ["node"]\n }\n}\n\n\n现在TypeScript知道了require函数、__dirname、process以及其他Node.js全局对象。错误将消失。
优点:快速,开箱即用。
\n缺点:你继续使用过时的CommonJS语法。
方法#2:配置moduleResolution和esModuleInterop
\n\n如果你希望在配置为现代模块的项目中使用require,请在tsconfig.json中添加以下选项:
{\n "compilerOptions": {\n "module": "commonjs",\n "moduleResolution": "node",\n "esModuleInterop": true,\n "allowSyntheticDefaultImports": true\n }\n}\n\n\n- \n
"module": "commonjs"— 明确指定输出代码将为CommonJS格式。 \n "moduleResolution": "node"— 像Node.js一样查找模块(首先查找node_modules)。 \n "esModuleInterop": true— 允许通过import导入CommonJS模块(反之亦然)。 \n "allowSyntheticDefaultImports": true— 允许从没有默认导出的模块进行默认导入。 \n
可工作代码示例:
\n\nimport express = require('express');\n// 或者甚至\nconst express