browserify壓縮合併源碼反編譯

来源:http://www.cnblogs.com/lovesong/archive/2016/09/14/5870344.html
-Advertisement-
Play Games

最近在學習釘釘(一個協作應用)桌面應用的前端源碼時候,發現其js源碼是用browserify做模塊開發。於是想還原其源碼的原本的目錄結構,學習它的目錄分類以及業務劃分。 前言 用過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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載 http://www.cnblogs.com/E-star/archive/2012/08/03/2621025.html 求歐拉函數的模板: 歐拉函數打表: ...
  • 說明:一些基本的代碼我都進行了註釋,這裡實現的驗證碼位數、需要用的字元串都可以再設置。有我的註釋,大家應該很容易能看得懂。 基本思路: 1.用mt_rand()隨機生成數字確定需要獲取的字元串,對字元串進行拼接(覺得生成的驗證碼覺得有點太擠,大家可以再字元串中間拼接個空格鍵),實現隨機驗證碼; 備註 ...
  • 一、演算法介紹 tarjan——求解有向圖強連通分量。這個演算法在本人的一篇blog中有介紹,這裡就不贅述了。貼上介紹tarjan的的blog鏈接:http://www.cnblogs.com/Maki-Nishikino/p/5866191.html 那麼接下來說說SPFA: SPFA全稱Shorte ...
  • org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [beans4.xml]: I ...
  • 一、介紹 Java流程式控制制包括順序控制、條件控制和迴圈控制。 順序控制,就是從頭到尾依次執行每條語句操作。條件控制,基於條件選擇執行語句,比方說,如果條件成立,則執行操作A,或者如果條件成立,則執行操作A,反之則執行操作B。迴圈控制,又稱為迴路控制,根據迴圈初始條件和終結要求,執行迴圈體內的操作。 ...
  • 用FPGA設計了數據接收和發送模塊,FIFO模塊 用串口調試工具發送數據,數據接收模塊將接收到的串列數據轉換為並行數據(串轉並),並存入FIFO中,當FIFO中的數據個數大於某個值的時候,讀出數據,通過發送模塊將並行數據轉換為串列數據(並轉串),然後就可以在串口調試工具上看到接收到的數據。 註意的點 ...
  • 一、引入本地庫 1、File -> Project Structure -> Libraries,點擊+,新增本地lib庫。 2、File -> Project Structure -> Modules -> Dependencies,新增Library,選擇第一步創建的lib庫。 二、將本地庫wa ...
  • 需求從何而來?對於一個項目來說,應該是從設計需求文檔中而絕不是頁面。之所以說國內的產品經理技術偏低,很大部分因為他們把過多的熱情放在了畫原型的上面。 從頁面走出,實現真正的業務驅動。 PDD 一切以頁面為核心,每個程式員針對每個頁面來找到功能點,從而以頁面為單位進行任務交付。開發未動,頁面先行,這也 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...