JavaScript中是否有类似TypeScript路径映射的功能?
JavaScript 本身在原生运行层面没有提供和TypeScript路径映射完全开箱即用的等价特性,但根据项目使用的运行环境、构建工具,可以通过对应配置实现完全一致的路径别名效果,和你贴的TS配置规则可以做到完全对齐。
Node.js 原生运行场景(无构建工具)
Node.js 12.0及以上版本原生支持通过package.json的imports字段配置模块路径别名,官方规范推荐别名使用#作为前缀,避免和第三方npm包名冲突,对应你给出的TS配置,等价写法如下:
{ "imports": { "#app/*": "./src/app/*.js", "#config/*": "./src/app/_config/*.js", "#environment/*": "./src/environments/*.js", "#shared/*": "./src/app/_shared/*.js", "#helpers/*": "./src/helpers/*.js" } }
配置完成后,ESM规范下的import语句可以直接使用别名导入,比如import utils from '#app/utils',Node运行时会自动解析为对应的真实文件路径。
如果是CommonJS规范的require语法、或者使用低于12.0版本的Node.js,可以通过启动时预加载路径解析钩子的方式实现别名,不过更推荐直接使用构建工具方案,兼容性更好。
使用构建/打包工具的项目场景
如果是前端项目、或者使用构建工具做代码转译的Node项目,所有主流构建工具都内置了路径别名配置能力,配置逻辑和TS的paths完全一致:
- Vite:在配置文件
vite.config.js的resolve.alias字段下配置映射规则
import { defineConfig } from 'vite' import path from 'node:path' export default defineConfig({ resolve: { alias: { '@app': path.resolve(__dirname, 'src/app'), '@config': path.resolve(__dirname, 'src/app/_config'), '@environment': path.resolve(__dirname, 'src/environments'), '@shared': path.resolve(__dirname, 'src/app/_shared'), '@helpers': path.resolve(__dirname, 'src/helpers') } } })
- Webpack/Rollup:配置逻辑和Vite基本一致,Webpack在
resolve.alias字段配置,Rollup可以通过@rollup/plugin-alias插件实现相同映射。
这类构建工具会在打包/转译阶段自动把别名路径替换为真实的相对路径,最终产物运行时不会存在路径解析问题。
复用现有TS配置的方案
如果你的项目本身保留了tsconfig.json配置(哪怕全是JS代码),不需要重复编写别名规则,可以直接复用已有的paths配置:
- 用TSC做JS代码转译时,只要在compilerOptions里开启
allowJs: true,JS文件里的别名导入会被TSC正常识别转译 - 用Vite、Webpack等工具时,也有对应插件可以直接读取
tsconfig.json里的paths规则,自动生成构建工具需要的alias配置,避免两边维护规则不一致。
注意:不要把TS的paths配置、构建工具的alias配置直接等同于Node运行时的路径解析能力,这类配置只在编译/构建阶段生效,如果直接用node命令跑未经过构建的源码,会出现模块找不到的报错,这种场景要么用Node原生的imports配置,要么在启动时加路径解析的loader。
内容的提问来源于stack exchange,提问作者DaveExotic

