如何通过ESLint禁止Monorepo同一包内从包名导入模块?
如何通过ESLint禁止Monorepo同一包内从包名导入模块?
这个需求我太懂了!之前维护monorepo的时候,团队里经常有人图方便直接用包名导入同一包内的模块,时间久了不仅路径混乱,还容易引发一些奇怪的依赖问题。刚好有两种靠谱的解决办法,给你分享下~
方法一:用专门的Monorepo ESLint插件(推荐)
最省心的方式是用eslint-plugin-monorepo,它专门针对monorepo场景做了规则优化,其中的no-internal-import规则正好能解决你的问题。
步骤:
- 先安装插件
# npm npm install eslint-plugin-monorepo --save-dev # yarn yarn add eslint-plugin-monorepo --dev # pnpm pnpm add eslint-plugin-monorepo --save-dev - 在ESLint配置文件(比如
.eslintrc.js)里启用规则module.exports = { // 注册插件 plugins: ['monorepo'], rules: { // 开启禁止同一包内用包名导入的规则,设为error级别强制生效 'monorepo/no-internal-import': 'error' } }
这个规则会自动识别每个包的package.json位置,当你在某个包内部用包名导入自身模块时,就会直接抛出ESLint错误——比如你在@lib/utils包内写import { convertNames } from '@lib/utils',就会被提示换成相对路径导入。
方法二:自定义no-restricted-imports规则(无需额外插件)
如果你不想新增依赖,可以通过eslint-plugin-import自带的no-restricted-imports规则,结合路径过滤来实现需求。
配置示例:
const path = require('path'); module.exports = { rules: { 'no-restricted-imports': [ 'error', { patterns: [ { // 匹配所有从@lib/utils导入的路径 group: ['@lib/utils/**'], // 错误提示信息 message: '请使用相对路径导入同一包内的模块', // 只在@lib/utils包内部生效的过滤逻辑 filter: (importPath, context) => { // 从当前文件路径向上找包的package.json const pkgPath = path.resolve(path.dirname(context.getFilename()), '../../package.json'); try { const pkg = require(pkgPath); // 判断当前文件是否属于@lib/utils包 return pkg.name === '@lib/utils'; } catch (e) { // 找不到package.json的话就不生效 return false; } } } ] } ] } }
这种方法的缺点是需要针对每个包单独写过滤逻辑,如果你有很多包的话维护起来会比较麻烦,所以更推荐第一种插件的方式。
备注:内容来源于stack exchange,提问作者Marco Silvestroni
相关产品推荐
相关产品推荐

