前端的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");}

如果仅从代码中是无法推断出原来函数的名字的。不过可以根据文中语义去判定。但是大多时候,你是无法判定的。代码逻辑分析中加入人工智能或者使用代码库比对,有可能可以做到。不过这种复杂的程度过高了。

这个工具也许是前端,逆向或者爬虫工作者的一个福音。也或许会给代码持有者带来不安或者担忧。如何判定工具,留给使用者自行判定吧。

如何修改min.js或者压缩后的js,以便提高代码的可读性。的更多相关文章

  1. 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

    使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...

  2. 前端工具-调试压缩后的JS(Source Map的使用)

    使用 Source Map 可以在 FF 的调试器. Chrome 的 Sources 和 VSCode 中给压缩前的文件下断点,也可以方便定位错误发生的位置(定位到压缩前的文件). 何为 Sourc ...

  3. grunt压缩多个js文件和css文件

    压缩前的工程目录: 1.安装js,css需要的插件 使用npm安装:npm install grunt-contrib-uglify --save-dev  -------->安装js压缩插件 ...

  4. (6/24) 插件配置:轻松配置JS文件压缩

    实际开发中,在项目上线之前,我们编写的js代码是需要进行压缩的,我们可以采取压缩软件或者在线进行压缩,这不是我们的重点,在webpack中实现JS代码的压缩才是本节的核心. 通过webpack中可实现 ...

  5. iis 发布asp.net mvc 网站时候js css 压缩问题,图片不加载问题

    一.JS CSS 自动压缩问题 默认情况下mvc这个框架会把css,js文件压缩成一个js或者css文件,一会发现只有一个<link href="/Content/css?v=ji3n ...

  6. 从零开始学 Web 之 Vue.js(一)Vue.js概述,基本结构,指令,事件修饰符,样式

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  7. html + js 实现图片上传,压缩,预览及图片压缩后得到Blob对象继续上传问题

    先上效果 上传图片后(设置了最多上传3张图片,三张后上传按钮消失) 点击图片放大,可以使用删除和旋转按钮 (旋转功能主要是因为ios手机拍照后上传会有写图片被自动旋转,通过旋转功能可以调正) html ...

  8. min.js反压缩

    给个网址自己体会.. http://jsbeautifier.org/ 当需要修改min.js中的代码时,把min.js文件ctrl+c   ctrl+v扔到上面的网页里,点击beautify 即可

  9. 折腾一两天,终于学会使用grunt压缩合并混淆JS脚本,小激动,特意记录一下+spm一点意外收获

    很长时间没有更新博客了,实在是太忙啦...0.0 ,以下的东西纯粹是记录,不是我原创,放到收藏夹还担心不够,这个以后常用,想来想去,还是放到这里吧,,丢不了..最后一句废话,网上搜集也好原创也罢,能解 ...

  10. gulpfile.js 合并压缩 requirejs 的配置文件

    var gulp = require("gulp"); // var babel = require("gulp-babel"); // 用于ES6转化ES5 ...

随机推荐

  1. 每周更新 | Verilog测试用例及波形展示图功能上线

    Hi,亲爱的技术伙伴,经过产研团队的努力,本周ShowMeBug有以下4个功能上线啦- 芯片语言 Verilog 支持测试用例 芯片语言 Verilog 支持测试用例,自动评分同步上线- 同时,Ver ...

  2. C++程序开发技巧

    引言 类(class)的使用分为两种--基于对象(object Based)和面向对象(object oriented) 基于对象是指,程序设计中单一的类,和其他类没有任何关系 单一的类又分为:不带指 ...

  3. Windows操作系统中常用的Dos命令

    打开CMD的方式: Win+R 输入cmd打开控制台(推荐使用) 在任意文件夹下,按住shift键,点击鼠标右键,选择在此处打开命令行窗口 在资源管理器的地址栏路径前面加上cmd+空格: 常用的Dos ...

  4. 全球开源 AI 游戏开发挑战赛,只等你来!

    我们在之前的文章中 预告过 (*划重点,IP 属地法国):7 月初,我们将举办一次与 AI 游戏相关的黑客松活动,这是有史以来的首次开源游戏开发挑战赛,借助人工智能工具释放你的创造力,一起打破游戏开发 ...

  5. 2023-06-21:redis中什么是BigKey?该如何解决?

    2023-06-21:redis中什么是BigKey?该如何解决? 答案2023-06-21: 什么是bigkey bigkey是指存储在Key-Value数据库中的键对应的值所占用的内存空间较大.举 ...

  6. influxdb 中得 fields 与 tag 区别总结

    本位为博主原创,转载请注明出处: 1.Field与Tag说明 在 InfluxDB 表结构中,field 和 tag 是用于存储数据的两种不同类型. Field(字段): Field 用于存储实际的数 ...

  7. 国内可用的GPT4镜像站

    我做了个镜像站,GPT4的费用目前太贵了. 虽然做了个低价的月费,但基本上亏本在做,接口的实际费用高出太多. 运行了1个月,每天有几十人在用吧. 有兴趣的可以收藏一下 GPT4的验明正身的问题&quo ...

  8. Centos 7安装Docker镜像仓库-Harbor

    下载安装包并导入镜像 # 进入文件下载目录 cd /root/software/ # 下载安装文件 # 如果下载失败可以本地下载,下载后上传至服务器,https://github.com/goharb ...

  9. C++笔记(1)——类的基本概念知识

    C#和C++的部分面向对象方式类似,只记录不同点. 定义类与关键字: 下面是C++类的定义方式与C++关键字public和private的表达方式: class Box { private: // 私 ...

  10. Android进阶-NDK技术

    一.介绍 1.什么是ndk技术? 在学习ndk技术前,我们需要先了解一下JNI(Java Native Interface)技术,JNI技术是一种实现Java代码和C/C++代码之间交互的技术,它提供 ...