perf(compiler): use a shared interpolation regex (#34332)
The template parser has a certain interpolation config associated with it and builds a regular expression each time it needs to extract the interpolations from an input string. Since the interpolation config is typically the default of `{{` and `}}`, the regular expression doesn't have to be recreated each time. Therefore, this commit creates only a single regular expression instance that is used for the default configuration. In a large compilation unit with big templates, computing the regular expression took circa 275ms. This change reduces this to effectively zero. PR Close #34332
This commit is contained in:
parent
4945274080
commit
014a7137f4
@ -23,6 +23,15 @@ export class TemplateBindingParseResult {
|
|||||||
public errors: ParserError[]) {}
|
public errors: ParserError[]) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultInterpolateRegExp = _createInterpolateRegExp(DEFAULT_INTERPOLATION_CONFIG);
|
||||||
|
function _getInterpolateRegExp(config: InterpolationConfig): RegExp {
|
||||||
|
if (config === DEFAULT_INTERPOLATION_CONFIG) {
|
||||||
|
return defaultInterpolateRegExp;
|
||||||
|
} else {
|
||||||
|
return _createInterpolateRegExp(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function _createInterpolateRegExp(config: InterpolationConfig): RegExp {
|
function _createInterpolateRegExp(config: InterpolationConfig): RegExp {
|
||||||
const pattern = escapeRegExp(config.start) + '([\\s\\S]*?)' + escapeRegExp(config.end);
|
const pattern = escapeRegExp(config.start) + '([\\s\\S]*?)' + escapeRegExp(config.end);
|
||||||
return new RegExp(pattern, 'g');
|
return new RegExp(pattern, 'g');
|
||||||
@ -138,7 +147,7 @@ export class Parser {
|
|||||||
input: string, location: string,
|
input: string, location: string,
|
||||||
interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): SplitInterpolation
|
interpolationConfig: InterpolationConfig = DEFAULT_INTERPOLATION_CONFIG): SplitInterpolation
|
||||||
|null {
|
|null {
|
||||||
const regexp = _createInterpolateRegExp(interpolationConfig);
|
const regexp = _getInterpolateRegExp(interpolationConfig);
|
||||||
const parts = input.split(regexp);
|
const parts = input.split(regexp);
|
||||||
if (parts.length <= 1) {
|
if (parts.length <= 1) {
|
||||||
return null;
|
return null;
|
||||||
@ -201,7 +210,7 @@ export class Parser {
|
|||||||
|
|
||||||
private _checkNoInterpolation(
|
private _checkNoInterpolation(
|
||||||
input: string, location: any, interpolationConfig: InterpolationConfig): void {
|
input: string, location: any, interpolationConfig: InterpolationConfig): void {
|
||||||
const regexp = _createInterpolateRegExp(interpolationConfig);
|
const regexp = _getInterpolateRegExp(interpolationConfig);
|
||||||
const parts = input.split(regexp);
|
const parts = input.split(regexp);
|
||||||
if (parts.length > 1) {
|
if (parts.length > 1) {
|
||||||
this._reportError(
|
this._reportError(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user