Commit 59ece446 by Archer Committed by GitHub

fix @node-rs/jieba and window not found (#1313)

* dynamic import

* perf: entry

* fix: jieba package
parent d407e87d
import FingerprintJS from '@fingerprintjs/fingerprintjs'; import FingerprintJS from '@fingerprintjs/fingerprintjs';
const fpPromise = FingerprintJS.load();
export const getUserFingerprint = async () => { export const getUserFingerprint = async () => {
const fp = await fpPromise; const fp = await FingerprintJS.load();
const result = await fp.get(); const result = await fp.get();
console.log(result.visitorId); console.log(result.visitorId);
}; };
......
...@@ -2,9 +2,9 @@ import { useTranslation } from 'next-i18next'; ...@@ -2,9 +2,9 @@ import { useTranslation } from 'next-i18next';
import { useEffect } from 'react'; import { useEffect } from 'react';
export const useBeforeunload = (props?: { callback?: () => any; tip?: string }) => { 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(() => { useEffect(() => {
const listen = const listen =
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
"@emotion/react": "^11.11.1", "@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0", "@emotion/styled": "^11.11.0",
"@fastgpt/global": "workspace:*", "@fastgpt/global": "workspace:*",
"@fingerprintjs/fingerprintjs": "^4.2.1", "@fingerprintjs/fingerprintjs": "^4.3.0",
"@lexical/react": "0.12.6", "@lexical/react": "0.12.6",
"@lexical/selection": "^0.14.5", "@lexical/selection": "^0.14.5",
"@lexical/text": "0.12.6", "@lexical/text": "0.12.6",
......
...@@ -7,7 +7,7 @@ const nextConfig = { ...@@ -7,7 +7,7 @@ const nextConfig = {
output: 'standalone', output: 'standalone',
reactStrictMode: process.env.NODE_ENV === 'development' ? false : true, reactStrictMode: process.env.NODE_ENV === 'development' ? false : true,
compress: true, compress: true,
webpack(config, { isServer }) { webpack(config, { isServer, nextRuntime }) {
Object.assign(config.resolve.alias, { Object.assign(config.resolve.alias, {
'@mongodb-js/zstd': false, '@mongodb-js/zstd': false,
'@aws-sdk/credential-providers': false, '@aws-sdk/credential-providers': false,
...@@ -26,6 +26,10 @@ const nextConfig = { ...@@ -26,6 +26,10 @@ const nextConfig = {
test: /\.svg$/i, test: /\.svg$/i,
issuer: /\.[jt]sx?$/, issuer: /\.[jt]sx?$/,
use: ['@svgr/webpack'] use: ['@svgr/webpack']
},
{
test: /\.node$/,
use: [{ loader: 'nextjs-node-loader' }]
} }
]), ]),
exprContextCritical: false, exprContextCritical: false,
...@@ -33,11 +37,9 @@ const nextConfig = { ...@@ -33,11 +37,9 @@ const nextConfig = {
}; };
if (isServer) { if (isServer) {
config.externals.push('isolated-vm');
config.externals.push('worker_threads'); config.externals.push('worker_threads');
config.externals.push('@node-rs/jieba');
if (config.name === 'server') { if (nextRuntime === 'nodejs') {
// config.output.globalObject = 'self'; // config.output.globalObject = 'self';
const oldEntry = config.entry; const oldEntry = config.entry;
...@@ -76,7 +78,10 @@ const nextConfig = { ...@@ -76,7 +78,10 @@ const nextConfig = {
}, },
transpilePackages: ['@fastgpt/*'], transpilePackages: ['@fastgpt/*'],
experimental: { experimental: {
// 外部包独立打包
serverComponentsExternalPackages: ['mongoose', 'pg'], serverComponentsExternalPackages: ['mongoose', 'pg'],
// 指定导出包优化,按需引入包模块
optimizePackageImports: ['mongoose', 'pg'],
outputFileTracingRoot: path.join(__dirname, '../../') outputFileTracingRoot: path.join(__dirname, '../../')
} }
}; };
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
"@fortaine/fetch-event-source": "^3.0.6", "@fortaine/fetch-event-source": "^3.0.6",
"@tanstack/react-query": "^4.24.10", "@tanstack/react-query": "^4.24.10",
"@types/nprogress": "^0.2.0", "@types/nprogress": "^0.2.0",
"ahooks": "^3.7.11",
"axios": "^1.5.1", "axios": "^1.5.1",
"date-fns": "2.30.0", "date-fns": "2.30.0",
"dayjs": "^1.11.7", "dayjs": "^1.11.7",
...@@ -57,7 +58,9 @@ ...@@ -57,7 +58,9 @@
"remark-math": "^5.1.1", "remark-math": "^5.1.1",
"request-ip": "^3.3.0", "request-ip": "^3.3.0",
"sass": "^1.58.3", "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": { "devDependencies": {
"@svgr/webpack": "^6.5.1", "@svgr/webpack": "^6.5.1",
......
import Markdown from '@/components/Markdown';
import { useMarkdown } from '@/web/common/hooks/useMarkdown'; import { useMarkdown } from '@/web/common/hooks/useMarkdown';
import { Box, Card } from '@chakra-ui/react'; import { Box, Card } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import dynamic from 'next/dynamic';
const Markdown = dynamic(() => import('@/components/Markdown'), { ssr: false });
const Empty = () => { const Empty = () => {
const { data: chatProblem } = useMarkdown({ url: '/chatProblem.md' }); const { data: chatProblem } = useMarkdown({ url: '/chatProblem.md' });
const { data: versionIntro } = useMarkdown({ url: '/versionIntro.md' }); const { data: versionIntro } = useMarkdown({ url: '/versionIntro.md' });
......
...@@ -10,6 +10,7 @@ import { getUnreadCount } from '@/web/support/user/inform/api'; ...@@ -10,6 +10,7 @@ import { getUnreadCount } from '@/web/support/user/inform/api';
import dynamic from 'next/dynamic'; import dynamic from 'next/dynamic';
import Auth from './auth'; import Auth from './auth';
const Navbar = dynamic(() => import('./navbar')); const Navbar = dynamic(() => import('./navbar'));
const NavbarPhone = dynamic(() => import('./navbarPhone')); const NavbarPhone = dynamic(() => import('./navbarPhone'));
const UpdateInviteModal = dynamic(() => import('@/components/support/user/team/UpdateInviteModal')); const UpdateInviteModal = dynamic(() => import('@/components/support/user/team/UpdateInviteModal'));
...@@ -112,14 +113,13 @@ const Layout = ({ children }: { children: JSX.Element }) => { ...@@ -112,14 +113,13 @@ const Layout = ({ children }: { children: JSX.Element }) => {
</Box> </Box>
</> </>
)} )}
{!!userInfo && <UpdateInviteModal />}
{isNotSufficientModal && !isHideNavbar && <NotSufficientModal />}
{!!userInfo && <SystemMsgModal />}
{!!userInfo && importantInforms.length > 0 && (
<ImportantInform informs={importantInforms} refetch={refetchUnRead} />
)}
</Box> </Box>
{!!userInfo && <UpdateInviteModal />}
{isNotSufficientModal && !isHideNavbar && <NotSufficientModal />}
{!!userInfo && <SystemMsgModal />}
{!!userInfo && importantInforms.length > 0 && (
<ImportantInform informs={importantInforms} refetch={refetchUnRead} />
)}
<Loading loading={loading} zIndex={999999} /> <Loading loading={loading} zIndex={999999} />
</> </>
); );
......
...@@ -60,4 +60,4 @@ const ImportantInform = ({ ...@@ -60,4 +60,4 @@ const ImportantInform = ({
); );
}; };
export default ImportantInform; export default React.memo(ImportantInform);
...@@ -6,7 +6,8 @@ import { Button, ModalBody, ModalFooter, useDisclosure } from '@chakra-ui/react' ...@@ -6,7 +6,8 @@ import { Button, ModalBody, ModalFooter, useDisclosure } from '@chakra-ui/react'
import { useTranslation } from 'next-i18next'; import { useTranslation } from 'next-i18next';
import { LOGO_ICON } from '@fastgpt/global/common/system/constants'; import { LOGO_ICON } from '@fastgpt/global/common/system/constants';
import { getSystemMsgModalData } from '@/web/support/user/inform/api'; 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 SystemMsgModal = ({}: {}) => {
const { t } = useTranslation(); const { t } = useTranslation();
......
import { useEffect, useState } from 'react';
import type { AppProps } from 'next/app'; import type { AppProps } from 'next/app';
import Script from 'next/script'; import Script from 'next/script';
import Head from 'next/head'; import Head from 'next/head';
import { ChakraProvider, ColorModeScript } from '@chakra-ui/react';
import Layout from '@/components/Layout'; import Layout from '@/components/Layout';
import { theme } from '@fastgpt/web/styles/theme'; import { appWithTranslation } from 'next-i18next';
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 'nprogress/nprogress.css'; import QueryClientContext from '@/web/context/QueryClient';
import '@/web/styles/reset.scss'; import ChakraUIContext from '@/web/context/ChakraUI';
import { useInitApp } from '@/web/context/useInitApp';
//Binding events.
Router.events.on('routeChangeStart', () => NProgress.start());
Router.events.on('routeChangeComplete', () => NProgress.done());
Router.events.on('routeChangeError', () => NProgress.done());
// Create a client import '@/web/styles/reset.scss';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
keepPreviousData: true,
refetchOnWindowFocus: false,
retry: false,
cacheTime: 10
}
}
});
function App({ Component, pageProps }: AppProps) { function App({ Component, pageProps }: AppProps) {
const router = useRouter(); const { feConfigs, scripts, title } = useInitApp();
const { hiId } = router.query as { hiId?: string };
const { i18n } = useTranslation();
const { loadGitStar, setInitd, feConfigs } = useSystemStore();
const [scripts, setScripts] = useState<FastGPTFeConfigsType['scripts']>([]);
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]);
return ( return (
<> <>
...@@ -115,17 +29,15 @@ function App({ Component, pageProps }: AppProps) { ...@@ -115,17 +29,15 @@ function App({ Component, pageProps }: AppProps) {
</Head> </Head>
{scripts?.map((item, i) => <Script key={i} strategy="lazyOnload" {...item}></Script>)} {scripts?.map((item, i) => <Script key={i} strategy="lazyOnload" {...item}></Script>)}
<QueryClientProvider client={queryClient}> <QueryClientContext>
<ChakraProvider theme={theme}> <ChakraUIContext>
<ColorModeScript initialColorMode={theme.config.initialColorMode} />
<Layout> <Layout>
<Component {...pageProps} /> <Component {...pageProps} />
</Layout> </Layout>
</ChakraProvider> </ChakraUIContext>
</QueryClientProvider> </QueryClientContext>
</> </>
); );
} }
// @ts-ignore
export default appWithTranslation(App); export default appWithTranslation(App);
import React from 'react'; import React from 'react';
import { Card, Box, Flex } from '@chakra-ui/react'; import { Card, Box, Flex } from '@chakra-ui/react';
import { useMarkdown } from '@/web/common/hooks/useMarkdown'; 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 = ({ const Empty = ({
showChatProblem, showChatProblem,
......
...@@ -10,13 +10,13 @@ import LoginForm from './components/LoginForm/LoginForm'; ...@@ -10,13 +10,13 @@ import LoginForm from './components/LoginForm/LoginForm';
import dynamic from 'next/dynamic'; import dynamic from 'next/dynamic';
import { serviceSideProps } from '@/web/common/utils/i18n'; import { serviceSideProps } from '@/web/common/utils/i18n';
import { clearToken, setToken } from '@/web/support/user/auth'; import { clearToken, setToken } from '@/web/support/user/auth';
import CommunityModal from '@/components/CommunityModal';
import Script from 'next/script'; import Script from 'next/script';
import Loading from '@fastgpt/web/components/common/MyLoading'; import Loading from '@fastgpt/web/components/common/MyLoading';
const RegisterForm = dynamic(() => import('./components/RegisterForm')); const RegisterForm = dynamic(() => import('./components/RegisterForm'));
const ForgetPasswordForm = dynamic(() => import('./components/ForgetPasswordForm')); const ForgetPasswordForm = dynamic(() => import('./components/ForgetPasswordForm'));
const WechatForm = dynamic(() => import('./components/LoginForm/WechatForm')); const WechatForm = dynamic(() => import('./components/LoginForm/WechatForm'));
const CommunityModal = dynamic(() => import('@/components/CommunityModal'));
const Login = () => { const Login = () => {
const router = useRouter(); const router = useRouter();
......
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 (
<ChakraProvider theme={theme}>
<ColorModeScript initialColorMode={theme.config.initialColorMode} />
{children}
</ChakraProvider>
);
};
export default ChakraUIContext;
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 <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
};
export default QueryClientContext;
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<FastGPTFeConfigsType['scripts']>([]);
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
};
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment