如何在项目中强制使用lodash-es替代lodash?
除了你提到的ESLint no-restricted-imports 规则外,还有4种可落地的实现方案,覆盖类型校验、构建、依赖安装多个层面:
1. TypeScript 原生配置拦截
修改项目tsconfig.json,从类型解析层面屏蔽@types/lodash的自动加载,同时重定向lodash相关导入的类型指向:
{ "compilerOptions": { // 显式指定只加载需要的类型包,禁止TS自动扫描node_modules/@types下的所有包 "types": ["@types/lodash-es"], // 将所有lodash开头的导入类型映射到lodash-es "paths": { "lodash": ["node_modules/@types/lodash-es/index.d.ts"], "lodash/*": ["node_modules/@types/lodash-es/*"] } } }
配置后TS不会再自动加载@types/lodash的类型,自然不会出现提示引入@types/lodash的问题。
2. 构建工具别名重定向
从构建环节直接替换导入路径,就算代码里写错了import xxx from 'lodash/xxx',最终打包也会自动转成lodash-es的ESM产物。
以Vite为例,配置如下:
// vite.config.ts import { defineConfig } from 'vite' import path from 'node:path' export default defineConfig({ resolve: { alias: [ { find: /^lodash$/, replacement: path.resolve(__dirname, 'node_modules/lodash-es/lodash.js') }, { find: /^lodash\/(.*)$/, replacement: path.resolve(__dirname, 'node_modules/lodash-es/$1.js') } ] } })
Webpack、Rollup、Rspack等构建工具都有对应的alias配置能力,逻辑完全一致。
3. 包管理器依赖覆写
因为@types/lodash-es本身依赖@types/lodash,无法直接通过卸载依赖的方式移除它,可以通过包管理器的overrides能力,把所有依赖树里对@types/lodash的引用,直接指向本地安装的@types/lodash-es,从根源上避免两个类型包共存的问题。
以pnpm为例,在package.json中添加配置:
{ "pnpm": { "overrides": { "@types/lodash": "npm:@types/lodash-es@^4.17.12" } } }
npm 8+ 同样支持overrides配置,yarn可以使用resolutions字段实现相同效果,配置后重新执行依赖安装命令即可生效。
4. 全局类型声明兜底
在项目全局类型目录(一般是src/types或者tsconfig里配置的typeRoots目录)下新增lodash.d.ts文件,手动声明lodash模块的类型规则:
declare module 'lodash' { // @ts-ignore 禁止引入CommonJS版本lodash,请统一使用lodash-es export * from 'lodash-es'; } declare module 'lodash/*' { // @ts-ignore 禁止引入CommonJS版本lodash,请统一使用lodash-es const content: never; export default content; }
配置后只要代码里从lodash路径导入,TS会直接抛出错误提示,强制开发者使用lodash-es。
内容的提问来源于stack exchange,提问作者Matthieu Riegler

