如何修改min.js或者壓縮後的js,以便提高代碼的可讀性。

来源:https://www.cnblogs.com/kali2021/archive/2023/08/27/17660889.html
-Advertisement-
Play Games

# 背景 再很多場景中,我們可能想在子組件中修改父組件的數據,但事實上,vue不推薦我們這麼做,因為數據的修改不容易溯源。 ## Vue2寫法 在vue2中,我們使用`.sync`修飾符+自定義事件`'update:xxx'`,來使父子組件數據同步。 ```html // 父組件 我是父組件,我有{ ...


前端的js上線的時候一般會使用打包工具處理(webpack,gulp,ugly.js 等)。這樣做有幾點作用。

  1. 可以壓縮空間,提高頁面響應速度
  2. 一定程度上可以保護自己的代碼安全,防止別人清晰看懂邏輯或者拷貝代碼。
  3. 提高別人閱讀自己代碼的門檻

可前端開發工作中多多少少,會需要看別人的js代碼。可隨之而來的就是各種噩夢。eval,jsfuck,obfuscator等各種混淆方案就出來了。當然這種也在一定程度上保護了自己的代碼。可是對於閱讀者來說,簡直是天書。關於混淆,以及反混淆等空了再寫博客講解。不過最常見的還是簡化,簡化後的代碼,往往第一步處理起來是進行格式化,然後邊看邊修改。其中非常大的工作量是調整代碼結構。理清文件的結構邏輯。比如下麵的代碼。

1 function _createClass(t, e, a) {
2   return e && _defineProperties(t.prototype, e), a && _defineProperties(t, a), t
3 }

其實閱讀這個代碼有些複雜的,裡面既有邏輯運算,也有序列表達式,也有返回值。這個是否非常想處理為下麵的結構:

1 function _createClass(t, e, a) {
2     if (e) {
3         _defineProperties(t.prototype, e);
4     }
5     if (a) {
6         _defineProperties(t, a);
7     }
8     return t;
9 }

這種代碼結構就清晰多了。可是如何自動化處理那?手動修改一是慢,二是非常容易出錯,在著無法完成功能復用。遇到其他的代碼任然需要重新修改。比如這個時候又來了這樣一段代碼。

1 function m(t) {
2   var e = this.data.get("items"),
3     a = this.data.get("loop"),
4     n = e.length;
5   t < 0 ? a ? this.data.set("activeIndex", n - 1) : this.data.set("activeIndex", 0) : t >= n ? a ? this.data.set("activeIndex", 0) : this.data.set("activeIndex", n - 1) : this.data.set("activeIndex", t)
6 }

首先一行定義了多個變數,變數的名稱真想重新命名一下,把e重命名為items,a重命名為loop, 不過最後的嵌套多層的三元運算,直接讓人崩潰。忽然就想到多年前同事說過的一句話,程式員何必為難程式員。玩笑歸玩笑,不過還是要積極的心態面對技術挑戰不是。

首先是變數聲明表達式,一次聲明瞭三個變數。這種寫法其實程式員是比較排斥的,非常想一行寫一個。

 1 function m(offset) {
 2     var items = this.data.get("items");
 3     var loop = this.data.get("loop");
 4     var length = items.length;
 5     if (offset < 0) {
 6         if (loop) {
 7             this.data.set("activeIndex", length - 1);
 8         } else {
 9             this.data.set("activeIndex", 0);
10         }
11     } else {
12         if (offset >= length) {
13             if (loop) {
14                 this.data.set("activeIndex", 0);
15             } else {
16                 this.data.set("activeIndex", length - 1);
17             }
18         } else {
19             this.data.set("activeIndex", offset);
20         }
21     };
22 }

上面的代碼就好看多了,基本的邏輯也可以看懂了。當時就想有沒有工具可以做這個,或者如何利用現在的gpt工具去美化一下那。後檢索了大量的資料,使用過市面的各種工具,發現還是自己寫比較合適。gpt美化後,會有明顯的代碼邏輯錯誤。更重要的是有輸入限制。

 

寫一個js代碼美化工具,多麼具有挑戰性。起碼要懂編譯原理,程式的語義和語法。於是買了很多關於編譯原理的書。看幾本後就上手了。結果寫的80%以上了後,因為各種事情一直耽擱著。最近終於完成了大部分。感興趣的朋友可以看下。

https://www.dejs.vip/javascript/beautify   (目前仍有部分bug並且無法100%還原代碼的)

function justAFunction(){console.info("test");}

上面的代碼簡化後可能變成:

1 function a(){console.info("test");}

如果僅從代碼中是無法推斷出原來函數的名字的。不過可以根據文中語義去判定。但是大多時候,你是無法判定的。代碼邏輯分析中加入人工智慧或者使用代碼庫比對,有可能可以做到。不過這種複雜的程度過高了。

 

這個工具也許是前端,逆向或者爬蟲工作者的一個福音。也或許會給代碼持有者帶來不安或者擔憂。如何判定工具,留給使用者自行判定吧。

 


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

-Advertisement-
Play Games
更多相關文章
  • `fsnotify`是一個用Go編寫的文件系統通知庫。它提供了一種觀察文件系統變化的機制,例如文件的創建、修改、刪除、重命名和許可權修改。它使用特定平臺的事件通知API,例如Linux上的inotify,macOS上的FSEvents,以及Windows上的ReadDirectoryChangesW。 ...
  • 工具提示即 Tool Tip,當用戶把滑鼠移動到某個UI對象上並懸停片刻,就會出現一個“短小精悍”的視窗,顯示一些說明性文本。一般就是功能描述,讓用戶知道這個XX是幹啥用的。 在 Qt 中使用工具提示最方便的做法是直接用 QWidget 類的成員方法:setToolTip。從 QWidget 類派生 ...
  • # 什麼是主席樹 主席樹這個名字看上去很高級,其實不然,它還有另一個名字——可持久化線段樹。 ## 什麼是可持久化 可持久化顧名思義就是它可以變得~~**持久**~~,就是我們對他不斷進行單點修改後,突然查詢它的某一個歷史版本,這就叫可持久化。 # 引入例題 [洛谷3919:可持久化數組](http ...
  • ## 前言: 單例模式是創建型模式5種中的第1種,**關註對象的創建, 保證一個類僅有一個實例,並且提供一個全局訪問點**。在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。如何繞過常規的構造器,提供一種機制來保證一個類只創建一個實例 ...
  • ## 一、設計模式概述: ​ **設計模式(Design pattern)**代表了最佳的實踐,通常被有經驗的面向對象的軟體開發人員所採用。設計模式是軟體開發人員在軟體開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟體開發人員經過相當長的一段時間的試驗和錯誤總結出來的。是一套被反覆使用的、多 ...
  • 一、 ManualResetEvent ManualResetEvent是一個同步對象,可以使一個或多個線程等待另一個線程的信號,然後再同時繼續執行。它是通過兩個狀態來實現的:有信號和無信號。 以下是ManualResetEvent的各個方法的介紹: Set方法:將ManualResetEvent的 ...
  • S905L3A(M401A)拆解, 運行EmuELEC和Armbian. S905Lx系列屬於大客戶版本, 對外沒有公開資料, 最早的 S905L/S905LB 是 S905X 的馬甲, 而這個 S905L3A/S905L3AB 則是 S905X2 的馬甲, 因為在性能評測里這兩個U的得分幾乎一樣.... ...
  • 功能 設計一個傳送帶系統,能夠實現傳送帶的開始/停止,正轉/反轉,加減速,對傳送帶的物品計數。 按鈕/app功能控制,oled屏幕/app顯示。 設計框圖 原理圖 軟體構建階段 利用STM32CubeMX生成模板 MCU選型:STM32F103C8T6,雙擊打開。 Ststem Core->SYS: ...
一周排行
    -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# ...