优化 VS Code:通过名称混淆缩减代码大小

大家好!你有没有使用过 Visual Studio Code(简称 VS Code)?如果你是一名开发人员,那么你很可能使用过这款流行的开源代码编辑器。在这篇文章中,我将分享 VS Code 团队如何通过名称混淆技术将其 JavaScript 代码的大小减小了 20%。这不仅意味着你需要下载和存储的代码更少,还意味着启动时间更快,因为在运行 JavaScript 之前需要扫描的源代码更少。这是一项令人印象深刻的优化工作,而且并没有删除任何代码或进行任何重大的代码重构。

发现问题

VS Code 团队一直致力于提升性能,包括优化热门代码路径、减少 UI 重排或加速启动时间。其中之一就是减小 VS Code 的 JavaScript 代码大小。然而,多年来,几乎所有的变化都是增加。虽然我们会仔细考虑要将哪些功能集成到 VS Code 中,但随着时间的推移,新功能的增加不可避免地增加了我们发布的代码量。

然而,我们发现代码大小的增加会导致性能下降。例如,八年前的 VS Code 核心 JavaScript 文件 "workbench.js" 的大小是现在的四倍。当考虑到八年前的 VS Code 缺少现在许多人认为是必需的功能,比如编辑器标签或内置终端时,这种增加可能并不那么可怕,但也不容忽视。

名称混淆的概念

为了减小 JavaScript 代码的大小,我们考虑使用名称混淆技术。名称混淆是指将代码中的长标识符名称(如变量名或函数名)替换为更短的名称,以减小代码文件的大小。在 JavaScript 中,代码以源文本的形式传输,因此减小标识符名称的长度实际上会减小程序的大小。虽然在编译语言中,这种优化可能显得有点荒谬,但在 JavaScript 的世界中,我们非常愿意接受这样的改进。

然而,名称混淆也需要谨慎使用。如果一个潜在的优化使你的源代码变得不易读或不易维护,或者需要大量手动工作,那么除非它能够带来真正显著的改进,否则几乎不值得使用。因此,我们需要寻找一种方式,能够在不引入太多风险或额外工程工作的情况下,实现这种优化。

解决方案:名称混淆私有属性

为了减小代码的大小,我们首先考虑混淆私有属性的名称。按照惯例,私有属性的名称通常以下划线 "_" 开头。我们认为私有属性的名称可以安全地进行混淆,而且在类外部的代码不会受到影响。然而,很快我们发现,在一些情况下,子类可能会将继承的受保护属性公开。虽然这可能是错误的,但在实际代码库中,有时候我们需要禁用名称混淆。

由于 TypeScript 中的 "private" 关键字在编译到 JavaScript 时基本上被移除,这就意味着不能阻止位于类外部的代码访问私有属性。因此,我们必须谨慎更改属性名称,以避免在对象扩展、序列化和不同类共享相同属性名称时引发问题。

使用 TypeScript 确保安全

为了提高对混淆构建的信心,我们决定使用 TypeScript 进行验证。与其将混淆应用于编译后的 JavaScript 代码,我们可以将混淆应用于 TypeScript 源代码,然后使用 TypeScript 编译器编译带有混淆标识符名称的新 TypeScript 代码。这一编译步骤将大大提高我们的信心,因为它可以确保我们没有意外破坏我们的代码。

此外,使用 TypeScript,我们可以真正找到所有的私有属性,而不仅仅是那些以 "_" 开头的属性。我们甚至可以使用 TypeScript 的重命名功能来智能地重命名符号,而不会以不符合预期的方式更改对象的形状。

果和进一步工作

经过努力,我们成功地实现了混淆私有属性的构建步骤。这一步骤将 VS Code 的主要 "workbench.js" 脚本的大小从 12.3 MB 减小到 10.6 MB,减小了近 14%。这也加快了代码加载速度,因为需要扫描的源代码更少了。这对于几乎没有额外工程工作的优化来说,效果不错。

在混淆私有属性之后,我们继续思考其他潜在的优化机会。我们发现可以使用相同的方法来混淆导出的符号名称,只要这些导出仅在内部使用。这个工作在上一次迭代中完成,进一步减小了 "workbench.js" 的大小,从 10.6 MB 减小到 9.8 MB。总的来说,通过混淆,这个文件现在比不使用混淆时小了 20%。在整个 VS Code 项目中,混淆删除了 3.9 MB 的 JavaScript 代码。这不仅减小了下载和安装的大小,还减少了每次启动 VS Code 时需要扫描的 JavaScript 代码量。

结论

通过名称混淆技术,我们成功地减小了 Visual Studio Code 的 JavaScript 代码的大小,提高了性能,减少了下载和存储的开销。这项工作展示了如何在不进行大规模代码更改或昂贵的重写的情况下,通过识别潜在的优化机会,以及谨慎地进行优化,可以在 VS Code 中找到显著的改进。

优化是一个持续不断的过程,而不是一次性的事情。通过持续监测代码大小,我们能够意识到多年来代码的增长。这种意识无疑有助于阻止代码大小的进一步扩大,并鼓励我们不断寻找改进的机会。虽然名称混淆在一开始看起来可能是一种有吸引力的技术,但在深入研究之前,它几乎不可能被认真考虑。只有在我们努力降低风险、创建正确的安全保障和使采用名称混淆的成本几乎为零的情况下,我们才最终有足够的信心在我们的构建中启用它。

我为最终的结果感到非常自豪,也为我们达到这个结果的方式感到自豪。

关键词:

本文由作者 王大神 原创发布于 大神网的AI博客。

转载请注明作者:王大神

原文出处:优化 VS Code:通过名称混淆缩减代码大小

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年9月19日
下一篇 2023年9月19日

相关推荐

  • 对比分析:Alder Lake 与 Ryzen 5000 的超频性能

    你是否曾经陷入过超频的魔法世界?超频是一种将处理器性能推向极限的方式,让你的电脑发挥出最大的潜力。在今天的文章中,我们将深入探讨 Intel 的 Alder Lake 与 AMD 的 Ryzen 5000 处理器在超频方面的表现,看看…

    2023年10月22日
    00
  • 大神谈谈:显卡。

    在计算机世界中,显卡一直扮演着至关重要的角色。对于很多人来说,最早对显卡有概念很可能源自游戏。显卡不仅能够提供流畅的图形渲染,使游戏变得更加逼真和生动,还能够让玩家沉浸在虚拟的游戏世界中。然而,随着…

    2022年12月12日
    00
  • Pixel 8:七年系统更新承诺,是值得入手的安卓新机吗?

    我常常思考一个问题:买一部高价位的手机是否真的值得?特别是当这款手机承诺提供长达七年的系统更新时,是否值得入手?最近,Pixel 8登场,它承诺提供长达七年的系统更新,让人开始思考这一问题。 七年系统更新,…

    2023年10月5日
    00
  • MBA还是MBP?如何选择苹果笔记本电脑?

    当面临选购苹果笔记本电脑时,我们陷入了纠结的困境。一方面,我们需要一台轻便的笔记本,以满足移动办公的需求。另一方面,我们也需要高性能,以应对复杂的工作任务。在这篇文章中,我们将探讨如何在MBA(MacBook …

    2023年10月24日
    00
  • 小米Redmi Note13 Pro 详细测评:性能与设计的完美结合

    在智能手机市场上,小米(MI)一直以来都以其高性价比和卓越的性能而著称。最近,小米推出了全新的Redmi Note13 Pro,号称将性能和设计完美结合,为用户带来卓越的手机体验。作为一名科技爱好者,我迫不及待地拿到…

    2023年10月22日
    00
  • 如何选择原生开发还是跨平台开发:在艺术品项目中的取舍

    在移动应用开发领域,一直以来都存在着一个重要的抉择:是选择原生开发,还是采用跨平台开发工具?这个问题不仅影响项目的技术架构,还会对项目的成本、性能、稳定性等方面产生深远影响。本文将探讨在特定场景下如…

    2023年11月17日
    00
  • RTX 4090显卡价格与禁售情况一揽无余

    最近,RTX 4090显卡在全球范围内引发了广泛关注,其价格和禁售情况成为了热门话题。对于喜欢追求高性能的玩家们来说,这款显卡一直备受期待。然而,最近的一系列事件却让人们对其前景产生了疑虑。在本文中,我们将…

    2023年11月26日
    00
  • 如何优化Nginx并发数以提高Web服务器性能

    在一个炎热的夏日,一位名叫王大神的开发者正坐在电脑前,面对着他的Nginx服务器性能问题。他的网站在访问高峰期经常崩溃,客户不断地投诉。王大神心知肚明,他必须采取行动来改善这个状况。 于是,王大神开始了漫…

    2023年10月30日
    00
  • 如何将旧的5G手机改装成随身Wi-Fi热点?

    导言: 在这个数字时代,随身Wi-Fi成了我们生活中不可或缺的一部分。然而,购买一台独立的随身Wi-Fi设备可能需要额外的开支。那么,有没有办法将您手中的旧5G手机改装成一个高性能的随身Wi-Fi热点呢?本文将向您介…

    2023年9月17日
    00
  • 从Ventura到Sonoma:macOS升级体验

    近日,Apple发布了最新的macOS版本,Sonoma,带来了一系列新功能和改进。作为一名热爱技术的CEO,我急切地进行了升级,并希望与大家分享我的体验。在本文中,我将回顾我的升级之旅,谈谈Sonoma相对于Ventura的变化…

    2023年10月6日
    00