npm 包管理的大坑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
love
V2EX    Node.js

npm 包管理的大坑

  •  
  •   love 2015-03-04 23:33:56 +08:00 5821 次点击
    这是一个创建于 3950 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近一段时间在学nodejs,一路填了一些坑,今天又被一坑浪费了半天。

    npm的包和python之类的不同,它是层次式的,就是说我依赖A包和B包,A包也依赖B包,这时会在A包目录下会有一个重复的B包,这时问题来了,会在内存中同时有二个B包,而A包里的B包和我这边的B包会有冲突(因为我在用A的过程中难免会间接用到里面的B包)。

    之前在用gulp时发生过这种问题,今天在用material-ui包时也有问题。因为我本身依赖react包,而maerial-ui也有一份react,这时诡异的问题就来了啊!!!用Menu组件也会出现异常(即使用在一个最简单的例子里),把node_modules/material-ui/node_modules/react删除就正常了(因为这样的话就会用顶层的react包)。

    总之,npm这样的方式我觉得坏处大于好处,解决API冲突不应该用这种方式,一个包公开发行后应该兼容老版本,实在不行就新命名,也比到处复制不同版本的代码强。
    第 1 条附言    2015-03-05 07:42:38 +08:00
    嗯错怪npm了,原来npm已经为解决类似问题有个peerDependencies的概念。
    这次的问题应该是一个iojs早前版本的bug引起,升级后不能复现。
    15 条回复    2015-03-12 07:57:34 +08:00
    yangff
        1
    yangff  
       2015-03-04 23:43:39 +08:00 via Android
    不同包之间是隔离的啊。。按道理说material-ui不应该把他用的react暴露出来。。
    love
        2
    love  
    OP
       2015-03-04 23:46:07 +08:00
    @yangff 大部分是隔离的,但有很多情况不是。material-ui是react的组件包,我用它创建出来的组件用在外面的那份react应用里不就打破隔离了?
    yangff
        3
    yangff  
       2015-03-04 23:51:05 +08:00 via Android
    @love 我没用过react。所以并不了解具体情况。。
    但是这种情况material-ui并没有必要也不应该自己再依赖一份react,作为组件这问题可大了。万一react的函数有副作用。。
    放到devdepandence还差不多吧。。
    yangff
        4
    yangff  
       2015-03-04 23:53:53 +08:00 via Android   1
    我看了一下。。他用的peerDependencies,这没问题啊。
    love
        5
    love  
    OP
       2015-03-05 00:03:02 +08:00
    @yangff 嗯我发现问题了。material-ui把react放在peerDependencies里,这应该不会在下面包含react,可是在我这里奇怪地包含了,我想想我是怎么搞成这样的。
    love
        6
    love  
    OP
       2015-03-05 00:17:20 +08:00
    @yangff 奇怪了怎么也复现不出来material-ui下面含react的效果了,把bash history里原样命令回放一遍也不行,难道和我下午更新了iojs版本从1.3x到1.4x有关。
    robertlyc
        7
    robertlyc  
       2015-03-05 00:36:32 +08:00
    默认隔离 请自行检查自己的配置
    youxiachai
        8
    youxiachai  
       2015-03-05 00:48:41 +08:00 via Android
    卡网络了。。部分包下了一半。。。
    qq286735628
        9
    qq286735628  
       2015-03-05 01:12:40 +08:00
    我只知道硬盘不够空间的时候,删除历史项目们的node_modules,腾空了10个G
    denghongcai
        10
    denghongcai  
       2015-03-05 01:16:25 +08:00
    我也是material-ui和react一起用的,没问题啊
    mcfog
        11
    mcfog  
       2015-03-05 08:41:31 +08:00 via Android
    首先有个npm dedup的操作会自动计算重复并提升

    然后就是正常情况是不会影响的,除非b库作死(比如修改String.prototype的colors)
    fansekey
        12
    fansekey  
       2015-03-05 09:36:29 +08:00
    @youxiachai NPM 是经常被阻或者自阻,其稳定性堪忧。
    robertlyc
        13
    robertlyc  
       2015-03-05 09:59:21 +08:00   1
    @fansekey 有国内源
    LeeeeeeezQ
        14
    LeeeeeeezQ  
       2015-03-05 13:16:07 +08:00
    楼主是把 require('react') 写成 require('React') 了吧。
    fansekey
        15
    fansekey  
       2015-03-12 07:57:34 +08:00
    @robertlyc 国内那些源我碰到过多起不同步的现象,就等 NPM3 能从根本上解决这些问题吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1503 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:32 PVG 00:32 LAX 08:32 JFK 11:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86