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
browserify压缩合并源码反编译的更多相关文章
- 解决AndroidKiller APK 反编译失败,无法继续下一步源码反编译!
报错背景 今天使用AndroidKiller V1.3.1,反编译一个APK,遇到如下报错: 当前 Apktool 使用版本:Android Killer Default APKTOOL 正在反编译 ...
- Android Framework源码反编译
部分设备crash在Framework代码,但又和开源代码对应不上,这时需要拉取设备里面的Framework并反编译源代码排查问题. 1.获取Framework文件: adb pull /system ...
- Java Jar源码反编译工具那家强
本文介绍下Java Jar常见的反编译工具,并给出使用感受. 反编译JAR能干什么: 排查问题.分析商业软件代码逻辑,学习优秀的源码思路. JD-GUI 下载地址:http://java-decomp ...
- shop++源码反编译----随笔
一.applicationContext-mvc.xml配置 1.读取配置文件 <context:property-placeholder location="classpath*:/ ...
- 字节码 反编译 APKTool 重新打jar包 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/fuchaosz/article/details/52473660 1 前言 经过一周的奋战,终于从谷 ...
- 编译最新版webrtc源码和编译好的整个项目10多个G【分享】
编译最新版webrtc源码和编译好的整个项目10多个G[分享] 参考https://webrtc.org/native-code/development/编译最新版webrtc源码: Git clon ...
- Ubuntu下载源码并编译
本文章将介绍如何在Ubunt下进行Linux源码下载,并进行简单的编译步骤. 1.下载linux源码 先查看对应的Ubuntu对应版本源码 $ sudo apt-cache search linux- ...
- net-snmp源码VS2013编译添加加密支持(OpenSSL)
net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...
随机推荐
- java.io中的System.in、 System.out和System.err
System.in, System.out, System.err这3个流同样是常见的数据来源和数据流目的地.使用最多的可能是在控制台程序里利用System.out将输出打印到控制台上. JVM启动的 ...
- JS动态生成的元素,其对应的方法不响应(比如单击事件,鼠标移动事件等)
主要原因:在页面给元素注册点击事件的时候[ $(function () { XXX }); ],JS动态生成的元素还尚未生成,所以click事件就没有生效 解决方法: 方案一:js动态生成元素后再给 ...
- sizzle编译函数
一个人去完成一件事情,如果派多个人去做的话,只要配合默契,效率比一个人做肯定要高,效率提高,所需的时间就减少了.如果只能一个人完成,那么必须设法提高自己的劳动效率,这个提高可以是量的改变也可以是质的改 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 文章管理架构
上次把member的用户部分完成,现在开始做文章管理部分.文章部分根据涉及显示现实文章列表,发布文章,修改文章,删除文章等功能.最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示 ...
- Android 之 ProgressDialog用法介绍
布局文件测试: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi ...
- CSS中div覆盖另一个div
将一个div覆盖在另一个div上有两种手段:一是设置margin为负值,二是设置绝对定位. 可以根个人情况设置z-index的值 1->position 为absolute的情况 <htm ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- 让你的JS更优雅的小技巧
首先,看一个非常不优雅的例子: 看到这段代码,虽然代码很短,但是一眼看上去就不想再看了,也就是没什么可读性.这段代码,没有封装,随意定义一个变量都是全局变量,这样在多人开发或者是大型开发中,极其容易造 ...
- 1Z0-053 争议题目解析510
1Z0-053 争议题目解析510 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 510.You executed the following command in Recover ...
- hibernate笔记--单向一对多映射方法
上一篇讲的是单向多对一的表关系,与单向一对多的关系正好相反,如下图所示关系: ,可以看出年级表和学生表是一对多的关系,一条年级信息对应多条学生信息,在hibernate中成为单向的一对多的映射关系,应 ...