处理前端第三方包重复引用问题

1,098 阅读2分钟

引言

当一个项目有几十个依赖包,并且每个依赖包都有自己的依赖包时,项目中某些依赖包很可能会重复。

比如 A 依赖了 B 的 v1.0 版本,在主项目中依赖了 B 的 v1.1 版本,两者的包都会被打进项目之中。当依赖版本可以灵活调整时,比如依赖的版本号是 ^ 开头的,两者都使用最新版本是可以互相兼容的,而现在更多的第三方依赖都会 lock 所依赖的库的版本号来稳定功能,确保不会产生第三方依赖做出了大的改动而导致报错。因此,很多时候重复依赖的问题不可避免。

解决方案

对于重复依赖的解决,要考虑 不同版本的重复依赖兼容性问题 。关于 如何判断重复包版本是否兼容可以查看 semver 语义,npm 生态的 1.x 版本管理遵守 semver 语义(0.x 的版本不受 semver 语义的限制),不过也可能因为作者的疏忽导致版本没有遵守 semver 语义。因此除了 semver 以外,我们在解决重复依赖问题的时候, 需要找到依赖影响了哪些代码,看版本是否兼容。

兼容性依赖

对于兼容性依赖,可通过统一安装统一版本依赖,减少安装依赖体积

(1)在 webpack 配置中设置 resolve.alias

统一导出某一版本的依赖实例供全局引用

// webpack.config.js
alias: {
    loadash: path.resolve(__dirname, './node_modules/lodash')
}

(2)package.json统一版本

可以通过包管理工具在 package.json 设置统一的安装依赖版本

不兼容性依赖

不兼容性升级的依赖包,暴露接口、使用方式通常发生了变化,如直接通过暴力统一安装版本,通常会导致代码执行出错,因此这种情况需要慎重考虑 升级/ 降级 相关依赖的额外工作量以及风险评估,可以根据平台检测出的重复包各个版本的体积大小,看是否有解决必要。若要统一版本,则需要查看引用、使用方式逐一进行排查。

或者直接 改用pnpm,由管理工具分析、安装依赖不同版本之间的差异

image.png