mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
In order to investigate the performances of SSR, this commit introduces a benchmark suite which will measure several step of the rendering. PR Close #57647
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.dev/license
|
|
*/
|
|
|
|
import {DOCUMENT} from '@angular/common';
|
|
import {
|
|
inject,
|
|
Inject,
|
|
Injectable,
|
|
Injector,
|
|
ɵstartMeasuring as startMeasuring,
|
|
ɵstopMeasuring as stopMeasuring,
|
|
} from '@angular/core';
|
|
|
|
import {serializeDocument} from './domino_adapter';
|
|
import {ENABLE_DOM_EMULATION} from './tokens';
|
|
|
|
/**
|
|
* Representation of the current platform state.
|
|
*
|
|
* @publicApi
|
|
*/
|
|
@Injectable()
|
|
export class PlatformState {
|
|
/* @internal */
|
|
_enableDomEmulation = enableDomEmulation(inject(Injector));
|
|
|
|
constructor(@Inject(DOCUMENT) private _doc: any) {}
|
|
|
|
/**
|
|
* Renders the current state of the platform to string.
|
|
*/
|
|
renderToString(): string {
|
|
if (ngDevMode && !this._enableDomEmulation && !window?.document) {
|
|
throw new Error('Disabled DOM emulation should only run in browser environments');
|
|
}
|
|
|
|
const measuringLabel = 'renderToString';
|
|
startMeasuring(measuringLabel);
|
|
const rendered = this._enableDomEmulation
|
|
? serializeDocument(this._doc)
|
|
: // In the case we run/test the platform-server in a browser environment
|
|
this._doc.documentElement.outerHTML;
|
|
stopMeasuring(measuringLabel);
|
|
return rendered;
|
|
}
|
|
|
|
/**
|
|
* Returns the current DOM state.
|
|
*/
|
|
getDocument(): any {
|
|
return this._doc;
|
|
}
|
|
}
|
|
|
|
export function enableDomEmulation(injector: Injector): boolean {
|
|
return injector.get(ENABLE_DOM_EMULATION, true);
|
|
}
|