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

npm 包管理的大坑

  •  
  •   love · 2015-03-04 23:33:56 +08:00 · 5339 次点击
    这是一个创建于 3553 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近一段时间在学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   ·   实用小工具   ·   3164 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:43 · PVG 21:43 · LAX 05:43 · JFK 08:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.