Skip to content

Commit ed137f3

Browse files
authored
Merge pull request #32 from CleanEngine/develop
[FE] - refactor: 청크 분리 및 차트 lazy import 적용
2 parents 313fa30 + e875724 commit ed137f3

File tree

4 files changed

+55
-38
lines changed

4 files changed

+55
-38
lines changed

src/app/routes/trade.$ticker.tsx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as cookie from 'cookie';
22
import { AnimatePresence } from 'motion/react';
3-
import { useState } from 'react';
3+
import { Suspense, lazy, useState } from 'react';
44
import { Outlet, redirect } from 'react-router';
55

66
import { CoinPriceWithName, api as coinApi } from '~/entities/coin';
@@ -10,13 +10,15 @@ import { CoinListWithSearchBar } from '~/features/coin-search-list';
1010
import { OrderForm, OrderFormFallback } from '~/features/order';
1111
import { ExecutionList } from '~/features/order-execution-list';
1212
import useTradeNotification from '~/features/trade/hooks/useTradeNotification';
13-
import { Orderbook, StockChart } from '~/features/tradeview';
1413
import Container from '~/shared/ui/Container';
1514
import ContainerTitle from '~/shared/ui/ContainerTitle';
1615
import { NavBar, SideBar } from '~/widgets/navbar';
1716
import { useUserId } from '../provider/UserInfoProvider';
1817
import type { Route } from './+types/trade.$ticker';
1918

19+
const LazyStockChart = lazy(() => import('~/features/tradeview/ui/StockChart'));
20+
const LazyOrderBook = lazy(() => import('~/features/tradeview/ui/Orderbook'));
21+
2022
export async function loader({ request, params }: Route.LoaderArgs) {
2123
const rawCookie = request.headers.get('Cookie');
2224
const cookies = cookie.parse(rawCookie || '');
@@ -79,12 +81,14 @@ export default function TradeRouteComponent({
7981
<div className="h-auto md:col-span-full md:row-span-2 md:row-start-1 xl:col-span-full xl:row-span-1 xl:row-start-1 2xl:col-span-2 2xl:col-start-2 2xl:row-start-1">
8082
<Container>
8183
<ContainerTitle>실시간 차트</ContainerTitle>
82-
{coinInfo && (
83-
<StockChart
84-
key={`chart-${coinInfo.ticker}`}
85-
ticker={coinInfo.ticker}
86-
/>
87-
)}
84+
<Suspense fallback="차트데이터를 가져오고 있습니다.">
85+
{coinInfo && (
86+
<LazyStockChart
87+
key={`chart-${coinInfo.ticker}`}
88+
ticker={coinInfo.ticker}
89+
/>
90+
)}
91+
</Suspense>
8892
</Container>
8993
</div>
9094
<div className="md:col-span-1 md:col-start-2 md:row-span-2 md:row-start-3 xl:col-span-1 xl:col-start-3 xl:row-span-1 xl:row-start2 2xl:col-start-4 2xl:row-span-1 2xl:row-start-1">
@@ -100,7 +104,9 @@ export default function TradeRouteComponent({
100104
<div className="md:col-span-1 md:col-start-1 md:row-span-2 md:row-start-3 xl:col-span-1 xl:col-start-2 xl:row-span-1 xl:row-start-2 2xl:col-start-4 2xl:row-span-full 2xl:row-start-2">
101105
<Container>
102106
<ContainerTitle>실시간 호가</ContainerTitle>
103-
{coinInfo && <Orderbook ticker={coinInfo.ticker} />}
107+
<Suspense fallback={null}>
108+
{coinInfo && <LazyOrderBook ticker={coinInfo.ticker} />}
109+
</Suspense>
104110
</Container>
105111
</div>
106112
<div className="md:col-span-full md:row-span-1 md:row-start-5 xl:col-span-1 xl:col-start-1 xl:row-span-1 xl:row-start-2 2xl:col-span-2 2xl:col-start-2 2xl:row-start-2">
Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
import { useMachine } from '@xstate/react';
22
import { AnimatePresence } from 'motion/react';
3-
import { type ChangeEvent, type FormEvent, useState } from 'react';
3+
import {
4+
type ChangeEvent,
5+
type FormEvent,
6+
Suspense,
7+
lazy,
8+
useState,
9+
} from 'react';
410

511
import useScrollToBottom from '~/shared/hooks/useScrollToBottom';
612
import { chatMachine } from '../../model/chat.machine';
713
import ChatButton from '../ChatButton';
8-
import ChatWindow from '../ChatWindow';
914
import MessageBox from '../MessageBox';
1015

16+
const LazyChatWindow = lazy(() => import('~/features/chat/ui/ChatWindow'));
17+
1118
export default function AIChatBot() {
1219
const [state, send] = useMachine(chatMachine);
1320
const [isOpen, setIsOpen] = useState(false);
@@ -32,30 +39,32 @@ export default function AIChatBot() {
3239

3340
return (
3441
<AnimatePresence mode="wait" propagate>
35-
{isOpen ? (
36-
<ChatWindow
37-
handleClose={handleCloseChatWindow}
38-
inputValue={state.context.question}
39-
handleSubmit={handleSubmitQuestion}
40-
handleInputValueChange={handleQuestionFieldChange}
41-
state={state.context.state}
42-
key="chat-window"
43-
>
44-
{state.context.messageList.map((message, index) => {
45-
const key = `msg-${index}-${message.isMine ? 'user' : 'ai'}`;
46-
return (
47-
<MessageBox
48-
key={key}
49-
direction={message.isMine ? 'right' : 'left'}
50-
message={message.message}
51-
/>
52-
);
53-
})}
54-
<div ref={messagesEndRef} />
55-
</ChatWindow>
56-
) : (
57-
<ChatButton handleClick={handleOpenChatWindow} isOpen={isOpen} />
58-
)}
42+
<Suspense fallback={null}>
43+
{isOpen ? (
44+
<LazyChatWindow
45+
handleClose={handleCloseChatWindow}
46+
inputValue={state.context.question}
47+
handleSubmit={handleSubmitQuestion}
48+
handleInputValueChange={handleQuestionFieldChange}
49+
state={state.context.state}
50+
key="chat-window"
51+
>
52+
{state.context.messageList.map((message, index) => {
53+
const key = `msg-${index}-${message.isMine ? 'user' : 'ai'}`;
54+
return (
55+
<MessageBox
56+
key={key}
57+
direction={message.isMine ? 'right' : 'left'}
58+
message={message.message}
59+
/>
60+
);
61+
})}
62+
<div ref={messagesEndRef} />
63+
</LazyChatWindow>
64+
) : (
65+
<ChatButton handleClick={handleOpenChatWindow} isOpen={isOpen} />
66+
)}
67+
</Suspense>
5968
</AnimatePresence>
6069
);
6170
}

stats.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

vite.config.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ export default defineConfig({
1616
optimizeDeps: {
1717
exclude: ['@amcharts/amcharts5'],
1818
},
19-
ssr: {
20-
noExternal: ['@amcharts/amcharts5'],
19+
build: {
20+
rollupOptions: {
21+
external: ['d3-geo,d3-selection,d3-transition'],
22+
},
2123
},
2224
});

0 commit comments

Comments
 (0)