越来越多的现代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
的正则表达式?更不用说这只是我的人工示例,我在现实中有几十个这样的枚举,有几百个值。
我真的很想使用最新的技术进行应用程序绑定,但是对于常量值的编译时内联,真的没有更好的选择吗?
1条答案
按热度按时间3vpjnl9f1#
const enum
在隐藏原始名称方面不是很安全。正如您在playground中看到的,typescript编译器在注解中添加了原始名称:如果你真的想使用最新的技术来捆绑应用程序,并且想在输出文件中隐藏一些秘密名称,试着使用esbuild-loader或esbuild本身。它支持define选项,允许你在编译时用无意义的值来替换一些秘密名称,就像这样
并安全地使用源代码中定义的值
define
选项可以在webpack或esbuild配置文件中使用任何计算值(甚至使用必需的json文件)启动,因此您对编译时定义的计数没有限制。