模块解析策略的两种模式是什么?

介绍 TypeScript 中模块解析的两种模式及其区别。

TypeScript 中等 模块解析 模块系统 配置

模块解析(Module Resolution)指编译器在查找导入模块内容时遵循的策略。在 TypeScript 中,通过 tsconfig.jsonmoduleResolution 选项配置,支持 classicnode 两种模式。以下是详细介绍:

  1. classic 模式(经典模式)
    • 此为 TypeScript 1.6 版本之前的默认策略,设计基于老旧系统兼容性。
    • 解析规则:仅支持相对路径导入(如 import "./moduleA"),不支持非相对路径导入模块(如 import "moduleB")和 node_modules 目录查找。
    • 使用场景:适用于遗留项目或特殊兼容需求,但现代开发中已不常采用。
    • 示例配置:
      // tsconfig.json
      {
        "moduleResolution": "classic"
      }
      
    • 潜在问题:可能导致依赖库解析失败(如 error TS2307: Cannot find module),且无法处理新式模块规范。
  2. node 模式(节点模式)
    • 模拟 Node.js 的模块解析机制,自 TypeScript 1.6 起成为推荐策略,支持现代标准如 CommonJS 或 ES Modules。
    • 解析规则:支持相对路径和非相对路径(如 import "jQuery"),能自动查找 node_modules 下的依赖并处理类型声明文件。
    • 主要特点:
      • 基于 baseUrl 解析非相对路径。
      • 结合 paths 选项配置模块映射(如 "paths": { "*": ["./types/*"] })增强灵活性。
    • 优势:整合度高、兼容第三方库,有效管理类型定义。
    • 示例配置:
      // tsconfig.json
      {
        "moduleResolution": "node",
        "baseUrl": "./src",
        "paths": { "*": ["./types/*"] }
      }
      

差异总结

  • classic 简洁但受限,易出错;
  • node 功能强大,优先支持 Node.js 路径协议(如 moduleResolution: "NodeNext"),推荐现代项目。
    实际选择需结合项目环境(如是否结合 baseUrlpaths),以规避常见解析错误。