Javascript 在前端项目中使用npm时避免捆绑包中的重复模块
Npm允许在一个项目中使用同一软件包的多个版本。这是一个强大的功能 然而,在大多数前端项目中,我认为不希望在不同版本中对同一个库有依赖关系 在不同版本中依赖同一个库意味着最终用户必须多次加载给定的库(作为单独的请求或更大的捆绑包的一部分) 但是,如果使用npm来管理前端项目的依赖关系,那么很快就会在不同版本的同一个库中产生依赖关系 我认为在大多数情况下,这是不必要的,而且大多数时候我们甚至不知道情况 一个简单的例子,我们在这种情况下结束: 在某个时间点,您可以在项目中安装Javascript 在前端项目中使用npm时避免捆绑包中的重复模块,javascript,npm,webpack,browserify,Javascript,Npm,Webpack,Browserify,Npm允许在一个项目中使用同一软件包的多个版本。这是一个强大的功能 然而,在大多数前端项目中,我认为不希望在不同版本中对同一个库有依赖关系 在不同版本中依赖同一个库意味着最终用户必须多次加载给定的库(作为单独的请求或更大的捆绑包的一部分) 但是,如果使用npm来管理前端项目的依赖关系,那么很快就会在不同版本的同一个库中产生依赖关系 我认为在大多数情况下,这是不必要的,而且大多数时候我们甚至不知道情况 一个简单的例子,我们在这种情况下结束: 在某个时间点,您可以在项目中安装react router
react router
和history
:
npm i -S react-router@1.0.0-rc1
npm i -S history@1.17.0
当时,react路由器
依赖于history@1.17.0
。因此,作为一个整体,您的项目只依赖于此版本的历史记录
稍后,您决定升级到最新版本的react router
:
npm i -S react-router@2
现在,react路由器
依赖于history@2
因此,您的项目现在依赖于history@1.17.0
和对history@2
历史记录的两个版本都包含在您的npm\U模块中
如果您使用的是Webpack或Browerify之类的模块绑定器,那么最终会得到一个包含历史记录
两个版本的绑定
很可能你没有注意到。但是如果您注意到,您可能会将您的直接依赖项升级为`history@2.
我们如何处理这个问题
如何确定前端项目是否依赖于不同版本的同一库?
我们如何避免最终的捆绑包比它们应该的要大?
我知道从技术上讲,npm/Webpack/Browserify在捆绑包中包含对同一个库的不同版本的依赖关系是正确的。但我正在寻找一种方法,使其易于看到这一情况的发生,以便开发人员可以采取步骤优化依赖关系
我还重新创建了这个repo中的示例:该工具可用于检查节点_modules
目录,并报告具有多个版本的包
我想在节点(modules
)级别解决这个问题是有意义的,因为这样做在WebPack和Browserify两种情况下都有效。我试图在一个非平凡的项目上找到重复的依赖项
,很难理解它报告的所有输出。我认为主要的问题是,我们也有通过npm管理的开发依赖项。而且,重复的可传递依赖关系并不是一个真正的问题。如果find duplicate dependencies
的范围仅限于依赖项,而忽略dev-dependencies,那就太好了。另外,find duplicate depencidencies
似乎不是一个广泛使用的工具(也不是在积极开发中)。我想知道其他项目是如何处理这个问题的。。。为什么没有一个“最先进的”解决方案,即一些网页教程中提到的解决方案?你的观点都是有效的,我同意你的观点。不久前,我编写了自己的工具来解析和分析我的Browserify包。在阅读了你的问题后,我想分析node_模块
应该有一些优点,然后快速搜索找到了这个工具。如果没有别的,也许这是一个起点?希望已经有人做了。