好神奇的, 很容易就能冲突, npm我也是服了.

描述一下场景
  • 某个项目依赖a,b,c, 3个包.
  • 然后a, b都分别依赖c.
  • 然后, 竟然就莫名的从a包的依赖里面找c包用, 而不是直接用最外层的c包.
一通尝试, 并没有解决

rm -rf node_modules  #清空node_modules
cnpm install  #这个并没有解决.
cnpm install --save  mcktools  #这个并不能解决问题

npm cache clean --force
rm -rf node_modules  
cnpm install 

然而这样并没有解决, 哎, 还是在依赖中写死版本号吧, 不然真的太难受了.

其实不能算解决方案
  • 幸亏a, b, c都是我自己的项目, 所以我把它们互相的依赖都写死版本号.
  • 如果是别人的项目咋办? 给作者提issue吧, 让作者写死依赖版本号.
最终的真相是这样的
  • 我的c包的0.9版本是有问题的.
  • 然后, a包引入latest版本, 恰好就是这个0.9的版本.
  • 如果代码没有调用a包的任何功能, 那么不会触发, 如果调用了a包, npm不管你是否使用了c包中的有问题的部分, 他都自动先解析一遍import和export, 因为es6是支持import/export的副作用的. 所以这里就悲剧了.

归根结底, js为毛要支持export/import的副作用? 好吧, 支持就支持吧, 既然支持副作用, 为毛不支持这个地方try catch?