• JS代码压缩


    JS代码压缩

    本文分享一种技术,用于实现JS代码压缩。

    该技术使用LZW算法。

    LZW算法又叫“串表压缩算法”,简而言之,通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。

    具体的实现方法是:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,从而减少原始数据大小。应该注意的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表。

    JS代实现LZW算法:

    1. //LZW压缩
    2. function lzw_encode(s) {
    3.     let dict = {};
    4.     let data = (s + '').split('');
    5.     let out = [];
    6.     let currChar;
    7.     let phrase = data[0];
    8.     let code = 256;
    9.     for (let i = 1, l = data.length; i < l; ++i) {
    10.         currChar = data[i];
    11.         if (dict[phrase + currChar] != null) {
    12.             phrase += currChar;
    13.         } else {
    14.             out.push(phrase.length > 1 && dict[phrase] || phrase.charCodeAt(0));
    15.             dict[phrase + currChar] = code;
    16.             ++code;
    17.             phrase = currChar;
    18.         }
    19.     }
    20.     out.push(phrase.length > 1 && dict[phrase] || phrase.charCodeAt(0));
    21.     for (let i = 0, l = out.length; i < l; ++i) {
    22.         out[i] = String.fromCharCode(out[i]);
    23.     }
    24.     return out.join('');
    25. }
    26. //LZW解压
    27. function lzw_decode(s) {
    28.     let dict = {};
    29.     let data = (s + '').split('');
    30.     let currChar = data[0];
    31.     let oldPhrase = currChar;
    32.     let out = [currChar];
    33.     let code = 256;
    34.     let phrase;
    35.     for (let i = 1, l = data.length; i < l; ++i) {
    36.         let currCode = data[i].charCodeAt(0);
    37.         if (currCode < 256) {
    38.             phrase = data[i];
    39.         } else {
    40.             phrase = dict[currCode] && dict[currCode] || (oldPhrase + currChar);
    41.         }
    42.         out.push(phrase);
    43.         currChar = phrase.charAt(0);
    44.         dict[code] = oldPhrase + currChar;
    45.         ++code;
    46.         oldPhrase = phrase;
    47.     }
    48.     return out.join('');
    49. }

    使用,压缩和解压JS代码:

    1. var str=`
    2. function get_copyright(){
    3.     var domain = "jshaman.com";
    4.     var from_year = 2017;
    5.     var copyright = "(c)" + from_year + "-" + (new Date).getFullYear() + "," + domain;
    6.     return copyright;
    7. }
    8. console.log(get_copyright());
    9. `
    10. console.log("原始长度:",str.length);
    11. console.log("压缩后长度:",lzw_encode(str).length);
    12. console.log("解压后长度:",lzw_decode(lzw_encode(str)).length);
    13. console.log()
    14. console.log("   eval执行压缩代码:")
    15. eval(lzw_decode(lzw_encode(str)));
    16. console.log()
    17. console.log("   constructor执行压缩代码:");
    18. [].constructor.constructor(lzw_decode(lzw_encode(str)))();
    19. console.log()

    运行效果:

     

    上面同时演示了运行效果。

    因为压缩的是JS代码,所以解压后当然运行,才能实现原本JS代码的功能。

    实际应用时,如果不想让他人知道使用了什么样的算法,可以再对代码进行混淆加密。

    比如这部分代码:

     

    用JShaman进行代码加密:

     

    加密后的代码成为:

     

    加密后的JS代码运行完全不受影响,与之前一样使用:

     

  • 相关阅读:
    java-php-python-ssm糖果销售管理系统计算机毕业设计
    Vue的个人笔记
    JS进阶-垃圾回收机制和算法
    导览软件定制开发方案
    26_基础加强03
    VUE2 Day06路由模块封装,声明式导航,vue路由重定向,keep-alive,基于VueCli自定义创建项目,代码规范
    《金字塔原理》阅读笔记
    开放与融合趋势下,工业互联网安全破圈之道
    Day08 SSM第八次笔记---SpringBoot基础部分学习
    谷歌浏览器最新版和浏览器驱动下载地址
  • 原文地址:https://blog.csdn.net/w2sft/article/details/127702262