• 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代码运行完全不受影响,与之前一样使用:

     

  • 相关阅读:
    PX4使用P900数传
    [17]JAVAEE-HTTP协议
    教你一绝招:如何快速提高学习成绩--这样学习,你离考取重点高中或名牌大学很近了
    统计专业人员职称评价基本标准
    Element table分页表单使用筛选
    SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(4)
    增强LLM:使用搜索引擎缓解大模型幻觉问题
    一、PHP环境搭建[phpstorm]
    【Flask】Flask启程与实现一个基于Flask的最小应用程序
    【深度学习】第二章:全连接神经网络
  • 原文地址:https://blog.csdn.net/w2sft/article/details/127702262