前情提要:
项目被某个开发引用了一个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了,但是还能下载...
因为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方法做到节点懒加载,可以减少节点生命周期带来的开销,以此不在依赖这个包