From 59ece446a28da6abfda5a646039fb8f321a3af9a Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Sun, 28 Apr 2024 10:27:34 +0800 Subject: [PATCH] fix @node-rs/jieba and window not found (#1313) * dynamic import * perf: entry * fix: jieba package --- packages/web/common/system/utils.ts | 4 +- packages/web/hooks/useBeforeunload.ts | 4 +- packages/web/package.json | 2 +- pnpm-lock.yaml | 409 +++++++++++++++++- projects/app/next.config.js | 13 +- projects/app/package.json | 5 +- .../components/ChatBox/components/Empty.tsx | 4 +- projects/app/src/components/Layout/index.tsx | 14 +- .../support/user/inform/ImportantInform.tsx | 2 +- .../support/user/inform/SystemMsgModal.tsx | 3 +- projects/app/src/pages/_app.tsx | 108 +---- .../app/src/pages/chat/components/Empty.tsx | 6 +- projects/app/src/pages/login/index.tsx | 2 +- projects/app/src/web/context/ChakraUI.tsx | 22 + projects/app/src/web/context/QueryClient.tsx | 20 + projects/app/src/web/context/useInitApp.ts | 81 ++++ 16 files changed, 560 insertions(+), 139 deletions(-) create mode 100644 projects/app/src/web/context/ChakraUI.tsx create mode 100644 projects/app/src/web/context/QueryClient.tsx create mode 100644 projects/app/src/web/context/useInitApp.ts diff --git a/packages/web/common/system/utils.ts b/packages/web/common/system/utils.ts index a9fef1861..be42ee812 100644 --- a/packages/web/common/system/utils.ts +++ b/packages/web/common/system/utils.ts @@ -1,9 +1,7 @@ import FingerprintJS from '@fingerprintjs/fingerprintjs'; -const fpPromise = FingerprintJS.load(); - export const getUserFingerprint = async () => { - const fp = await fpPromise; + const fp = await FingerprintJS.load(); const result = await fp.get(); console.log(result.visitorId); }; diff --git a/packages/web/hooks/useBeforeunload.ts b/packages/web/hooks/useBeforeunload.ts index 4a1df6a00..7edea603b 100644 --- a/packages/web/hooks/useBeforeunload.ts +++ b/packages/web/hooks/useBeforeunload.ts @@ -2,9 +2,9 @@ import { useTranslation } from 'next-i18next'; import { useEffect } from 'react'; export const useBeforeunload = (props?: { callback?: () => any; tip?: string }) => { - const { t } = useTranslation('common'); + const { t } = useTranslation(); - const { tip = t('Confirm to leave the page'), callback } = props || {}; + const { tip = t('common.Confirm to leave the page'), callback } = props || {}; useEffect(() => { const listen = diff --git a/packages/web/package.json b/packages/web/package.json index 3623002c8..a3d654b12 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -11,7 +11,7 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@fastgpt/global": "workspace:*", - "@fingerprintjs/fingerprintjs": "^4.2.1", + "@fingerprintjs/fingerprintjs": "^4.3.0", "@lexical/react": "0.12.6", "@lexical/selection": "^0.14.5", "@lexical/text": "0.12.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b41d73bc..9ce95b255 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -239,8 +239,8 @@ importers: specifier: workspace:* version: link:../global '@fingerprintjs/fingerprintjs': - specifier: ^4.2.1 - version: 4.2.1 + specifier: ^4.3.0 + version: 4.3.0 '@lexical/react': specifier: 0.12.6 version: 0.12.6(lexical@0.12.6)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.14) @@ -356,12 +356,18 @@ importers: '@fortaine/fetch-event-source': specifier: ^3.0.6 version: 3.0.6 + '@node-rs/jieba': + specifier: 1.10.0 + version: 1.10.0 '@tanstack/react-query': specifier: ^4.24.10 version: 4.24.10(react-dom@18.2.0)(react@18.2.0) '@types/nprogress': specifier: ^0.2.0 version: 0.2.0 + ahooks: + specifier: ^3.7.11 + version: 3.7.11(react@18.2.0) axios: specifier: ^1.5.1 version: 1.5.1 @@ -413,6 +419,9 @@ importers: next-i18next: specifier: 15.2.0 version: 15.2.0(i18next@23.10.0)(next@13.5.2)(react-i18next@13.5.0)(react@18.2.0) + nextjs-node-loader: + specifier: ^1.1.5 + version: 1.1.5(webpack@5.91.0) nprogress: specifier: ^0.2.0 version: 0.2.0 @@ -3366,8 +3375,8 @@ packages: - supports-color dev: true - /@fingerprintjs/fingerprintjs@4.2.1: - resolution: {integrity: sha512-uW+GVUNTgCXbVPEbgnbf5Aor22e1dyYR0JRwdUiZBaikfxr7KlhV9y0aahA1FB99fEeQVvhCEvTcPIFSYTy9Pw==} + /@fingerprintjs/fingerprintjs@4.3.0: + resolution: {integrity: sha512-eZYh6XVvMp5iyoT9y+/llGxqoACr01JeBTfy6NAMaQ6K2a3nZmyPKoYv5V89QNN8jUqzgXeTOICClEUtktLdtw==} dependencies: tslib: 2.6.2 dev: false @@ -3413,6 +3422,13 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -4537,6 +4553,24 @@ packages: '@types/node': 20.8.5 dev: true + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + dev: false + + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + dev: false + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: @@ -4589,6 +4623,10 @@ packages: resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} dev: true + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true @@ -4826,11 +4864,125 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: false + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: false + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: false + + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + dev: false + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: false + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: false + + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + dev: false + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: false + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: false + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: false + + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + dev: false + + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: false + + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + dev: false + + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: false + + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + dev: false + /@xmldom/xmldom@0.8.10: resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} dev: false + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: false + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: false + /@zag-js/dom-query@0.16.0: resolution: {integrity: sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==} dev: false @@ -4865,6 +5017,14 @@ packages: negotiator: 0.6.3 dev: false + /acorn-import-assertions@1.9.0(acorn@8.11.3): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.3 + dev: false + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -4877,7 +5037,6 @@ packages: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -4904,6 +5063,24 @@ packages: indent-string: 4.0.0 dev: true + /ahooks@3.7.11(react@18.2.0): + resolution: {integrity: sha512-BfSq7HJ9wk/7a2vX7WbLdwzHyQHmbNe21ipX1PfIzssXIzQfAl79WVJ9GjZaqNl4PFPsJusj/Xjg2OF+gIgGaQ==} + engines: {node: '>=8.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.24.1 + dayjs: 1.11.7 + intersection-observer: 0.12.2 + js-cookie: 2.2.1 + lodash: 4.17.21 + react: 18.2.0 + react-fast-compare: 3.2.2 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.6.2 + dev: false + /ajv-draft-04@1.0.0(ajv@8.12.0): resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -4915,6 +5092,14 @@ packages: ajv: 8.12.0 dev: false + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: false + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -4922,7 +5107,6 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -5250,6 +5434,10 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: false + /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -5600,6 +5788,11 @@ packages: dev: false optional: true + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: false + /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: @@ -6660,6 +6853,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: false + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -6683,7 +6881,6 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -6780,6 +6977,10 @@ packages: safe-array-concat: 1.1.2 dev: true + /es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + dev: false + /es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -7256,6 +7457,14 @@ packages: string.prototype.matchall: 4.0.11 dev: true + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: false + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7359,12 +7568,15 @@ packages: engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 - dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: false /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -7384,7 +7596,6 @@ packages: /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: true /evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} @@ -7466,7 +7677,6 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -7850,7 +8060,6 @@ packages: /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -8145,6 +8354,10 @@ packages: engines: {node: '>=12'} dev: false + /intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: false + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: @@ -8445,10 +8658,23 @@ packages: set-function-name: 2.0.2 dev: true + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.8.5 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: false + /joplin-turndown-plugin-gfm@1.0.12: resolution: {integrity: sha512-qL4+1iycQjZ1fs8zk3jSRk7cg3ROBUHk7GKtiLAQLFzLPKErnILUvz5DLszSQvz3s1sTjPbywLDISVUtBY6HaA==} dev: false + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: false + /js-sdsl@4.4.2: resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} dev: true @@ -8504,7 +8730,6 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -8709,6 +8934,20 @@ packages: wrap-ansi: 7.0.0 dev: true + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: false + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + dev: false + /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -9055,7 +9294,6 @@ packages: /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -9578,6 +9816,10 @@ packages: engines: {node: '>= 0.6'} dev: false + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: false + /next-i18next@15.2.0(i18next@23.10.0)(next@13.5.2)(react-i18next@13.5.0)(react@18.2.0): resolution: {integrity: sha512-Rl5yZ4oGffsB0AjRykZ5PzNQ2M6am54MaMayldGmH/UKZisrIxk2SKEPJvaHhKlWe1qgdNi2FkodwK8sEjfEmg==} engines: {node: '>=14'} @@ -9646,6 +9888,16 @@ packages: next: 13.5.2(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) dev: false + /nextjs-node-loader@1.1.5(webpack@5.91.0): + resolution: {integrity: sha512-tS2wWPh8QsQHBVNG8w7xzL3ua+OFnmFvcOFxrAQsfK4T017nOiCUrybVWVieilEn1z8CqODcRw1z70mFRPQi1Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^5.76.0 + dependencies: + loader-utils: 2.0.4 + webpack: 5.91.0 + dev: false + /node-cron@3.0.3: resolution: {integrity: sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==} engines: {node: '>=6.0.0'} @@ -10333,7 +10585,6 @@ packages: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - dev: true /randomfill@1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} @@ -10786,6 +11037,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -10928,6 +11183,20 @@ packages: dependencies: loose-envify: 1.4.0 + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: false + + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: false + /seek-bzip@1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} hasBin: true @@ -10967,6 +11236,12 @@ packages: - supports-color dev: false + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: false + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -11110,6 +11385,13 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -11118,7 +11400,6 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} @@ -11349,6 +11630,13 @@ packages: has-flag: 4.0.0 dev: true + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: false + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -11374,7 +11662,6 @@ packages: /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - dev: true /tar-stream@1.6.2: resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} @@ -11402,6 +11689,41 @@ packages: dev: false optional: true + /terser-webpack-plugin@5.3.10(webpack@5.91.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.30.4 + webpack: 5.91.0 + dev: false + + /terser@5.30.4: + resolution: {integrity: sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: false + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -12039,6 +12361,14 @@ packages: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + /web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false @@ -12066,6 +12396,51 @@ packages: engines: {node: '>=12'} dev: false + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: false + + /webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.5.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.91.0) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: false + /whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} diff --git a/projects/app/next.config.js b/projects/app/next.config.js index d94f87400..6a0b0dcfb 100644 --- a/projects/app/next.config.js +++ b/projects/app/next.config.js @@ -7,7 +7,7 @@ const nextConfig = { output: 'standalone', reactStrictMode: process.env.NODE_ENV === 'development' ? false : true, compress: true, - webpack(config, { isServer }) { + webpack(config, { isServer, nextRuntime }) { Object.assign(config.resolve.alias, { '@mongodb-js/zstd': false, '@aws-sdk/credential-providers': false, @@ -26,6 +26,10 @@ const nextConfig = { test: /\.svg$/i, issuer: /\.[jt]sx?$/, use: ['@svgr/webpack'] + }, + { + test: /\.node$/, + use: [{ loader: 'nextjs-node-loader' }] } ]), exprContextCritical: false, @@ -33,11 +37,9 @@ const nextConfig = { }; if (isServer) { - config.externals.push('isolated-vm'); config.externals.push('worker_threads'); - config.externals.push('@node-rs/jieba'); - if (config.name === 'server') { + if (nextRuntime === 'nodejs') { // config.output.globalObject = 'self'; const oldEntry = config.entry; @@ -76,7 +78,10 @@ const nextConfig = { }, transpilePackages: ['@fastgpt/*'], experimental: { + // 外部包独立打包 serverComponentsExternalPackages: ['mongoose', 'pg'], + // 指定导出包优化,按需引入包模块 + optimizePackageImports: ['mongoose', 'pg'], outputFileTracingRoot: path.join(__dirname, '../../') } }; diff --git a/projects/app/package.json b/projects/app/package.json index 093cf16f3..f893f60dc 100644 --- a/projects/app/package.json +++ b/projects/app/package.json @@ -25,6 +25,7 @@ "@fortaine/fetch-event-source": "^3.0.6", "@tanstack/react-query": "^4.24.10", "@types/nprogress": "^0.2.0", + "ahooks": "^3.7.11", "axios": "^1.5.1", "date-fns": "2.30.0", "dayjs": "^1.11.7", @@ -57,7 +58,9 @@ "remark-math": "^5.1.1", "request-ip": "^3.3.0", "sass": "^1.58.3", - "zustand": "^4.3.5" + "zustand": "^4.3.5", + "nextjs-node-loader": "^1.1.5", + "@node-rs/jieba": "1.10.0" }, "devDependencies": { "@svgr/webpack": "^6.5.1", diff --git a/projects/app/src/components/ChatBox/components/Empty.tsx b/projects/app/src/components/ChatBox/components/Empty.tsx index 31b69d9f9..af3f91066 100644 --- a/projects/app/src/components/ChatBox/components/Empty.tsx +++ b/projects/app/src/components/ChatBox/components/Empty.tsx @@ -1,8 +1,10 @@ -import Markdown from '@/components/Markdown'; import { useMarkdown } from '@/web/common/hooks/useMarkdown'; import { Box, Card } from '@chakra-ui/react'; import React from 'react'; +import dynamic from 'next/dynamic'; +const Markdown = dynamic(() => import('@/components/Markdown'), { ssr: false }); + const Empty = () => { const { data: chatProblem } = useMarkdown({ url: '/chatProblem.md' }); const { data: versionIntro } = useMarkdown({ url: '/versionIntro.md' }); diff --git a/projects/app/src/components/Layout/index.tsx b/projects/app/src/components/Layout/index.tsx index 2e578faaf..75b81a438 100644 --- a/projects/app/src/components/Layout/index.tsx +++ b/projects/app/src/components/Layout/index.tsx @@ -10,6 +10,7 @@ import { getUnreadCount } from '@/web/support/user/inform/api'; import dynamic from 'next/dynamic'; import Auth from './auth'; + const Navbar = dynamic(() => import('./navbar')); const NavbarPhone = dynamic(() => import('./navbarPhone')); const UpdateInviteModal = dynamic(() => import('@/components/support/user/team/UpdateInviteModal')); @@ -112,14 +113,13 @@ const Layout = ({ children }: { children: JSX.Element }) => { )} - - {!!userInfo && } - {isNotSufficientModal && !isHideNavbar && } - {!!userInfo && } - {!!userInfo && importantInforms.length > 0 && ( - - )} + {!!userInfo && } + {isNotSufficientModal && !isHideNavbar && } + {!!userInfo && } + {!!userInfo && importantInforms.length > 0 && ( + + )} ); diff --git a/projects/app/src/components/support/user/inform/ImportantInform.tsx b/projects/app/src/components/support/user/inform/ImportantInform.tsx index a3dfb67d8..67cfb7ecd 100644 --- a/projects/app/src/components/support/user/inform/ImportantInform.tsx +++ b/projects/app/src/components/support/user/inform/ImportantInform.tsx @@ -60,4 +60,4 @@ const ImportantInform = ({ ); }; -export default ImportantInform; +export default React.memo(ImportantInform); diff --git a/projects/app/src/components/support/user/inform/SystemMsgModal.tsx b/projects/app/src/components/support/user/inform/SystemMsgModal.tsx index 79223988d..6d6cad371 100644 --- a/projects/app/src/components/support/user/inform/SystemMsgModal.tsx +++ b/projects/app/src/components/support/user/inform/SystemMsgModal.tsx @@ -6,7 +6,8 @@ import { Button, ModalBody, ModalFooter, useDisclosure } from '@chakra-ui/react' import { useTranslation } from 'next-i18next'; import { LOGO_ICON } from '@fastgpt/global/common/system/constants'; import { getSystemMsgModalData } from '@/web/support/user/inform/api'; -import Markdown from '@/components/Markdown'; +import dynamic from 'next/dynamic'; +const Markdown = dynamic(() => import('@/components/Markdown'), { ssr: false }); const SystemMsgModal = ({}: {}) => { const { t } = useTranslation(); diff --git a/projects/app/src/pages/_app.tsx b/projects/app/src/pages/_app.tsx index f57094cb5..a198bb132 100644 --- a/projects/app/src/pages/_app.tsx +++ b/projects/app/src/pages/_app.tsx @@ -1,103 +1,17 @@ -import { useEffect, useState } from 'react'; import type { AppProps } from 'next/app'; import Script from 'next/script'; import Head from 'next/head'; -import { ChakraProvider, ColorModeScript } from '@chakra-ui/react'; import Layout from '@/components/Layout'; -import { theme } from '@fastgpt/web/styles/theme'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import NProgress from 'nprogress'; //nprogress module -import Router from 'next/router'; -import { clientInitData } from '@/web/common/system/staticData'; -import { appWithTranslation, useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; -import type { FastGPTFeConfigsType } from '@fastgpt/global/common/system/types/index.d'; -import { change2DefaultLng, setLngStore } from '@/web/common/utils/i18n'; +import { appWithTranslation } from 'next-i18next'; + +import QueryClientContext from '@/web/context/QueryClient'; +import ChakraUIContext from '@/web/context/ChakraUI'; +import { useInitApp } from '@/web/context/useInitApp'; -import 'nprogress/nprogress.css'; import '@/web/styles/reset.scss'; -//Binding events. -Router.events.on('routeChangeStart', () => NProgress.start()); -Router.events.on('routeChangeComplete', () => NProgress.done()); -Router.events.on('routeChangeError', () => NProgress.done()); - -// Create a client -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - keepPreviousData: true, - refetchOnWindowFocus: false, - retry: false, - cacheTime: 10 - } - } -}); - function App({ Component, pageProps }: AppProps) { - const router = useRouter(); - const { hiId } = router.query as { hiId?: string }; - const { i18n } = useTranslation(); - const { loadGitStar, setInitd, feConfigs } = useSystemStore(); - const [scripts, setScripts] = useState([]); - const [title, setTitle] = useState(process.env.SYSTEM_NAME || 'AI'); - - useEffect(() => { - // get init data - (async () => { - const { - feConfigs: { scripts, isPlus, show_git, systemTitle } - } = await clientInitData(); - - setTitle(systemTitle || 'FastGPT'); - - // log fastgpt - if (!isPlus) { - console.log( - '%cWelcome to FastGPT', - 'font-family:Arial; color:#3370ff ; font-size:18px; font-weight:bold;', - `GitHub:https://github.com/labring/FastGPT` - ); - } - if (show_git) { - loadGitStar(); - } - - setScripts(scripts || []); - setInitd(); - })(); - - // add window error track - window.onerror = function (msg, url) { - window.umami?.track('windowError', { - device: { - userAgent: navigator.userAgent, - platform: navigator.platform, - appName: navigator.appName - }, - msg, - url - }); - }; - - return () => { - window.onerror = null; - }; - }, []); - - useEffect(() => { - // get default language - const targetLng = change2DefaultLng(i18n.language); - if (targetLng) { - setLngStore(targetLng); - router.replace(router.asPath, undefined, { locale: targetLng }); - } - }, []); - - useEffect(() => { - hiId && localStorage.setItem('inviterId', hiId); - }, [hiId]); + const { feConfigs, scripts, title } = useInitApp(); return ( <> @@ -115,17 +29,15 @@ function App({ Component, pageProps }: AppProps) { {scripts?.map((item, i) => )} - - - + + - - + + ); } -// @ts-ignore export default appWithTranslation(App); diff --git a/projects/app/src/pages/chat/components/Empty.tsx b/projects/app/src/pages/chat/components/Empty.tsx index 6f547125f..b0e67b2fc 100644 --- a/projects/app/src/pages/chat/components/Empty.tsx +++ b/projects/app/src/pages/chat/components/Empty.tsx @@ -1,8 +1,10 @@ import React from 'react'; import { Card, Box, Flex } from '@chakra-ui/react'; import { useMarkdown } from '@/web/common/hooks/useMarkdown'; -import Markdown from '@/components/Markdown'; -import Avatar from '@/components/Avatar'; + +import dynamic from 'next/dynamic'; +const Markdown = dynamic(() => import('@/components/Markdown')); +const Avatar = dynamic(() => import('@/components/Avatar')); const Empty = ({ showChatProblem, diff --git a/projects/app/src/pages/login/index.tsx b/projects/app/src/pages/login/index.tsx index eba704fc8..bc76c1f0a 100644 --- a/projects/app/src/pages/login/index.tsx +++ b/projects/app/src/pages/login/index.tsx @@ -10,13 +10,13 @@ import LoginForm from './components/LoginForm/LoginForm'; import dynamic from 'next/dynamic'; import { serviceSideProps } from '@/web/common/utils/i18n'; import { clearToken, setToken } from '@/web/support/user/auth'; -import CommunityModal from '@/components/CommunityModal'; import Script from 'next/script'; import Loading from '@fastgpt/web/components/common/MyLoading'; const RegisterForm = dynamic(() => import('./components/RegisterForm')); const ForgetPasswordForm = dynamic(() => import('./components/ForgetPasswordForm')); const WechatForm = dynamic(() => import('./components/LoginForm/WechatForm')); +const CommunityModal = dynamic(() => import('@/components/CommunityModal')); const Login = () => { const router = useRouter(); diff --git a/projects/app/src/web/context/ChakraUI.tsx b/projects/app/src/web/context/ChakraUI.tsx new file mode 100644 index 000000000..fbe921ad7 --- /dev/null +++ b/projects/app/src/web/context/ChakraUI.tsx @@ -0,0 +1,22 @@ +import { ChakraProvider, ColorModeScript } from '@chakra-ui/react'; +import { theme } from '@fastgpt/web/styles/theme'; +import { Router } from 'next/router'; +import { ReactNode } from 'react'; +import NProgress from 'nprogress'; //nprogress module + +import 'nprogress/nprogress.css'; + +Router.events.on('routeChangeStart', () => NProgress.start()); +Router.events.on('routeChangeComplete', () => NProgress.done()); +Router.events.on('routeChangeError', () => NProgress.done()); + +export const ChakraUIContext = ({ children }: { children: ReactNode }) => { + return ( + + + {children} + + ); +}; + +export default ChakraUIContext; diff --git a/projects/app/src/web/context/QueryClient.tsx b/projects/app/src/web/context/QueryClient.tsx new file mode 100644 index 000000000..3e0e5299f --- /dev/null +++ b/projects/app/src/web/context/QueryClient.tsx @@ -0,0 +1,20 @@ +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactNode } from 'react'; + +// Create a client +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + keepPreviousData: true, + refetchOnWindowFocus: false, + retry: false, + cacheTime: 10 + } + } +}); + +const QueryClientContext = ({ children }: { children: ReactNode }) => { + return {children}; +}; + +export default QueryClientContext; diff --git a/projects/app/src/web/context/useInitApp.ts b/projects/app/src/web/context/useInitApp.ts new file mode 100644 index 000000000..20d7ffbd0 --- /dev/null +++ b/projects/app/src/web/context/useInitApp.ts @@ -0,0 +1,81 @@ +import { useCallback, useEffect, useState } from 'react'; +import { clientInitData } from '@/web/common/system/staticData'; +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; +import { useSystemStore } from '@/web/common/system/useSystemStore'; +import type { FastGPTFeConfigsType } from '@fastgpt/global/common/system/types/index.d'; +import { change2DefaultLng, setLngStore } from '@/web/common/utils/i18n'; + +export const useInitApp = () => { + const router = useRouter(); + const { hiId } = router.query as { hiId?: string }; + const { i18n } = useTranslation(); + const { loadGitStar, setInitd, feConfigs } = useSystemStore(); + const [scripts, setScripts] = useState([]); + const [title, setTitle] = useState(process.env.SYSTEM_NAME || 'AI'); + + const initFetch = useCallback(async () => { + const { + feConfigs: { scripts, isPlus, show_git, systemTitle } + } = await clientInitData(); + + setTitle(systemTitle || 'FastGPT'); + + // log fastgpt + if (!isPlus) { + console.log( + '%cWelcome to FastGPT', + 'font-family:Arial; color:#3370ff ; font-size:18px; font-weight:bold;', + `GitHub:https://github.com/labring/FastGPT` + ); + } + if (show_git) { + loadGitStar(); + } + + setScripts(scripts || []); + setInitd(); + }, [loadGitStar, setInitd]); + + const initUserLanguage = useCallback(() => { + // get default language + const targetLng = change2DefaultLng(i18n.language); + if (targetLng) { + setLngStore(targetLng); + router.replace(router.asPath, undefined, { locale: targetLng }); + } + }, []); + + useEffect(() => { + initFetch(); + initUserLanguage(); + + const errorTrack = (event: ErrorEvent) => { + window.umami?.track('windowError', { + device: { + userAgent: navigator.userAgent, + platform: navigator.platform, + appName: navigator.appName + }, + error: event, + url: location.href + }); + }; + // add window error track + window.addEventListener('error', errorTrack); + + return () => { + window.removeEventListener('error', errorTrack); + }; + }, []); + + useEffect(() => { + hiId && localStorage.setItem('inviterId', hiId); + }, [hiId]); + + return { + feConfigs, + scripts, + title + }; +};