最近在学习钉钉(一个协作应用)桌面应用的前端源码时候,发现其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压缩合并源码反编译的更多相关文章

  1. 解决AndroidKiller APK 反编译失败,无法继续下一步源码反编译!

    报错背景 今天使用AndroidKiller V1.3.1,反编译一个APK,遇到如下报错: 当前 Apktool 使用版本:Android Killer Default APKTOOL 正在反编译 ...

  2. Android Framework源码反编译

    部分设备crash在Framework代码,但又和开源代码对应不上,这时需要拉取设备里面的Framework并反编译源代码排查问题. 1.获取Framework文件: adb pull /system ...

  3. Java Jar源码反编译工具那家强

    本文介绍下Java Jar常见的反编译工具,并给出使用感受. 反编译JAR能干什么: 排查问题.分析商业软件代码逻辑,学习优秀的源码思路. JD-GUI 下载地址:http://java-decomp ...

  4. shop++源码反编译----随笔

    一.applicationContext-mvc.xml配置 1.读取配置文件 <context:property-placeholder location="classpath*:/ ...

  5. 字节码 反编译 APKTool 重新打jar包 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/fuchaosz/article/details/52473660 1 前言 经过一周的奋战,终于从谷 ...

  7. 编译最新版webrtc源码和编译好的整个项目10多个G【分享】

    编译最新版webrtc源码和编译好的整个项目10多个G[分享] 参考https://webrtc.org/native-code/development/编译最新版webrtc源码: Git clon ...

  8. Ubuntu下载源码并编译

    本文章将介绍如何在Ubunt下进行Linux源码下载,并进行简单的编译步骤. 1.下载linux源码 先查看对应的Ubuntu对应版本源码 $ sudo apt-cache search linux- ...

  9. net-snmp源码VS2013编译添加加密支持(OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

随机推荐

  1. Event的Propagate

    SSIS Package的Executable存在层次结构,例如Package位于层次结构的最顶层,Root Level:Container是其中包含的Executable(Task 或 Contai ...

  2. SQL Server中CTE的另一种递归方式-从底层向上递归

        SQL Server中的公共表表达式(Common Table Expression,CTE)提供了一种便利的方式使得我们进行递归查询.所谓递归查询方便对某个表进行不断的递归从而更加容易的获得 ...

  3. c#写windows服务

    序言 前段时间做一个数据迁移项目,刚开始用B/S架构做的项目,但B/S要寄存在IIs中,而IIs又不稳定因素,如果重启IIs就要打开页面才能运行项目.有不便之处,就改用Windows服务实现.这篇就总 ...

  4. 深入学习jQuery元素过滤

    × 目录 [1]索引过滤 [2]内容过滤 前面的话 过滤是jQuery扩展的一个重要的内容.jQuery选择器中的一个重要部分就是过滤选择器.除了过滤选择器,还有专门的元素过滤的方法.本文将详细介绍j ...

  5. android app反编译

    最新在反编译别人的apk,有时候看到别人的app有很炫的效果,就想知道别人是怎么样实现的,顺便自己参考,借鉴一下,下一次如果工作中碰到这个问题就知道怎么实现了.最近恰好放假三天,就研究了一下,一般别人 ...

  6. pixi.js教程中文版--基础篇

    前言 Pixi.js使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库.提供无缝 C ...

  7. 安装infer整个过程

    日期:2015-06-26 孟起  15:43:25 大神.. 孟起  15:43:38 我是不是照着这个安装 HelloWorld  15:45:05 直接找二进制文件安卓就行 孟起  15:46: ...

  8. 性能测试工具Locust

    An open source load testing tool. 一个开源性能测试工具. define user behaviour with python code, and swarm your ...

  9. 将DataTable转换成CSV文件

    DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记 ...

  10. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解

    首先我们找到这个类. 这个类有如下的方法: #region Title & meta [Obsolete("Use HtmlTitle")] public IHtmlStr ...