如何阻止Monorepo中TypeScript rootDir外部的模块导入?
阻止从rootDir外部导入的解决方案
先澄清一个误解
rootDir 配置的作用是指定TypeScript编译输入文件的根目录,用于控制输出文件的目录结构,它并不会限制代码的导入范围,所以即使设置了rootDir: ".",依然可以导入外部路径的模块。
方案一:通过TypeScript paths 配置拦截外部导入
在/apps/foo/tsconfig.json的compilerOptions.paths中,添加对外部路径的映射,将其指向不存在的位置,这样TypeScript会在导入时报错:
"compilerOptions": { // 保留原有配置... "paths": { "@/*": ["*"], // 拦截所有指向packages目录的相对导入 "../../../packages/*": ["_invalid_external_import/*"] } }
当代码中出现import { type Bar } from '../../../packages/bar/types';时,TypeScript会尝试解析_invalid_external_import/bar/types,由于该路径不存在,会抛出模块找不到的错误,从而阻止这类导入。
方案二:通过ESLint规则强制禁止跨目录相对导入
如果需要更严格的代码规范检查,可以使用ESLint的import/no-relative-parent-imports规则(需安装eslint-plugin-import),禁止导入超出当前apps/foo目录的相对路径。
修改ESLint配置:
{ "rules": { "import/no-relative-parent-imports": ["error", { "allowSameParent": true }] } }
这个规则会禁止所有向上的相对导入(即../开头的导入),如果需要允许部分父目录导入,可以调整配置参数。
补充:优化tsconfig的include范围
虽然不能直接阻止导入,但可以缩小include的范围,确保只有当前app目录下的文件被编译,减少意外导入外部文件的可能:
"include": [ "vitest.config.ts", "src/**/*", "test/**/*", "testV2/**/*", "types/**/*", "bin/**/*.js", "codegen/**/*.js" ]
内容的提问来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

