Skip to content
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

Task: Implement lazy loading #2229

Merged
merged 42 commits into from
Aug 17, 2023
Merged
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
574ce4f
lazy loading
Onokaev Sep 14, 2022
72fd8f7
change spinner size for lazy loading
Onokaev Oct 6, 2022
d1a180a
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Oct 6, 2022
866285d
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Oct 21, 2022
dea974e
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Nov 10, 2022
2d28e55
update branch
Onokaev Nov 10, 2022
b444e23
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Nov 24, 2022
1d630db
merge dev
Onokaev Nov 24, 2022
eb4adfe
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Nov 25, 2022
eb575b7
add a suspense wrapper component
Onokaev Nov 25, 2022
0604214
remove react imports
Onokaev Nov 25, 2022
abf3584
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Dec 5, 2022
ebd9f25
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Feb 1, 2023
e640ded
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Feb 15, 2023
1fb51a1
add an error boundary and a component registry
Onokaev Feb 20, 2023
385be5d
refactor components to a component registry
Onokaev Feb 21, 2023
2d72337
Refactor lazy imports to module scope
Onokaev Feb 21, 2023
59d8dd8
remove unused imports
Onokaev Feb 21, 2023
8efbcb1
Update error messaging
Onokaev Mar 28, 2023
f059db9
Maintain component contract for lazy loaded components
Onokaev Apr 3, 2023
b33fc2c
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Apr 3, 2023
7e7a281
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Jul 18, 2023
5805c71
Use a single component registry
Onokaev Jul 18, 2023
3df9306
Use nullish coalescing operator
Onokaev Jul 18, 2023
9a8b95a
Fix augloop reference
Onokaev Jul 18, 2023
291ee12
Fix default exports
Onokaev Jul 28, 2023
5c4c0e6
Wrap popups with suspense loader
Onokaev Jul 28, 2023
025503a
Maintain consistent exporting convention
Onokaev Jul 28, 2023
141c341
Increase chunk size
Onokaev Jul 28, 2023
1c79679
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Jul 28, 2023
567ac22
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Jul 31, 2023
0a22342
Remove any types
Onokaev Jul 31, 2023
2a6dc7c
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Aug 8, 2023
17f0027
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Aug 14, 2023
ad5875c
Merge branch 'dev' into task/implement-lazy-loading
Onokaev Aug 16, 2023
43c0544
Update src/app/views/query-runner/request/Request.tsx
Onokaev Aug 17, 2023
1937bfa
Update src/app/views/query-runner/request/Request.tsx
Onokaev Aug 17, 2023
da4976e
Update src/app/views/query-runner/request/Request.tsx
Onokaev Aug 17, 2023
273426f
Update src/app/views/common/lazy-loader/component-registry/index.tsx
Onokaev Aug 17, 2023
348333c
Fix fallback text grammar
Onokaev Aug 17, 2023
cab26ab
Merge branch 'task/implement-lazy-loading' of https://github.com/micr…
Onokaev Aug 17, 2023
4a4861b
Fix import typo
Onokaev Aug 17, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion config/webpack.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ module.exports = function (webpackEnv) {
// There will be one main bundle, and one file per asynchronous chunk.
// In development, it does not produce real files.
filename: 'static/js/graph-explorer-v2.js',
chunkFilename: 'static/js/graph-explorer.chunk.[name].[chunkhash].js',
// We inferred the "public path" (such as / or /my-project) from homepage.
// We use "/" in development.
publicPath,
Expand Down Expand Up @@ -413,7 +414,7 @@ module.exports = function (webpackEnv) {
},
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1
maxChunks: 50
}),
new MonacoWebpackPlugin({
languages: [
Expand Down
16 changes: 15 additions & 1 deletion src/app/services/hooks/usePopups.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,24 @@
import { PopupItem, popups } from '../../views/common/registry/popups';
import {
ShareQuery, FullPermissions, PreviewCollection, ThemeChoser
} from '../../views/common/lazy-loader/component-registry';
import {
POPUPS, PopupsProps, PopupsType,
UsePopupsResponse,
usePopupsDispatchContext, usePopupsStateContext
} from '../context/popups-context';

type PopupItem =
'share-query' |
'theme-chooser' |
'preview-collection' |
'full-permissions';

const popups = new Map<string, any>([
['share-query', ShareQuery],
['theme-chooser', ThemeChoser],
['preview-collection', PreviewCollection],
['full-permissions', FullPermissions]
])

const usePopups = <Data = {}>(item: PopupItem , type: PopupsType,
reference?: string): UsePopupsResponse<Data> => {
Expand Down
6 changes: 3 additions & 3 deletions src/app/views/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,19 @@ import { GRAPH_URL } from '../services/graph-constants';
import { parseSampleUrl } from '../utils/sample-url-generation';
import { substituteTokens } from '../utils/token-helpers';
import { translateMessage } from '../utils/translate-messages';
import { StatusMessages, TermsOfUseMessage } from './app-sections';
import { TermsOfUseMessage } from './app-sections';
import { StatusMessages } from './common/lazy-loader/component-registry';
import { headerMessaging } from './app-sections/HeaderMessaging';
import { appStyles } from './App.styles';
import { classNames } from './classnames';
import { KeyboardCopyEvent } from './common/copy/KeyboardCopyEvent';
import { KeyboardCopyEvent } from './common/copy-button/KeyboardCopyEvent';
import PopupsWrapper from './common/popups/PopupsWrapper';
import { createShareLink } from './common/share';
import { MainHeader } from './main-header/MainHeader';
import { QueryResponse } from './query-response';
import { QueryRunner } from './query-runner';
import { parse } from './query-runner/util/iframe-message-parser';
import { Sidebar } from './sidebar/Sidebar';

export interface IAppProps {
theme?: ITheme;
styles?: object;
Expand Down
1 change: 0 additions & 1 deletion src/app/views/authentication/profile/Profile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import { translateMessage } from '../../../utils/translate-messages';
import { classNames } from '../../classnames';
import { authenticationStyles } from '../Authentication.styles';
import { profileStyles } from './Profile.styles';

const getInitials = (name: string) => {
let initials = '';
if (name && name !== '') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ interface ICopyButtonProps {
isIconButton: boolean;
}

export function CopyButton(props:ICopyButtonProps) {
export default function CopyButton(props:ICopyButtonProps) {
const [copied, setCopied] = useState(false);

const copyIcon: IIconProps = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export const KeyboardCopyEvent = () => {
});
const filteredTargetIds = targetIds.filter((value) => value !== null)!;
const componentName = Object.keys(componentList).find(key => filteredTargetIds.includes(key));
return componentName || '';
return componentName ?? '';
}

const getTargetId = (target: EventTarget) => {
Expand Down
2 changes: 2 additions & 0 deletions src/app/views/common/copy-button/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import CopyButton from './CopyButton';
export default CopyButton;
5 changes: 2 additions & 3 deletions src/app/views/common/error-boundary/ErrorBoundary.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { Label } from '@fluentui/react';
import React, { ReactNode, useState, useEffect } from 'react';

import { translateMessage } from '../../../utils/translate-messages';

interface Props {
Expand All @@ -27,7 +26,7 @@ function ErrorBoundary(props: Props) {
};

if (state.hasError) {
return <Label>{translateMessage('Something went wrong')}</Label>;
return <Label>{translateMessage('Something went wrong. Reload the tab again')}</Label>;
} else {
return (
<React.Fragment>
Expand All @@ -39,4 +38,4 @@ function ErrorBoundary(props: Props) {
}
}

export default ErrorBoundary;
export default ErrorBoundary;
156 changes: 156 additions & 0 deletions src/app/views/common/lazy-loader/component-registry/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
/* eslint-disable max-len */
import { lazy } from 'react';
import { IPermissionProps } from '../../../../../types/permissions';
import { SuspenseLoader } from '../suspense-loader/SuspenseLoader';

const LazySpecificPermissions = lazy(() =>
import(/* webpackChunkName: "permissions" */ '../../../query-runner/request/permissions'));
const LazyStatusMessages = lazy( () =>
import(/* webpackChunkName: "statusMessages" */ '../../../app-sections/StatusMessages'));
const LazyResponseHeaders = lazy(() =>
import(/* webpackChunkName: "responseHeaders" */ '../../../query-response/headers/ResponseHeaders'));
const LazyAdaptiveCard = lazy(() =>
import(/* webpackChunkName: "adaptiveCards" */ '../../../query-response/adaptive-cards/AdaptiveCard'));
const LazyGraphToolkit = lazy(() =>
import(/* webpackChunkName: "graphToolkit" */ '../../../query-response/graph-toolkit/GraphToolkit'));
const LazySnippets = lazy(() =>
import(/* webpackChunkName: "code snippets" */ '../../../query-response/snippets/Snippets'));
const LazyCopyButton = lazy(() =>
import(/* webpackChunkName: "copy button" */ '../../copy-button/CopyButton'));
const LazyAuth = lazy(() =>
import(/* webpackChunkName: "authTab" */ '../../../query-runner/request/auth/Auth'));
const LazyRequestHeaders = lazy(() =>
import(/* webpackChunkName: "requestHeaders" */ '../../../query-runner/request/headers/RequestHeaders'));
const LazyHistory = lazy(() =>
import(/* webpackChunkName: "history" */ '../../../sidebar/history/History'));
const LazyResourceExplorer = lazy(() =>
import(/* webpackChunkName: "resourceExplorer" */ '../../../sidebar/resource-explorer/ResourceExplorer'));
const LazyShareQuery = lazy(() =>
import(/* webpackChunkName: "share query" */ '../../../query-runner/query-input/share-query/ShareQuery'));
const LazyThemeChoser = lazy(() =>
import(/* webpackChunkName: "theme chooser" */ '../../../main-header/settings/ThemeChooser'));
const LazyPreviewCollection = lazy(() =>
import(/* webpackChunkName: "preview collection" */ '../../../sidebar/resource-explorer/collection/PreviewCollection'));
const LazyFullPermissions = lazy(() =>
import(/* webpackChunkName: "full permissions" */ '../../../query-runner/request/permissions/Permissions.Full'));

export const Permission = (props?: IPermissionProps) => {
return (
<SuspenseLoader>
<LazySpecificPermissions {...props} />
</SuspenseLoader>
)
}

export const StatusMessages = () => {
return (
<SuspenseLoader>
<LazyStatusMessages />
</SuspenseLoader>
)
}

export const AdaptiveCards = (props?: any) => {
return (
<SuspenseLoader>
<LazyAdaptiveCard {...props} />
</SuspenseLoader>
)
}

export const GraphToolkit = (props?: any) => {
return (
<SuspenseLoader>
<LazyGraphToolkit {...props} />
</SuspenseLoader>
)
}

export const ResponseHeaders = (props?: any) => {
return (
<SuspenseLoader>
<LazyResponseHeaders {...props} />
</SuspenseLoader>
)
}

export const Snippets = (props?: any) => {
return (
<SuspenseLoader>
<LazySnippets {...props} />
</SuspenseLoader>
)
}

export const CopyButton = (props?: any) => {
return (
<SuspenseLoader>
<LazyCopyButton {...props} />
</SuspenseLoader>
)
}

export const Auth = (props?: any) => {
return (
<SuspenseLoader>
<LazyAuth {...props} />
</SuspenseLoader>
)
}

export const RequstHeaders = (props?: any) => {
return (
<SuspenseLoader>
<LazyRequestHeaders {...props} />
</SuspenseLoader>
)
}

export const History = (props?: any) => {
return (
<SuspenseLoader>
<LazyHistory {...props} />
</SuspenseLoader>
)
}

export const ResourceExplorer = (props?: any) => {
return (
<SuspenseLoader>
<LazyResourceExplorer {...props} />
</SuspenseLoader>
)
}

export const ShareQuery = (props?: any) => {
return (
<SuspenseLoader>
<LazyShareQuery {...props} />
</SuspenseLoader>
)
}

export const ThemeChoser = (props?: any) => {
return (
<SuspenseLoader>
<LazyThemeChoser {...props} />
</SuspenseLoader>
)
}

export const PreviewCollection = (props?: any) => {
return (
<SuspenseLoader>
<LazyPreviewCollection {...props} />
</SuspenseLoader>
)
}

export const FullPermissions = (props?: any) => {
return (
<SuspenseLoader>
<LazyFullPermissions {...props} />
</SuspenseLoader>
)
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Spinner, SpinnerSize } from '@fluentui/react';
import { Suspense } from 'react';
import ErrorBoundary from '../../error-boundary/ErrorBoundary';

interface SuspenseChildren{
children: React.ReactNode;
}
export const SuspenseLoader = ({ children }: SuspenseChildren) => {
return (
<ErrorBoundary>
<Suspense fallback={<Spinner size={SpinnerSize.large} />}>
{children}
</Suspense>
</ErrorBoundary >
);
}
14 changes: 0 additions & 14 deletions src/app/views/common/registry/popups.tsx

This file was deleted.

Loading