Add simple JS init performance trace (#31459)

Related to #23461, and help some cases like #31412

For developers, they could use browser's Performance tool to collect
performance data, while this PR is also quite handy to optimize the
`index.js`.

For end users, this PR is simple enough and could figure out the slow
function quickly.


![image](https://github.com/go-gitea/gitea/assets/2114189/a557b08e-6594-474b-81a3-03d5ac2bd68e)
pull/31445/head^2
wxiaoguang 2024-06-22 17:20:20 +07:00 committed by GitHub
parent 1a811c0bd1
commit 1d76e9aabf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 129 additions and 101 deletions

@ -94,110 +94,138 @@ import {
import {initGlobalDropzone} from './features/dropzone.js'; import {initGlobalDropzone} from './features/dropzone.js';
import {initGlobalEnterQuickSubmit, initGlobalFormDirtyLeaveConfirm} from './features/common-form.js'; import {initGlobalEnterQuickSubmit, initGlobalFormDirtyLeaveConfirm} from './features/common-form.js';
// Init Gitea's Fomantic settings
initGiteaFomantic(); initGiteaFomantic();
initDirAuto(); initDirAuto();
initSubmitEventPolyfill(); initSubmitEventPolyfill();
function callInitFunctions(functions) {
// Start performance trace by accessing a URL by "https://localhost/?_ui_performance_trace=1" or "https://localhost/?key=value&_ui_performance_trace=1"
// It is a quick check, no side effect so no need to do slow URL parsing.
const initStart = performance.now();
if (window.location.search.includes('_ui_performance_trace=1')) {
let results = [];
for (const func of functions) {
const start = performance.now();
func();
results.push({name: func.name, dur: performance.now() - start});
}
results = results.sort((a, b) => b.dur - a.dur);
for (let i = 0; i < 20 && i < results.length; i++) {
// eslint-disable-next-line no-console
console.log(`performance trace: ${results[i].name} ${results[i].dur.toFixed(3)}`);
}
} else {
for (const func of functions) {
func();
}
}
const initDur = performance.now() - initStart;
if (initDur > 500) {
console.error(`slow init functions took ${initDur.toFixed(3)}ms`);
}
}
onDomReady(() => { onDomReady(() => {
initGlobalDropdown(); callInitFunctions([
initGlobalTabularMenu(); initGlobalDropdown,
initGlobalShowModal(); initGlobalTabularMenu,
initGlobalFetchAction(); initGlobalShowModal,
initGlobalTooltips(); initGlobalFetchAction,
initGlobalButtonClickOnEnter(); initGlobalTooltips,
initGlobalButtons(); initGlobalButtonClickOnEnter,
initGlobalCopyToClipboardListener(); initGlobalButtons,
initGlobalDropzone(); initGlobalCopyToClipboardListener,
initGlobalEnterQuickSubmit(); initGlobalDropzone,
initGlobalFormDirtyLeaveConfirm(); initGlobalEnterQuickSubmit,
initGlobalDeleteButton(); initGlobalFormDirtyLeaveConfirm,
initGlobalDeleteButton,
initCommonOrganization();
initCommonIssueListQuickGoto(); initCommonOrganization,
initCommonIssueListQuickGoto,
initCompSearchUserBox();
initCompWebHookEditor(); initCompSearchUserBox,
initCompWebHookEditor,
initInstall();
initInstall,
initHeadNavbarContentToggle();
initFootLanguageMenu(); initHeadNavbarContentToggle,
initFootLanguageMenu,
initCommentContent();
initContextPopups(); initCommentContent,
initHeatmap(); initContextPopups,
initImageDiff(); initHeatmap,
initMarkupAnchors(); initImageDiff,
initMarkupContent(); initMarkupAnchors,
initSshKeyFormParser(); initMarkupContent,
initStopwatch(); initSshKeyFormParser,
initTableSort(); initStopwatch,
initAutoFocusEnd(); initTableSort,
initFindFileInRepo(); initAutoFocusEnd,
initCopyContent(); initFindFileInRepo,
initCopyContent,
initAdminCommon();
initAdminEmails(); initAdminCommon,
initAdminUserListSearchForm(); initAdminEmails,
initAdminConfigs(); initAdminUserListSearchForm,
initAdminSelfCheck(); initAdminConfigs,
initAdminSelfCheck,
initDashboardRepoList();
initDashboardRepoList,
initNotificationCount();
initNotificationsTable(); initNotificationCount,
initNotificationsTable,
initOrgTeamSearchRepoBox();
initOrgTeamSettings(); initOrgTeamSearchRepoBox,
initOrgTeamSettings,
initRepoActivityTopAuthorsChart();
initRepoArchiveLinks(); initRepoActivityTopAuthorsChart,
initRepoBranchButton(); initRepoArchiveLinks,
initRepoCodeView(); initRepoBranchButton,
initRepoCommentForm(); initRepoCodeView,
initRepoEllipsisButton(); initRepoCommentForm,
initRepoDiffCommitBranchesAndTags(); initRepoEllipsisButton,
initRepoEditor(); initRepoDiffCommitBranchesAndTags,
initRepoGraphGit(); initRepoEditor,
initRepoIssueContentHistory(); initRepoGraphGit,
initRepoIssueDue(); initRepoIssueContentHistory,
initRepoIssueList(); initRepoIssueDue,
initRepoIssueSidebarList(); initRepoIssueList,
initArchivedLabelHandler(); initRepoIssueSidebarList,
initRepoIssueReferenceRepositorySearch(); initArchivedLabelHandler,
initRepoIssueTimeTracking(); initRepoIssueReferenceRepositorySearch,
initRepoIssueWipTitle(); initRepoIssueTimeTracking,
initRepoMigration(); initRepoIssueWipTitle,
initRepoMigrationStatusChecker(); initRepoMigration,
initRepoProject(); initRepoMigrationStatusChecker,
initRepoPullRequestMergeInstruction(); initRepoProject,
initRepoPullRequestAllowMaintainerEdit(); initRepoPullRequestMergeInstruction,
initRepoPullRequestReview(); initRepoPullRequestAllowMaintainerEdit,
initRepoRelease(); initRepoPullRequestReview,
initRepoReleaseNew(); initRepoRelease,
initRepoSettingGitHook(); initRepoReleaseNew,
initRepoSettingSearchTeamBox(); initRepoSettingGitHook,
initRepoSettingsCollaboration(); initRepoSettingSearchTeamBox,
initRepoTemplateSearch(); initRepoSettingsCollaboration,
initRepoTopicBar(); initRepoTemplateSearch,
initRepoWikiForm(); initRepoTopicBar,
initRepository(); initRepoWikiForm,
initRepositoryActionView(); initRepository,
initRepositorySearch(); initRepositoryActionView,
initRepoContributors(); initRepositorySearch,
initRepoCodeFrequency(); initRepoContributors,
initRepoRecentCommits(); initRepoCodeFrequency,
initRepoRecentCommits,
initCommitStatuses();
initCaptcha(); initCommitStatuses,
initCaptcha,
initUserAuthOauth2();
initUserAuthWebAuthn(); initUserAuthOauth2,
initUserAuthWebAuthnRegister(); initUserAuthWebAuthn,
initUserSettings(); initUserAuthWebAuthnRegister,
initRepoDiffView(); initUserSettings,
initPdfViewer(); initRepoDiffView,
initScopedAccessTokenCategories(); initPdfViewer,
initColorPickers(); initScopedAccessTokenCategories,
initColorPickers,
]);
}); });