Babel.js 键入脚本常量枚举替代项

fumotvh3  于 2022-12-08  发布在  Babel
关注(0)|答案(1)|浏览(153)

越来越多的现代Typescript transpiler已经转向了每模块transpilation的策略,这显著提高了构建速度,但消除了跨模块const enum使用的可能性,因为它们的transpilation需要类型信息。
我有大量的const enums,在不使用const提供的内联时:
1.由于属性名称太长,即使缩小后,最终仍有数百KB
1.泄漏我不想公开的内部后端属性名称
现在我有这些从后端原生代码自动生成的const enum定义。作为一个人为的例子,你可以想象我在苹果工作,有一个很大的每个硬件设备的const枚举。

const enum HardwareType {
    Apple1 = 0,
    // ...
    iPhoneX = 412,
    // ...
    iPhoneUltraXD = 499, // Some theoretical unannounced iPhone
}

如果我只是把const enum HardwareType改为enum HardwareType,除了增加我的捆绑包大小外,我现在已经向公众泄露了新的“iPhone Ultra XD”。
我看到Terser支持--mangle-props选项,但即使是这样,官方文档中似乎也有警告,这也意味着要创建一个覆盖每个HardwareType的正则表达式?更不用说这只是我的人工示例,我在现实中有几十个这样的枚举,有几百个值。
我真的很想使用最新的技术进行应用程序绑定,但是对于常量值的编译时内联,真的没有更好的选择吗?

3vpjnl9f

3vpjnl9f1#

const enum在隐藏原始名称方面不是很安全。正如您在playground中看到的,typescript编译器在注解中添加了原始名称:

// Input:
const enum Fruites {
    Apple = 1,
    Banana = 2
}

const x = Fruites.Apple
const y = Fruites.Banana

// Output:
"use strict";
const x = 1 /* Apple */;
const y = 2 /* Banana */;

如果你真的想使用最新的技术来捆绑应用程序,并且想在输出文件中隐藏一些秘密名称,试着使用esbuild-loaderesbuild本身。它支持define选项,允许你在编译时用无意义的值来替换一些秘密名称,就像这样

define: {
  "secrets.hardwareType.iPhoneUltraXD": "499"
}

并安全地使用源代码中定义的值

// Source code: 
if (deviceId === secrets.hardwareType.iPhoneUltraXD) {
// Bundled code:
if(deviceId===499){

define选项可以在webpack或esbuild配置文件中使用任何计算值(甚至使用必需的json文件)启动,因此您对编译时定义的计数没有限制。

相关问题