记录一次npm依赖包被乱使用后的优化

232 阅读2分钟
前情提要:

项目被某个开发引用了一个npm包vue-giant-tree,原因是使用tree数据太过庞大,使用el-tree的话,每个节点都是响应式,导致每次渲染树都需要大约7S左右。
描述一下这个包,这个包通过jQuery实现树的功能,npm发布的文件没有源码,直接是打包后的文件。打包后的文件有两个规范,一个是commomjs,一个是umd,没有esm。这个包外部依赖jQuery,安装这个包的话还得自己在安装一份jQuery.

问题来了,他在装vue-giant-tree后,发现还要安装jQuery,于是又安装了jQuery,结果jQuery还有两个版本(我也是在后面处理的时候了解的): jquery 和 jQuery,前者是给浏览器之类使用的,后者是给nodejs使用的,而且jQuery已经不再支持,改名叫node-jquery了,但是还能下载...

image.png

因为vue-giant-tree没有esm规范,所以他可能看到提示说缺少jQuery,于是理所当然安装了jQuery,可这是nodejs版本的,安装完jQuery,jQuery又提示他安装location navigator xmlhttprequest...这些都是nodejs才需要依赖的,PC根本就不需要。

后面他的代码被合到公共开发分支了,虽然npm run build又不是不能用,但是以我的代码洁癖(经历了太多次毒打,已经没那么苛刻了,但是这个我还是忍不了),我决定优化一下。

优化过程:

首先,我不想找其他的什么包替换vue-giant-tree,可能有更好的,但是这是别人的代码,我不想整个都帮他重写。所以还是继续使用vue-giant-tree。
其次,我要把jQuery去掉,换成jquery,同时删除不需要的location navigator等等的包

之后我查看他的common规范的代码,发现这个代码有两个使用jQuery的方式:

(function ($) {
 // ...
}(jQuery));

module.exports = require("jQuery");

对于第一种,属于全局方式引用,通过ProvidePlugin实现:

webpack:
// ...
plugins: [
  // ...
  new webpack.ProvidePlugin({ jQuery: 'jquery' })
  // ...
]

对于第二种,使用别名,将jQuery替换成jquery

webpack:
// ...
resolve: {
  alias: {
      // ...
      jQuery: 'jquery'
  }
}

这样就可以了

后续思考:

发现也可以使用element tree 配合 tree的load方法做到节点懒加载,可以减少节点生命周期带来的开销,以此不在依赖这个包