love
V2EX  ›  Node.js

npm 包管理的大坑

  •  
  •   love · Mar 4, 2015 · 6096 views
    This topic created in 4125 days ago, the information mentioned may be changed or developed.
    最近一段时间在学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冲突不应该用这种方式,一个包公开发行后应该兼容老版本,实在不行就新命名,也比到处复制不同版本的代码强。
    Supplement 1  ·  Mar 5, 2015
    嗯错怪npm了,原来npm已经为解决类似问题有个peerDependencies的概念。
    这次的问题应该是一个iojs早前版本的bug引起,升级后不能复现。
    15 replies    2015-03-12 07:57:34 +08:00
    yangff
        1
    yangff  
       Mar 4, 2015 via Android
    不同包之间是隔离的啊。。按道理说material-ui不应该把他用的react暴露出来。。
    love
        2
    love  
    OP
       Mar 4, 2015
    @yangff 大部分是隔离的,但有很多情况不是。material-ui是react的组件包,我用它创建出来的组件用在外面的那份react应用里不就打破隔离了?
    yangff
        3
    yangff  
       Mar 4, 2015 via Android
    @love 我没用过react。所以并不了解具体情况。。
    但是这种情况material-ui并没有必要也不应该自己再依赖一份react,作为组件这问题可大了。万一react的函数有副作用。。
    放到devdepandence还差不多吧。。
    yangff
        4
    yangff  
       Mar 4, 2015 via Android   ❤️ 1
    我看了一下。。他用的peerDependencies,这没问题啊。
    love
        5
    love  
    OP
       Mar 5, 2015
    @yangff 嗯我发现问题了。material-ui把react放在peerDependencies里,这应该不会在下面包含react,可是在我这里奇怪地包含了,我想想我是怎么搞成这样的。
    love
        6
    love  
    OP
       Mar 5, 2015
    @yangff 奇怪了怎么也复现不出来material-ui下面含react的效果了,把bash history里原样命令回放一遍也不行,难道和我下午更新了iojs版本从1.3x到1.4x有关。
    robertlyc
        7
    robertlyc  
       Mar 5, 2015
    默认隔离 请自行检查自己的配置
    youxiachai
        8
    youxiachai  
       Mar 5, 2015 via Android
    卡网络了。。部分包下了一半。。。
    qq286735628
        9
    qq286735628  
       Mar 5, 2015
    我只知道硬盘不够空间的时候,删除历史项目们的node_modules,腾空了10个G
    denghongcai
        10
    denghongcai  
       Mar 5, 2015
    我也是material-ui和react一起用的,没问题啊
    mcfog
        11
    mcfog  
       Mar 5, 2015 via Android
    首先有个npm dedup的操作会自动计算重复并提升

    然后就是正常情况是不会影响的,除非b库作死(比如修改String.prototype的colors)
    fansekey
        12
    fansekey  
       Mar 5, 2015
    @youxiachai NPM 是经常被阻或者自阻,其稳定性堪忧。
    robertlyc
        13
    robertlyc  
       Mar 5, 2015   ❤️ 1
    @fansekey 有国内源
    LeeeeeeezQ
        14
    LeeeeeeezQ  
       Mar 5, 2015
    楼主是把 require('react') 写成 require('React') 了吧。
    fansekey
        15
    fansekey  
       Mar 12, 2015
    @robertlyc 国内那些源我碰到过多起不同步的现象,就等 NPM3 能从根本上解决这些问题吧。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   872 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 22:05 · PVG 06:05 · LAX 15:05 · JFK 18:05
    ♥ Do have faith in what you're doing.