likes
comments
collection
share

webpack反编译思路分享

作者站长头像
站长
· 阅读数 51

本文从思路上解析,如何进行反编译,提取第三方库。

任务说明

接到任务,阅读editor,JsBarcode,两个模块的代码解析、注释工作

为什么要编译?

因为要进行二次开发,在看不懂的方法上注释或者采用原方法替换,方便后面的人更新维护项目

查看代码,找出任务核心点

目的—并不是为了给所有的代码写注释,而是为了方便项目后面的迭代更新

反编译前的代码

webpack反编译思路分享

疑问?

有没有办法不阅读十万行的代码,用官方的编译库替换现有的webapck编译,这样引入的第三方库编译文件就不用看每个方法了

三种思路分析对比—以JsBarcode为例

A思路: 1、找到JsBarcode的官方编译库 all.min .js,以这个文件为参考,找到项目中所有的JS中,有二维码的方法,统一放到这个文件中,再进行替换?

B思路: 创建一个示例demo.html文件,把找到的JsBarcode相关的js文件放到这个html文件中引入调用? 百分百会报错,然后根据这个报错去找对应的方法? 这个方法的问题在于,如何初始化引入?以前没做过。

C思路: 了解webapck编译文件的编译思路,找到当前方法的对应的原方法,将找到的方法,全部干掉,再引入all.min.js文件,能跑得通,不会有bug就OK了。可能造成的问题,现有文件中,有可能有没有被调用的方法遗留。

确定思路

反复思考可行性及耗费的工作量,最终确定C思路 计划耗时一天的时间,挑选一个小的第三方库JsBarcode,跑通主流程。 如果可以按这个思路,改写剩下的三个第三方库的引入,将大大减少工作量。 如果超过一天的时间,不通,放弃,按原计划,阅读近十万的代码,写注释。

分析webapck编译文件,了解编译思路

找到编译文件入口文件:main.js 参照教程:<简要分析webpack打包后代码>,注释代码分析编译思路

webpack反编译思路分享

核心方法分析

function __webpack_require__(moduleId) {
        // moduleId 模块的ID名
        if (installedModules[moduleId]) 
            return installedModules[moduleId].exports;
        var module = installedModules[moduleId] = {
            i: moduleId, 
            l: false,
            exports: {}
        };
        // 逗号运算符,先计算左边的参数,再计算右边的参数值。然后返回最右边参数的值
        return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), module.l = true, module.exports
        // call能确保当模块中使用this的时候,this是指向module.exports的
        // 返回模块的导出
        // 返回module.exports(注意modules[moduleId].call的时候module.exports会被修改)
    }

链式递归调用

webpack反编译思路分享

替换流程

1、通过打点方法找到调用入口: function (e, t, n) {},每一个方法对应一个数值,如568,调用语句n(568),通过打console.log(‘e’,e)方法找到JsBarcode调用入口,e中能看到调用方法数值

2、在主文件index.ftl文件中引入官方的编译包: <script src="JsBarcode.all.js"></script>

3、改写调用入口:e.exports = n(526) 为 e.exports = JsBarcode

4、运行项目,查看修改调用是否有bug

5、确定替换成功,删除原有的方法内容,不能删除方法名,需要保存调用链的顺序,删除方法如下:

function (){},
function (){},
function (){},

结语

  • 经过替换流程后,已成功将 JsBarcode官方编译库替换现有的编译文件,JsBarcode涉及到的代码就不需要再去阅读,写注释
  • 需要改写源代码也可以在源文件中编写,再编译代码替换引用包JsBarcode.all.js
  • 参照这个模式替换了XX,XX,XX总共八万多行编译代码
  • 只剩下XX没有用这种方法改写引入,因为现有的项目中,改写了这个第三方库,不能用这种模式替换,需要参照项目重写XX库,经与项目负责人商讨,暂时不改写。
转载自:https://juejin.cn/post/6959578684386705416
评论
请登录