browserify压缩合并源码反编译

简介:

最近在学习钉钉(一个协作应用)桌面应用的前端源码时候,发现其js源码是用browserify做模块开发。于是想还原其源码的原本的目录结构,学习它的目录分类以及业务划分。

前言

用过browserify构建工具的应该清楚,在压缩合并后的代码的最前面,有处理模块依赖关系的代码:

复制代码
function e(t, n, r) {
    function s(o, u) {
        if (!n[o]) {
            if (!t[o]) {
                var a = typeof require == "function" && require;
                if (!u && a) return a(o, !0);
                if (i) return i(o, !0);
                var f = new Error("Cannot find module '" + o + "'");
                throw f.code = "MODULE_NOT_FOUND",
                f
            }
            var l = n[o] = {
                exports: {}
            };
            t[o][0].call(l.exports,
            function(e) {
                var n = t[o][1][e];
                return s(n ? n: e)
            },
            l, l.exports, e, t, n, r)
        }
        return n[o].exports
    }
    var i = typeof require == "function" && require;
    for (var o = 0; o < r.length; o++) s(r[o]);
    return s
}
复制代码

目录结构解析

我写了一个处理的方法,在browserify处理依赖关系地方调用。

分析方法:

复制代码
function anlysePath(t, n, r){
     var temp = {};
     //收集所有地址
     for(var tk in t){
          var xx = t[tk][1];
          for(var x in xx){
               if(!temp[tk]) temp[tk] = {};
               temp[tk][xx[x]] = x;         
          }
     }

     //解析依赖关系
     var after = {};
     var doing = {};
     function anlyse(num, prefix){
          var al = temp[num];
          for(var n in al){
               if(after[n]) continue;
               var data = al[n];
               if(data.startsWith("./")) data = data.substring(2, al[n].length);
               var cj = data.match(/\.\.\//g);
               if(cj) cj = cj.length + 1;
               else cj = 1;
               var pf = prefix.split("/");
               pf.splice(pf.length - cj , cj);
               after[n] = pf.join("/")+ "/" + data.replace(/\.\.\//g,"");
               after[n] = after[n].replace(/\.\.\//g,"");
               if(after[n].startsWith("/")) after[n] = after[n].substring(1, after[n].length);
          }
          for(var n in al){
               if(!doing[n]){
                    doing[n] = true;
                    anlyse(n, after[n]);
               }              
          }
     }
     anlyse(r[0],'');

     var files = {};
     for(var k in after){
          files[after[k]] = k;
     }

     //合并目录,得出树形结果
     var paths = {};
     for(var k in files){
          var ps = k.split("/");
          if(!paths[ps[0]]) paths[ps[0]] = ps.length == 1? ".js":{};
          var begin = paths[ps[0]];
          for(var i=1;i<ps.length;i++){
               if(!begin[ps[i]]){
                    begin[ps[i]] = (i == ps.length-1)? '.js':{};
               }    
               begin = begin[ps[i]];         
          }
     }
     console.log(paths);
}
复制代码

调用地方:

复制代码
(function e(t, n, r) {

     anlysePath(t, n, r);  //这里调用,后面代码就不重复了。
     function s(o, u) {
          if (!n[o]) {
               if (!t[o]) {
 
复制代码

目录解析效果:

由于篇幅关系,没有显示所有目录结构。

可以看出第一层的目录结构是:

复制代码
directive
filter
lib
module
service
unPopModal
_process.js
es6-promise.js
path.js
复制代码

PS:一个典型的AngularJS的目录结构。

 

总结

学习别人前端源码,我觉目录结构已经够用了,毕竟项目的骨架搭好了,其他的也就是添砖加瓦而已。

 


本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5870344.html



本文转自 海角在眼前 博客园博客,原文链接:  http://www.cnblogs.com/lovesong/p/5870344.html ,如需转载请自行联系原作者

相关文章
|
人工智能 自然语言处理 API
浅谈ModelScope
ModelScope是阿里推出的下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,其开发目标为让模型应用更简单。ModelScope希望在汇集行业领先的预训练模型,减少开发者的重复研发成本,提供更加绿色环保、开源开放的AI开发环境和模型服务,助力绿色“数字经济”事业的建设。ModelScope平台以开源的方式提供了多类优质模型,开发者可在平台上免费体验与下载使用。
|
JavaScript
Vue 项目使用 json-editor (二)
Vue 项目使用 json-editor (二)
1040 0
|
9月前
|
人工智能 自然语言处理 搜索推荐
WritingBench:阿里最新大模型写作能力多维测评工具,开源32B深度思考写作模型
近日,阿里研究团队联合中国人民大学和上海交通大学共同开源了WritingBench ——该评估基准覆盖6大领域、100个细分场景,共包含1239条评测数据,以期为生成式写作提供全面的评估。团队进一步发现,凭借思维链技术和动态评估体系的加持,基于Qwen开发的32B创作模型在创意型任务上表现接近顶尖模型R1,为高效能创作开辟了新路径。
921 5
Threejs制作海面效果
这篇文章详细介绍了利用Three.js制作逼真海面效果的过程,包括设置Water材质、调整光照及实现波动动画的步骤。
526 0
Threejs制作海面效果
|
网络协议 Dubbo 应用服务中间件
实操指南:Postman 怎么调试 WebSocket
WebSocket 是一个支持双向通信的网络协议,它在实时性和效率方面具有很大的优势。Postman 是一个流行的 API 开发工具,它提供了许多功能来测试和调试 RESTful API 接口,最新的版本也支持 WebSocket 接口的调试。想要学习更多关于 Postman 的知识,可访问 Postman 中文文档。在本文中,我们将介绍如何使用 Postman 调试 WebSocket 接口。
|
传感器 小程序 开发工具
【规范】小程序发布,『小程序隐私保护指引』填写指南
本文详细解析了小程序隐私保护指引的填写方法,包括开发者处理的信息、第三方插件信息、用户权益等内容,并提供了详细的填写范例,帮助读者在发布小程序时避免常见问题,是一份实用的参考指南。
1900 1
【规范】小程序发布,『小程序隐私保护指引』填写指南
|
存储 Serverless API
托管及使用专属智能语音模型CosyVoice
CosyVoice是一款先进的声音合成模型,支持声音克隆与情感控制等功能,在教育、客服、游戏等领域有广泛应用。本文详细介绍如何在阿里云Serverless平台上部署CosyVoice应用,比如使用函数计算平台快速搭建。并且提供API调用方法及本地调试步骤,同时还介绍如何通过挂载NAS实现持久化存储,以及更新模型和定制后端服务的方法。
2528 13
|
存储 监控 Linux
stdbuf命令在Linux中的深度解析
`stdbuf`是Linux工具,用于控制命令的stdin、stdout和stderr的缓冲模式。它可以设置为无缓冲、行缓冲或块缓冲,以优化数据处理和实时性。例如,`stdbuf -o0 cmd`禁用cmd的输出缓冲,`-oL`则按行缓冲。在需要实时监控或高效处理大量数据时,选择合适的缓冲模式至关重要。注意,过度使用无缓冲可能影响性能,并非所有系统都支持`stdbuf`。
|
人工智能 JSON API
|
弹性计算 并行计算 Shell
在云上搭建CosyVoice环境-保姆级教程
发现个好玩的模型,阿里最近开源的,可以便捷的复刻人声,本文提供全套安装过程。仓库地址:https://github.com/FunAudioLLM/CosyVoice。
5966 1