当前位置: 首页 > 后端技术 > Node.js

Nodejs包依赖管理

时间:2023-04-03 20:44:34 Node.js

鲜花总需要绿叶来衬托。对比php、java、python的包依赖管理,突然觉得nodejs的包依赖机制真的很美。本文不吐槽python的包管理有多么困难和混乱,也不批评php包管理的弱点,只讨论如何优雅地使用npm进行包依赖管理。告别npm2.x,拥抱npm3.x+升级到3.x执行如下命令:npminstall-gnpm@3首先,上图中A和C都依赖B,但是A依赖Bv1。0,但是C它依赖于Bv2.0。在npm2中,它直接将B放在了A的node_modules文件夹中,而npm3的处理方式是将Bv1.0提取出来作为一个单独的模块,C依赖,Bv2.0单独放在C中。在实际项目中,npm2会产生很多冗余引用,node_modules也会很大,npm3将结构扁平化。其实项目依赖的版本已经很一致了。C很少单独依赖Bv2.0,所以npm3处理的node_modules更小,更高效。而且npm3.x与npm2.x兼容,不用担心。可以深入阅读文档:http://www.alloyteam.com/2016...注意版本号的控制方法打开package.json文件,经常会看到里面定义了很多依赖dependencies,一般有以下几种形式:*:任意版本1.1.0:指定版本~1.1.0:>=1.1.0&&<1.2.0^1.1.0:>=1.1.0&&<2.0.0上面的规则已经很清楚的描述了各种符号的含义。那么我们回到使用场景,什么时候锁版,什么时候用~,什么时候用^?我的理解是这样的:(1)如果你对依赖包的稳定性有极高的要求,不想有什么更新,那你就需要锁版本。1.1建议项目中核心包锁定某个稳定版本。比如在一个react项目中,应该锁定react版本。在未完成测试之前,不能随意升级版本,小版本升级也不行。1.2如果知道包的开发者不稳定,经常更新不稳定的版本,也需要锁版本,比如antd;(2)如果你想小范围升级依赖包,并且确定不会影响稳定性,并且可以享受到更新带来的好处,那么可以使用~符号(3)如果你对包的稳定性要求不高,确定大版本的更新不会影响稳定性,可以长期使用^符号,但一定要小心;开源项目一般使用~或^符号来管理版本。有兴趣的同学可以阅读以下文档:关于版本号的正确打开方式:http://taobaofed.org/blog/201...注意从npm2升级到npm3需要删除旧的node_modules文件夹。尽管npm3会与npm2兼容,但历史问题往往难以预防。最好的办法是把旧的擦掉,放上新的。比如昨晚放茶,今天倒新泡的茶,味道会不如新茶,甚至会拉肚子。上面的文字已经解释了npm2和npm3的机制,貌似没什么问题。请注意,在C中引用Bv2是将Bv2放在C的node_modules文件夹下,新旧切换时,必须考虑npm引用包的顺序,如果一个包下有node_modules文件夹,npm会先在node_modules中寻找这个包,然后到外层,最后到全局。这是npm2的残余如此顽固的时候,因为它将依赖项放在它自己的node_modules文件夹中。对此,没有更好的办法,只能删除重新安装。所以在发布和构建的时候一定要注意npm的版本,考虑从2切换到3时可能存在的风险,笔者在这方面已经吃亏了。