【发布时间】:2018-03-16 23:45:40
【问题描述】:
使用 UglifyJS 时,函数名称会被破坏,除非 keep_fnames 设置为 true。例如下面的 Typescript 代码:
class Test {}
console.log(Test.name);
编译成 JS 为:
function Test() {}
console.log(Test.name);
将被丑化为:
function t() {}
console.log(t.name);
并将t 而非test 输出到控制台。
有没有办法(other than using keep_fnames option)在丑化后保留name 属性? (我不想使用keep_fnames:true,因为它会大大增加捆绑包的大小。
我想到的可能解决方案:
- 编写一个 Webpack 插件,对函数名称
Test.name = 'Test'进行硬编码,但这不起作用,因为Function.prototype.name是只读属性; - 使用 Typescript 装饰器、元数据和反射 API,但
design:type元数据不会为类发出,它只为属性发出(我相信这是因为Function.prototype.name存在,但我猜他们错过了这个极端情况?) .
【问题讨论】:
-
你能写一个 Webpack 插件,用
"Test"替换Test.name的实例吗?类似于DefinePlugin所做的。 -
我猜是的,但在这种情况下,我简化了示例。在我的实际用例中,
.name属性是从我作为私有 npm 包编写的外部库中访问的。 -
@user5365075 这个库需要
.name做什么? -
这个库使用类名来创建一个服务注册中心,并将这些服务注入到其他服务和类中。提供服务 ID 并不能解决任何问题,因为 lib 还依赖
.name来获取要注入的类型。 Mangling 替换了函数名,从而破坏了 typescript 元数据,它不存储字符串类型值,而是对类的引用(编译时成为函数)。
标签: javascript typescript webpack ecmascript-6 uglifyjs