-
Notifications
You must be signed in to change notification settings - Fork 12k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ES2015 Class with decorators are not being treeshaken away #14610
Milestone
Comments
alan-agius4
changed the title
ES2015 class with decorators are not being treeshaken away
ES2015 Class with decorators are not being treeshaken away
May 31, 2019
alexeagle
pushed a commit
that referenced
this issue
Jun 6, 2019
…or better tree-shaking ClassExpressions such as the below are not treeshakable unless we wrap them in an IIFE ```js let AggregateColumnDirective = class AggregateColumnDirective { constructor(viewContainerRef) { } }; AggregateColumnDirective = __decorate([ Directive({}), __metadata("design:paramtypes", [ViewContainerRef]) ], AggregateColumnDirective); ``` With this change we wrap the above in an IIFE and mark it as a PURE function. ```js const AggregateColumnDirective = /*@__PURE__*/ (() => { let AggregateColumnDirective = class AggregateColumnDirective { constructor(viewContainerRef) { } }; AggregateColumnDirective = __decorate([ Directive({}), __metadata("design:paramtypes", [ViewContainerRef]) ], AggregateColumnDirective); return AggregateColumnDirective; })(); ``` With this pattern if the class is unused it will be dropped. Note: In future we should rename `wrap-enums` to something more generic, and combine class-fold with this transformer especially considering the future fix that needs to be done for #14610 Fixes #14577
alexeagle
pushed a commit
that referenced
this issue
Jun 6, 2019
…FE for better treeshaking With this change we wrap ClassDeclarations inside an IIFE, also we move some code from the class fold into the wrap-enums. This changes the below code: ```js export class Foo { method() { } } Foo.bar = 'barValue'; __decorate([ methodDecorator ], Foo.prototype, "method", null); ``` to ```js export const Foo = /*@__PURE__*/ (() => { class Foo { method() { } } Foo.bar = 'barValue'; __decorate([ methodDecorator ], Foo.prototype, "method", null); return Foo; })(); ``` Fixes #14610
alexeagle
pushed a commit
that referenced
this issue
Jun 6, 2019
…or better tree-shaking ClassExpressions such as the below are not treeshakable unless we wrap them in an IIFE ```js let AggregateColumnDirective = class AggregateColumnDirective { constructor(viewContainerRef) { } }; AggregateColumnDirective = __decorate([ Directive({}), __metadata("design:paramtypes", [ViewContainerRef]) ], AggregateColumnDirective); ``` With this change we wrap the above in an IIFE and mark it as a PURE function. ```js const AggregateColumnDirective = /*@__PURE__*/ (() => { let AggregateColumnDirective = class AggregateColumnDirective { constructor(viewContainerRef) { } }; AggregateColumnDirective = __decorate([ Directive({}), __metadata("design:paramtypes", [ViewContainerRef]) ], AggregateColumnDirective); return AggregateColumnDirective; })(); ``` With this pattern if the class is unused it will be dropped. Note: In future we should rename `wrap-enums` to something more generic, and combine class-fold with this transformer especially considering the future fix that needs to be done for #14610 Fixes #14577
alexeagle
pushed a commit
that referenced
this issue
Jun 6, 2019
…FE for better treeshaking With this change we wrap ClassDeclarations inside an IIFE, also we move some code from the class fold into the wrap-enums. This changes the below code: ```js export class Foo { method() { } } Foo.bar = 'barValue'; __decorate([ methodDecorator ], Foo.prototype, "method", null); ``` to ```js export const Foo = /*@__PURE__*/ (() => { class Foo { method() { } } Foo.bar = 'barValue'; __decorate([ methodDecorator ], Foo.prototype, "method", null); return Foo; })(); ``` Fixes #14610
Hi @alan-agius4 , still facing same issue, tree-shaking not working properly |
This issue has been automatically locked due to inactivity. Read more about our automatic conversation locking policy. This action has been performed automatically by a bot. |
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
🐞 Bug report
Command (mark with an
x
)Description
When not using tsickle, TypeScript emits the following code for classes which have property or method decorators
The problematic as terser is unable to drop the above code if the Class is unused.
🌍 Your Environment
Anything else relevant?
Related to #14577
The text was updated successfully, but these errors were encountered: