Files
payload/packages/ui/package.json
Alessio Gravili fd0ff51296 perf: faster page navigation by speeding up createClientConfig, speed up version fetching, speed up lexical init. Up to 100x faster (#9457)
If you had a lot of fields and collections, createClientConfig would be
extremely slow, as it was copying a lot of memory. In my test config
with a lot of fields and collections, it took 4 seconds(!!).

And not only that, it also ran between every single page navigation.

This PR significantly speeds up the createClientConfig function. In my
test config, its execution speed went from 4 seconds to 50 ms.
Additionally, createClientConfig is now properly cached in both dev &
prod. It no longer runs between every single page navigation. Even if
you trigger a full page reload, createClientConfig will be cached and
not run again. Despite that, HMR remains fully-functional.

This will make payload feel noticeably faster for large configs -
especially if it contains a lot of richtext fields, as it was previously
deep-copying the relatively large richText editor configs over and over
again.

## Before - 40 sec navigation speed

https://github.com/user-attachments/assets/fe6b707a-459b-44c6-982a-b277f6cbb73f

## After - 1 sec navigation speed

https://github.com/user-attachments/assets/384fba63-dc32-4396-b3c2-0353fcac6639

## Todo

- [x] Implement ClientSchemaMap and cache it, to remove
createClientField call in our form state endpoint
- [x] Enable schemaMap caching for dev
- [x] Cache lexical clientField generation, or add it to the parent
clientConfig

## Lexical changes

Red: old / removed
Green: new

![CleanShot 2024-11-22 at 21 07
41@2x](https://github.com/user-attachments/assets/f8321218-763c-4120-9353-076c381f33fb)

### Speed up version queries

This PR comes with performance optimizations for fetching versions
before a document is loaded. Not only does it use the new select API to
limit the fields it queries, it also completely skips a database query
if the current document is published.

### Speed up lexical init

Removes a bunch of unnecessary deep copying of lexical objects which
caused higher memory usage and slower load times. Additionally, the
lexical default config sanitization now happens less often.
2024-11-26 14:31:14 -07:00

251 lines
9.2 KiB
JSON

{
"name": "@payloadcms/ui",
"version": "3.1.1",
"homepage": "https://payloadcms.com",
"repository": {
"type": "git",
"url": "https://github.com/payloadcms/payload.git",
"directory": "packages/ui"
},
"license": "MIT",
"author": "Payload <dev@payloadcms.com> (https://payloadcms.com)",
"maintainers": [
{
"name": "Payload",
"email": "info@payloadcms.com",
"url": "https://payloadcms.com"
}
],
"sideEffects": false,
"type": "module",
"exports": {
".": {
"import": "./src/exports/client/index.ts",
"types": "./src/exports/client/index.ts",
"default": "./src/exports/client/index.ts"
},
"./shared": {
"import": "./src/exports/shared/index.ts",
"types": "./src/exports/shared/index.ts",
"default": "./src/exports/shared/index.ts"
},
"./scss": {
"import": "./src/scss/styles.scss",
"default": "./src/scss/styles.scss"
},
"./elements/RenderServerComponent": {
"import": "./src/elements/RenderServerComponent/index.tsx",
"types": "./src/elements/RenderServerComponent/index.tsx",
"default": "./src/elements/RenderServerComponent/index.tsx"
},
"./rsc": {
"import": "./src/exports/rsc/index.ts",
"types": "./src/exports/rsc/index.ts",
"default": "./src/exports/rsc/index.ts"
},
"./utilities/buildFormState": {
"import": "./src/utilities/buildFormState.ts",
"types": "./src/utilities/buildFormState.ts",
"default": "./src/utilities/buildFormState.ts"
},
"./utilities/buildTableState": {
"import": "./src/utilities/buildTableState.ts",
"types": "./src/utilities/buildTableState.ts",
"default": "./src/utilities/buildTableState.ts"
},
"./utilities/getClientConfig": {
"import": "./src/utilities/getClientConfig.ts",
"types": "./src/utilities/getClientConfig.ts",
"default": "./src/utilities/getClientConfig.ts"
},
"./utilities/buildFieldSchemaMap/traverseFields": {
"import": "./src/utilities/buildFieldSchemaMap/traverseFields.ts",
"types": "./src/utilities/buildFieldSchemaMap/traverseFields.ts",
"default": "./src/utilities/buildFieldSchemaMap/traverseFields.ts"
},
"./forms/fieldSchemasToFormState": {
"import": "./src/forms/fieldSchemasToFormState/index.tsx",
"types": "./src/forms/fieldSchemasToFormState/index.tsx",
"default": "./src/forms/fieldSchemasToFormState/index.tsx"
},
"./forms/renderField": {
"import": "./src/forms/fieldSchemasToFormState/renderField.tsx",
"types": "./src/forms/fieldSchemasToFormState/renderField.tsx",
"default": "./src/forms/fieldSchemasToFormState/renderField.tsx"
},
"./scss/app.scss": "./src/scss/app.scss",
"./assets": {
"import": "./src/assets/index.ts",
"types": "./src/assets/index.ts",
"default": "./src/assets/index.ts"
}
},
"main": "./src/exports/client/index.ts",
"types": "./src/exports/client/index.ts",
"files": [
"dist"
],
"scripts": {
"build": "pnpm build:reactcompiler",
"build:babel": "rm -rf dist_optimized && babel dist --out-dir dist_optimized --source-maps --extensions .ts,.js,.tsx,.jsx,.cjs,.mjs && rm -rf dist && mv dist_optimized dist",
"build:esbuild": "node bundle.js && rm -rf dist/exports/client && mv dist/exports/client_optimized dist/exports/client",
"build:reactcompiler": "rm -rf dist && rm -rf tsconfig.tsbuildinfo && pnpm build:swc && pnpm build:babel && pnpm copyfiles && pnpm build:esbuild && pnpm build:types",
"build:remove-artifact": "rm dist/prod/index.js",
"build:swc": "swc ./src -d dist --config-file .swcrc --strip-leading-paths",
"build:types": "tsc --emitDeclarationOnly --outDir dist",
"build:without_reactcompiler": "rm -rf dist && rm -rf tsconfig.tsbuildinfo && pnpm copyfiles && pnpm build:types && pnpm build:swc",
"clean": "rimraf {dist,*.tsbuildinfo}",
"copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"prepublishOnly": "pnpm clean && pnpm turbo build"
},
"dependencies": {
"@dnd-kit/core": "6.0.8",
"@dnd-kit/sortable": "7.0.2",
"@faceless-ui/modal": "3.0.0-beta.2",
"@faceless-ui/scroll-info": "2.0.0-beta.0",
"@faceless-ui/window-info": "3.0.0-beta.0",
"@monaco-editor/react": "4.6.0",
"@payloadcms/translations": "workspace:*",
"body-scroll-lock": "4.0.0-beta.0",
"bson-objectid": "2.0.4",
"date-fns": "4.1.0",
"dequal": "2.0.3",
"md5": "2.3.0",
"object-to-formdata": "4.5.1",
"qs-esm": "7.0.2",
"react-datepicker": "6.9.0",
"react-image-crop": "10.1.8",
"react-select": "5.8.0",
"scheduler": "0.0.0-experimental-3edc000d-20240926",
"sonner": "^1.5.0",
"ts-essentials": "10.0.3",
"use-context-selector": "2.0.0",
"uuid": "10.0.0"
},
"devDependencies": {
"@babel/cli": "^7.24.5",
"@babel/core": "^7.24.5",
"@babel/preset-env": "^7.24.5",
"@babel/preset-react": "^7.24.1",
"@babel/preset-typescript": "^7.24.1",
"@hyrious/esbuild-plugin-commonjs": "^0.2.4",
"@payloadcms/eslint-config": "workspace:*",
"@types/body-scroll-lock": "^3.1.0",
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-datepicker": "6.2.0",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
"@types/uuid": "10.0.0",
"babel-plugin-react-compiler": "0.0.0-experimental-24ec0eb-20240918",
"esbuild": "0.23.1",
"esbuild-sass-plugin": "3.3.1",
"eslint-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110",
"payload": "workspace:*"
},
"peerDependencies": {
"next": "^15.0.0",
"payload": "workspace:*",
"react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020",
"react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020"
},
"engines": {
"node": "^18.20.2 || >=20.9.0"
},
"publishConfig": {
"exports": {
".": {
"import": "./dist/exports/client/index.js",
"types": "./dist/exports/client/index.d.ts",
"default": "./dist/exports/client/index.js"
},
"./shared": {
"import": "./dist/exports/shared/index.js",
"types": "./dist/exports/shared/index.d.ts",
"default": "./dist/exports/shared/index.js"
},
"./css": {
"import": "./dist/styles.css",
"default": "./dist/styles.css"
},
"./scss": {
"import": "./dist/scss/styles.scss",
"default": "./dist/scss/styles.scss"
},
"./rsc": {
"import": "./dist/exports/rsc/index.js",
"types": "./dist/exports/rsc/index.d.ts",
"default": "./dist/exports/rsc/index.js"
},
"./scss/app.scss": "./dist/scss/app.scss",
"./styles.css": "./dist/styles.css",
"./assets": {
"import": "./dist/assets/index.js",
"types": "./dist/assets/index.d.ts",
"default": "./dist/assets/index.js"
},
"./elements/RenderServerComponent": {
"import": "./dist/elements/RenderServerComponent/index.js",
"types": "./dist/elements/RenderServerComponent/index.d.ts",
"default": "./dist/elements/RenderServerComponent/index.js"
},
"./elements/*": {
"import": "./dist/elements/*/index.js",
"types": "./dist/elements/*/index.d.ts",
"default": "./dist/elements/*/index.js"
},
"./fields/*": {
"import": "./dist/fields/*/index.js",
"types": "./dist/fields/*/index.d.ts",
"default": "./dist/fields/*/index.js"
},
"./forms/fieldSchemasToFormState": {
"import": "./dist/forms/fieldSchemasToFormState/index.js",
"types": "./dist/forms/fieldSchemasToFormState/index.d.ts",
"default": "./dist/forms/fieldSchemasToFormState/index.js"
},
"./forms/renderField": {
"import": "./dist/forms/fieldSchemasToFormState/renderField.js",
"types": "./dist/forms/fieldSchemasToFormState/renderField.d.ts",
"default": "./dist/forms/fieldSchemasToFormState/renderField.js"
},
"./forms/*": {
"import": "./dist/forms/*/index.js",
"types": "./dist/forms/*/index.d.ts",
"default": "./dist/forms/*/index.js"
},
"./graphics/*": {
"import": "./dist/graphics/*/index.js",
"types": "./dist/graphics/*/index.d.ts",
"default": "./dist/graphics/*/index.js"
},
"./hooks/*": {
"import": "./dist/hooks/*.js",
"types": "./dist/hooks/*.d.ts",
"default": "./dist/hooks/*.js"
},
"./icons/*": {
"import": "./dist/icons/*/index.js",
"types": "./dist/icons/*/index.d.ts",
"default": "./dist/icons/*/index.js"
},
"./providers/*": {
"import": "./dist/providers/*/index.js",
"types": "./dist/providers/*/index.d.ts",
"default": "./dist/providers/*/index.js"
},
"./utilities/*": {
"import": "./dist/utilities/*.js",
"types": "./dist/utilities/*.d.ts",
"default": "./dist/utilities/*.js"
}
},
"main": "./dist/exports/client/index.js",
"types": "./dist/exports/client/index.d.ts"
},
"overrides": {
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
}
}