fix(compiler): fix a few non-tree-shakeable code patterns (#24677)
This change makes @angular/compiler more tree-shakeable by changing an enum to a const enum and by getting rid of a top-level map that the tree-shaker was seeing as a reference which caused r3_identifiers to be retained. This drops a few hundred bytes of JS from tree-shaken ngtsc compiled apps. PR Close #24677
This commit is contained in:
parent
69510acb20
commit
50d4a4fe5c
|
@ -32,12 +32,20 @@ import {htmlAstToRender3Ast} from '../r3_template_transform';
|
||||||
import {R3QueryMetadata} from './api';
|
import {R3QueryMetadata} from './api';
|
||||||
import {CONTEXT_NAME, I18N_ATTR, I18N_ATTR_PREFIX, ID_SEPARATOR, IMPLICIT_REFERENCE, MEANING_SEPARATOR, REFERENCE_PREFIX, RENDER_FLAGS, TEMPORARY_NAME, asLiteral, getQueryPredicate, invalid, mapToExpression, noop, temporaryAllocator, trimTrailingNulls, unsupported} from './util';
|
import {CONTEXT_NAME, I18N_ATTR, I18N_ATTR_PREFIX, ID_SEPARATOR, IMPLICIT_REFERENCE, MEANING_SEPARATOR, REFERENCE_PREFIX, RENDER_FLAGS, TEMPORARY_NAME, asLiteral, getQueryPredicate, invalid, mapToExpression, noop, temporaryAllocator, trimTrailingNulls, unsupported} from './util';
|
||||||
|
|
||||||
const BINDING_INSTRUCTION_MAP: {[type: number]: o.ExternalReference} = {
|
function mapBindingToInstruction(type: BindingType): o.ExternalReference|undefined {
|
||||||
[BindingType.Property]: R3.elementProperty,
|
switch (type) {
|
||||||
[BindingType.Attribute]: R3.elementAttribute,
|
case BindingType.Property:
|
||||||
[BindingType.Class]: R3.elementClassNamed,
|
return R3.elementProperty;
|
||||||
[BindingType.Style]: R3.elementStyleNamed,
|
case BindingType.Attribute:
|
||||||
};
|
return R3.elementAttribute;
|
||||||
|
case BindingType.Class:
|
||||||
|
return R3.elementClassNamed;
|
||||||
|
case BindingType.Style:
|
||||||
|
return R3.elementStyleNamed;
|
||||||
|
default:
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// `className` is used below instead of `class` because the interception
|
// `className` is used below instead of `class` because the interception
|
||||||
// code (where this map is used) deals with DOM element property values
|
// code (where this map is used) deals with DOM element property values
|
||||||
|
@ -414,7 +422,7 @@ export class TemplateDefinitionBuilder implements t.Visitor<void>, LocalResolver
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const instruction = BINDING_INSTRUCTION_MAP[input.type];
|
const instruction = mapBindingToInstruction(input.type);
|
||||||
if (instruction) {
|
if (instruction) {
|
||||||
// TODO(chuckj): runtime: security context?
|
// TODO(chuckj): runtime: security context?
|
||||||
this.instruction(
|
this.instruction(
|
||||||
|
|
|
@ -58,7 +58,7 @@ export class AttrAst implements TemplateAst {
|
||||||
visit(visitor: TemplateAstVisitor, context: any): any { return visitor.visitAttr(this, context); }
|
visit(visitor: TemplateAstVisitor, context: any): any { return visitor.visitAttr(this, context); }
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PropertyBindingType {
|
export const enum PropertyBindingType {
|
||||||
// A normal binding to a property (e.g. `[property]="expression"`).
|
// A normal binding to a property (e.g. `[property]="expression"`).
|
||||||
Property,
|
Property,
|
||||||
// A binding to an element attribute (e.g. `[attr.name]="expression"`).
|
// A binding to an element attribute (e.g. `[attr.name]="expression"`).
|
||||||
|
|
|
@ -356,9 +356,6 @@
|
||||||
{
|
{
|
||||||
"name": "CORE"
|
"name": "CORE"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "CORE$1"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "CR"
|
"name": "CR"
|
||||||
},
|
},
|
||||||
|
@ -803,9 +800,6 @@
|
||||||
{
|
{
|
||||||
"name": "Identifiers"
|
"name": "Identifiers"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Identifiers$1"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "IfStmt"
|
"name": "IfStmt"
|
||||||
},
|
},
|
||||||
|
@ -1208,9 +1202,6 @@
|
||||||
{
|
{
|
||||||
"name": "PreparsedElementType"
|
"name": "PreparsedElementType"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "PropertyBindingType"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "PropertyRead"
|
"name": "PropertyRead"
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue