美文网首页
使用pnpm给第三方包打补丁

使用pnpm给第三方包打补丁

作者: 菜蚴菜 | 来源:发表于2022-09-21 10:35 被阅读0次
    以修改 vue-echarts包为例

    1、在node_modules中查看该包实际安装的版本,假设为6.1.0版本
    2、在package.json中锁定该版本

    "vue-echarts": "6.1.0",
    

    3、先删除项目中的node_modules包
    安装或升级pnpm不小于7.4.0版本

    npm install -g pnpm
    

    4、运行 pnpm patch <pkg name>@<version>

     pnpm patch vue-echarts@6.1.0
    

    该命令将导致一个包被提取到一个可以随意编辑的临时目录中。
    5、在该临时目录中修改三方的包
    完成更改后,运行pnpm patch-commit <path>(path为临时目录地址)以生成补丁文件并通过该字段<path>将其注册到您的顶级清单中
    运行后会在顶级目录
    ①、package.json中出现

      "pnpm": {
        "patchedDependencies": {
          "vue-echarts@6.1.0": "patches/vue-echarts@6.1.0.patch"
        }
      }
    

    ②、多了一个patches目录


    image.png

    6、重新安装依赖pnpm i
    会发现node_modules中对应的vue-echarts包相应的内容已经被更改

    使用vue-echarts遇到的一个坑

    vue-echarts 6.1.0版本使用图表配置autoresize=true时,在监控软件上会报ResizeObserver loop limit exceeded,查看源码发现是因为useAutoresize中throttle使用了防抖,造成图表的resize过于频繁的进行了更改。

        function useAutoresize(chart, autoresize, root) {
            var resizeListener = null;
            vueDemi.watch([root, chart, autoresize], function (_a, _, cleanup) {
                var root = _a[0], chart = _a[1], autoresize = _a[2];
                if (root && chart && autoresize) {
                    resizeListener = core.throttle(function () {
                        chart.resize();
                    }, 100);
                    addListener(root, resizeListener);
                }
                cleanup(function () {
                    if (resizeListener && root) {
                        removeListener(root, resizeListener);
                    }
                });
            });
        }
    

    修改为

        function useAutoresize(chart, autoresize, root) {
            var resizeListener = null;
            vueDemi.watch([root, chart, autoresize], function (_a, _, cleanup) {
                var root = _a[0], chart = _a[1], autoresize = _a[2];
                if (root && chart && autoresize) {
                    resizeListener = core.throttle(function () {
                        chart.resize();
                   }, 300,true);//1、加入true 让throttle用节流控制的方式运行,2、增加时间间隔变为300ms
                    addListener(root, resizeListener);
                }
                cleanup(function () {
                    if (resizeListener && root) {
                        removeListener(root, resizeListener);
                    }
                });
            });
        }
    
    参考

    pnpm:https://pnpm.io/cli/patch

    相关文章

      网友评论

          本文标题:使用pnpm给第三方包打补丁

          本文链接:https://www.haomeiwen.com/subject/asubortx.html