不灭的焱

革命尚未成功,同志仍须努力 下载Go 下载Java

作者:AlbertWen  添加时间:2026-01-29 14:44:51  修改时间:2026-01-29 16:50:32  分类:06.前端/Vue/Node.js  编辑

核心区别

简单来说,两者的核心差异在于模块路径的书写规则解析逻辑

  • 相对模块:路径以 ./(当前目录)、../(上级目录)开头,是 “相对于当前文件位置” 的导入方式,主要用于项目内部的文件引用。
  • 绝对模块:路径不以 .//../ 开头(比如直接写 utils@/components/Button),是 “基于配置的根目录” 的导入方式,需要配合 TS 配置(tsconfig.json)指定解析规则,常用于简化深层嵌套的路径,或引用第三方库 / 全局模块。

详细示例与解析

先搭建一个典型的 TS 项目结构,方便后续举例:

my-project/
├── src/
│   ├── components/
│   │   └── Button.ts   // 组件文件
│   ├── utils/
│   │   └── math.ts     // 工具函数
│   └── pages/
│       └── Home.ts     // 业务页面
└── tsconfig.json       // TS 配置文件

1. 相对模块(Relative Modules)

特点:路径从当前文件的位置出发,通过 .//../ 定位目标文件,无需额外配置,是最基础的导入方式。

示例 1:同级 / 下级目录导入

src/pages/Home.ts 中导入同级 / 下级文件(这里假设 Home 同级有 common.ts):

// src/pages/Home.ts
// 导入同级的 common.ts(./ 表示当前目录)
import { formatDate } from './common';
// 导入上级目录的 utils/math.ts(../ 表示上级目录)
import { add } from '../utils/math';
// 导入上级目录的 components/Button.ts(多级上级)
import Button from '../components/Button';

示例 2:深层嵌套的问题

如果项目层级很深,相对路径会变得冗长且易出错,比如:

// 假设在 src/a/b/c/d.ts 中导入 src/utils/math.ts
import { add } from '../../../../utils/math'; // 多层 ../ 可读性差

2. 绝对模块(Absolute Modules)

特点:路径不以 .//../ 开头,需要在 tsconfig.json 中配置 baseUrlpaths 来指定模块的根目录,解析时会从配置的根目录出发查找文件,简化路径书写。

配置前提(修改 tsconfig.json)

先在 tsconfig.json 中配置核心参数(关键):

{
  "compilerOptions": {
    "baseUrl": "./src", // 设定模块解析的根目录为 src 文件夹
    "paths": {
      // 可选:配置路径别名(更灵活的绝对路径)
      "@/*": ["*"] // 用 @ 代替 src 根目录,* 匹配后续路径
    },
    "module": "ESNext", // 模块系统(ES6 模块)
    "moduleResolution": "NodeNext" // 模块解析策略(推荐)
  },
  "include": ["src/**/*"]
}

示例 1:基于 baseUrl 的绝对导入

配置 baseUrl: "./src" 后,所有绝对路径都会从 src 目录开始解析:

// src/pages/Home.ts
// 绝对路径:直接从 src 根目录找 utils/math.ts
import { add } from 'utils/math';
// 绝对路径:从 src 根目录找 components/Button.ts
import Button from 'components/Button';

示例 2:基于 paths 别名的绝对导入(更常用)

配置 paths: { "@/*": ["*"] } 后,可用 @ 代替 src 根目录,是业界主流写法:

// src/pages/Home.ts
// 别名绝对路径:@ 等价于 src 目录
import { add } from '@/utils/math';
import Button from '@/components/Button';

// 即使深层嵌套文件,路径也简洁
// src/a/b/c/d.ts 中导入
import { add } from '@/utils/math'; // 无需多层 ../

示例 3:第三方库的绝对导入

我们日常导入 reactlodash 等第三方库时,本质也是绝对模块导入(TS/Node 会自动从 node_modules 解析):

// 绝对模块:直接写库名,无需路径前缀
import React from 'react';
import _ from 'lodash';

关键对比表

特性 相对模块 绝对模块
路径开头 以 .// ../ 开头 不以 .// ../ 开头
解析依据 相对于当前文件位置 基于 tsconfig.json 的 baseUrl/paths
适用场景 简单项目、少量层级引用 复杂项目、深层嵌套路径、统一路径规范
可读性 层级深时差(多 ../) 始终简洁
配置要求 无需配置 需配置 tsconfig.json

总结

  1. 相对模块:路径以 .//../ 开头,基于当前文件位置解析,无配置成本,适合简单项目或少量层级的内部引用;
  2. 绝对模块:路径无 .//../ 前缀,需通过 tsconfig.jsonbaseUrl/paths 配置根目录 / 别名,解析更统一,适合复杂项目简化深层路径;
  3. 第三方库的导入(如 import React from 'react')属于天然的绝对模块,TS 会自动从 node_modules 解析。