Improve lazy loading (#12393)

Creating manual chunk was a bad idea, we should always solve lazy
loading problem at the source instance.

Setting a 4.5MB for the index bundle size, CI will fail if we go above.

There is still a lot of room for optimizations!
- More agressive lazy loading (e.g. xyflow and tiptap are still loaded
in index!)
- Add a  prefetch mechanism
- Add stronger CI checks to make sure libraries we've set asides are not
added back
- Fix AllIcons component with does not work as intended (loaded on
initial load)
This commit is contained in:
Félix Malfait
2025-06-01 09:33:16 +02:00
committed by GitHub
parent c74d7fe986
commit f6bfec882a
37 changed files with 577 additions and 277 deletions

View File

@ -1,6 +1,7 @@
import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { JestObjectMetadataItemSetter } from '~/testing/jest/JestObjectMetadataItemSetter';
import { useObjectNamePluralFromSingular } from '../useObjectNamePluralFromSingular';
describe('useObjectNamePluralFromSingular', () => {
@ -8,7 +9,13 @@ describe('useObjectNamePluralFromSingular', () => {
const { result } = renderHook(
() => useObjectNamePluralFromSingular({ objectNameSingular: 'person' }),
{
wrapper: RecoilRoot,
wrapper: ({ children }) => (
<RecoilRoot>
<JestObjectMetadataItemSetter>
{children}
</JestObjectMetadataItemSetter>
</RecoilRoot>
),
},
);

View File

@ -1,6 +1,7 @@
import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { JestObjectMetadataItemSetter } from '~/testing/jest/JestObjectMetadataItemSetter';
import { useObjectNameSingularFromPlural } from '../useObjectNameSingularFromPlural';
describe('useObjectNameSingularFromPlural', () => {
@ -8,7 +9,13 @@ describe('useObjectNameSingularFromPlural', () => {
const { result } = renderHook(
() => useObjectNameSingularFromPlural({ objectNamePlural: 'people' }),
{
wrapper: RecoilRoot,
wrapper: ({ children }) => (
<RecoilRoot>
<JestObjectMetadataItemSetter>
{children}
</JestObjectMetadataItemSetter>
</RecoilRoot>
),
},
);

View File

@ -1,13 +1,16 @@
import { isAppWaitingForFreshObjectMetadataState } from '@/object-metadata/states/isAppWaitingForFreshObjectMetadataState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { useRecoilCallback } from 'recoil';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
export const useLoadMockedObjectMetadataItems = () => {
const loadMockedObjectMetadataItems = useRecoilCallback(
({ set, snapshot }) =>
() => {
async () => {
const { generatedMockObjectMetadataItems } = await import(
'~/testing/mock-data/generatedMockObjectMetadataItems'
);
if (
!isDeeplyEqual(
snapshot.getLoadable(objectMetadataItemsState).getValue(),

View File

@ -1,33 +1,20 @@
import { useRecoilValue } from 'recoil';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { isDefined } from 'twenty-shared/utils';
import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace';
export const useObjectNamePluralFromSingular = ({
objectNameSingular,
}: {
objectNameSingular: string;
}) => {
const currentWorkspace = useRecoilValue(currentWorkspaceState);
let objectMetadataItem = useRecoilValue(
const objectMetadataItem = useRecoilValue(
objectMetadataItemFamilySelector({
objectName: objectNameSingular,
objectNameType: 'singular',
}),
);
if (!isWorkspaceActiveOrSuspended(currentWorkspace)) {
objectMetadataItem =
generatedMockObjectMetadataItems.find(
(objectMetadataItem) =>
objectMetadataItem.nameSingular === objectNameSingular,
) ?? null;
}
if (!isDefined(objectMetadataItem)) {
throw new Error(
`Object metadata item not found for ${objectNameSingular} object`,

View File

@ -1,33 +1,20 @@
import { useRecoilValue } from 'recoil';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { isDefined } from 'twenty-shared/utils';
import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace';
export const useObjectNameSingularFromPlural = ({
objectNamePlural,
}: {
objectNamePlural: string;
}) => {
const currentWorkspace = useRecoilValue(currentWorkspaceState);
let objectMetadataItem = useRecoilValue(
const objectMetadataItem = useRecoilValue(
objectMetadataItemFamilySelector({
objectName: objectNamePlural,
objectNameType: 'plural',
}),
);
if (!isWorkspaceActiveOrSuspended(currentWorkspace)) {
objectMetadataItem =
generatedMockObjectMetadataItems.find(
(objectMetadataItem) =>
objectMetadataItem.namePlural === objectNamePlural,
) ?? null;
}
if (!isDefined(objectMetadataItem)) {
throw new Error(
`Object metadata item not found for ${objectNamePlural} object`,