diff --git a/src/components/base/base-empty.tsx b/src/components/base/base-empty.tsx
index 420aa2fe89491bf6fb58165bc75ca0d9b602c685..c364a50ab72b1c486b2b4b55941d9060116de876 100644
--- a/src/components/base/base-empty.tsx
+++ b/src/components/base/base-empty.tsx
@@ -6,7 +6,7 @@ interface Props {
   extra?: React.ReactNode;
 }
 
-const BaseEmpty = (props: Props) => {
+export const BaseEmpty = (props: Props) => {
   const { text = "Empty", extra } = props;
 
   return (
@@ -27,5 +27,3 @@ const BaseEmpty = (props: Props) => {
     </Box>
   );
 };
-
-export default BaseEmpty;
diff --git a/src/components/base/base-error-boundary.tsx b/src/components/base/base-error-boundary.tsx
index c6fd12308ac42df66eaca1e5cc30e71630095b52..584fd8a5e441a02ff75b11ea9beea9b04c8efd12 100644
--- a/src/components/base/base-error-boundary.tsx
+++ b/src/components/base/base-error-boundary.tsx
@@ -9,12 +9,10 @@ function ErrorFallback({ error }: FallbackProps) {
   );
 }
 
-const BaseErrorBoundary: React.FC = (props) => {
+export const BaseErrorBoundary: React.FC = (props) => {
   return (
     <ErrorBoundary FallbackComponent={ErrorFallback}>
       {props.children}
     </ErrorBoundary>
   );
 };
-
-export default BaseErrorBoundary;
diff --git a/src/components/base/base-loading.tsx b/src/components/base/base-loading.tsx
index a1352d4e00a95e7753adbf16eea59a30ee313b33..0fdbebf1e579a7d5b925a3295a21362255bb9758 100644
--- a/src/components/base/base-loading.tsx
+++ b/src/components/base/base-loading.tsx
@@ -37,7 +37,7 @@ const LoadingItem = styled("div")(({ theme }) => ({
   background: theme.palette.text.secondary,
 }));
 
-const BaseLoading = () => {
+export const BaseLoading = () => {
   return (
     <Loading>
       <LoadingItem />
@@ -46,5 +46,3 @@ const BaseLoading = () => {
     </Loading>
   );
 };
-
-export default BaseLoading;
diff --git a/src/components/base/base-notice.tsx b/src/components/base/base-notice.tsx
index 39f1130191370afccfd502cc0b37c4a8964135a6..6d45496c7b5cfe513df8716f17eb3559902befe4 100644
--- a/src/components/base/base-notice.tsx
+++ b/src/components/base/base-notice.tsx
@@ -69,7 +69,7 @@ interface NoticeInstance {
 let parent: HTMLDivElement = null!;
 
 // @ts-ignore
-const Notice: NoticeInstance = (props) => {
+export const Notice: NoticeInstance = (props) => {
   if (!parent) {
     parent = document.createElement("div");
     document.body.appendChild(parent);
@@ -91,5 +91,3 @@ const Notice: NoticeInstance = (props) => {
     setTimeout(() => Notice({ type, message, duration }), 0);
   };
 });
-
-export default Notice;
diff --git a/src/components/base/base-page.tsx b/src/components/base/base-page.tsx
index e69b0cfff1b052ac4bb3b6bbde753060cb18f3f4..fefaf82bcf5ce224a2ddb9bfbdb1769e4d7dd9b2 100644
--- a/src/components/base/base-page.tsx
+++ b/src/components/base/base-page.tsx
@@ -1,6 +1,6 @@
 import React from "react";
 import { Typography } from "@mui/material";
-import BaseErrorBoundary from "./base-error-boundary";
+import { BaseErrorBoundary } from "./base-error-boundary";
 
 interface Props {
   title?: React.ReactNode; // the page title
@@ -8,7 +8,7 @@ interface Props {
   contentStyle?: React.CSSProperties;
 }
 
-const BasePage: React.FC<Props> = (props) => {
+export const BasePage: React.FC<Props> = (props) => {
   const { title, header, contentStyle, children } = props;
 
   return (
@@ -31,5 +31,3 @@ const BasePage: React.FC<Props> = (props) => {
     </BaseErrorBoundary>
   );
 };
-
-export default BasePage;
diff --git a/src/components/base/index.ts b/src/components/base/index.ts
index ef1eb46972037760941429302e92e805658a9a34..3e0e32403a5d0b52d0dc8ecb374fcf127c637dfd 100644
--- a/src/components/base/index.ts
+++ b/src/components/base/index.ts
@@ -1,2 +1,6 @@
 export { BaseDialog, type DialogRef } from "./base-dialog";
+export { BasePage } from "./base-page";
+export { BaseEmpty } from "./base-empty";
+export { BaseLoading } from "./base-loading";
+export { BaseErrorBoundary } from "./base-error-boundary";
 export { Notice } from "./base-notice";
diff --git a/src/components/layout/update-dialog.tsx b/src/components/layout/update-dialog.tsx
index e7f45f9b1e9f0d35a6eda6ce09bad34f0c55c6eb..392e0865870e8d629d7830d049dca361fda9e512 100644
--- a/src/components/layout/update-dialog.tsx
+++ b/src/components/layout/update-dialog.tsx
@@ -15,7 +15,7 @@ import {
 import { relaunch } from "@tauri-apps/api/process";
 import { checkUpdate, installUpdate } from "@tauri-apps/api/updater";
 import { atomUpdateState } from "@/services/states";
-import Notice from "../base/base-notice";
+import { Notice } from "@/components/base";
 
 interface Props {
   open: boolean;
diff --git a/src/components/profile/enhanced.tsx b/src/components/profile/enhanced.tsx
index cb5ec606fd8b602031facf217ac21ed51b815ac3..2cc68c90b95d4100ed5a7e5a34e0ce0e7a0361f2 100644
--- a/src/components/profile/enhanced.tsx
+++ b/src/components/profile/enhanced.tsx
@@ -10,8 +10,8 @@ import {
   patchProfilesConfig,
   getRuntimeLogs,
 } from "@/services/cmds";
+import { Notice } from "@/components/base";
 import ProfileMore from "./profile-more";
-import Notice from "../base/base-notice";
 
 interface Props {
   items: IProfileItem[];
diff --git a/src/components/profile/file-editor.tsx b/src/components/profile/file-editor.tsx
index 1cc8a0f47dbe2563994bd7a7b4deb0546405d417..5f9bab779a75dc62a0e57d5d3dca4d8360befae9 100644
--- a/src/components/profile/file-editor.tsx
+++ b/src/components/profile/file-editor.tsx
@@ -11,7 +11,7 @@ import {
 } from "@mui/material";
 import { atomThemeMode } from "@/services/states";
 import { readProfileFile, saveProfileFile } from "@/services/cmds";
-import Notice from "../base/base-notice";
+import { Notice } from "@/components/base";
 
 import "monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution.js";
 import "monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution.js";
@@ -26,7 +26,7 @@ interface Props {
   onChange?: () => void;
 }
 
-const FileEditor = (props: Props) => {
+export const FileEditor = (props: Props) => {
   const { uid, open, mode, onClose, onChange } = props;
 
   const { t } = useTranslation();
@@ -92,5 +92,3 @@ const FileEditor = (props: Props) => {
     </Dialog>
   );
 };
-
-export default FileEditor;
diff --git a/src/components/profile/info-editor.tsx b/src/components/profile/info-editor.tsx
index 950943e34600778b7f6eeb03d2463cc38450b14c..f5c0fb0a376e4efb0a0cffdce8bdc49680642e04 100644
--- a/src/components/profile/info-editor.tsx
+++ b/src/components/profile/info-editor.tsx
@@ -17,7 +17,7 @@ import {
 import { Settings } from "@mui/icons-material";
 import { patchProfile } from "@/services/cmds";
 import { version } from "@root/package.json";
-import Notice from "../base/base-notice";
+import { Notice } from "@/components/base";
 
 interface Props {
   open: boolean;
diff --git a/src/components/profile/log-viewer.tsx b/src/components/profile/log-viewer.tsx
index 949c57adbf9c6683690073be51e1b6695904d612..c3ba16265103857cb7ab276c5aa1cb16de0e1856 100644
--- a/src/components/profile/log-viewer.tsx
+++ b/src/components/profile/log-viewer.tsx
@@ -1,3 +1,4 @@
+import { Fragment } from "react";
 import { useTranslation } from "react-i18next";
 import {
   Button,
@@ -9,8 +10,7 @@ import {
   Divider,
   Typography,
 } from "@mui/material";
-import BaseEmpty from "../base/base-empty";
-import { Fragment } from "react";
+import { BaseEmpty } from "@/components/base";
 
 interface Props {
   open: boolean;
diff --git a/src/components/profile/profile-item.tsx b/src/components/profile/profile-item.tsx
index c721d771f97a609c1ef2f4c1795cc555d6626263..a79e9825538d680f4f20bff9209a646c4ad76dd3 100644
--- a/src/components/profile/profile-item.tsx
+++ b/src/components/profile/profile-item.tsx
@@ -16,11 +16,11 @@ import {
 import { RefreshRounded } from "@mui/icons-material";
 import { atomLoadingCache } from "@/services/states";
 import { updateProfile, deleteProfile, viewProfile } from "@/services/cmds";
+import { Notice } from "@/components/base";
 import parseTraffic from "@/utils/parse-traffic";
 import ProfileBox from "./profile-box";
 import InfoEditor from "./info-editor";
-import FileEditor from "./file-editor";
-import Notice from "../base/base-notice";
+import { FileEditor } from "./file-editor";
 
 const round = keyframes`
   from { transform: rotate(0deg); }
diff --git a/src/components/profile/profile-more.tsx b/src/components/profile/profile-more.tsx
index e8cfba2c283582aa334a8579222471674f1cb9c6..e46daaedfefb950513ff10f9c6838d124d644bac 100644
--- a/src/components/profile/profile-more.tsx
+++ b/src/components/profile/profile-more.tsx
@@ -13,11 +13,11 @@ import {
 } from "@mui/material";
 import { FeaturedPlayListRounded } from "@mui/icons-material";
 import { viewProfile } from "@/services/cmds";
+import { Notice } from "@/components/base";
 import InfoEditor from "./info-editor";
-import FileEditor from "./file-editor";
+import { FileEditor } from "./file-editor";
 import ProfileBox from "./profile-box";
 import LogViewer from "./log-viewer";
-import Notice from "../base/base-notice";
 
 interface Props {
   selected: boolean;
diff --git a/src/components/profile/profile-new.tsx b/src/components/profile/profile-new.tsx
index 05a7815104bbced3c0db6fc5699b621f69e7a26d..c75c6ec7d1a7b70d826c4f7fe4fbd898e10796b2 100644
--- a/src/components/profile/profile-new.tsx
+++ b/src/components/profile/profile-new.tsx
@@ -20,7 +20,7 @@ import {
 } from "@mui/material";
 import { Settings } from "@mui/icons-material";
 import { createProfile } from "@/services/cmds";
-import Notice from "../base/base-notice";
+import { Notice } from "@/components/base";
 import FileInput from "./file-input";
 
 interface Props {
diff --git a/src/components/proxy/proxy-item.tsx b/src/components/proxy/proxy-item.tsx
index d72068269eb0492540c758fad01509c2b202f289..c91991a30c7c3bd509dc0f14549ffca421f81391 100644
--- a/src/components/proxy/proxy-item.tsx
+++ b/src/components/proxy/proxy-item.tsx
@@ -12,8 +12,8 @@ import {
   SxProps,
   Theme,
 } from "@mui/material";
+import { BaseLoading } from "@/components/base";
 import delayManager from "@/services/delay";
-import BaseLoading from "../base/base-loading";
 
 interface Props {
   groupName: string;
diff --git a/src/components/proxy/use-render-list.ts b/src/components/proxy/use-render-list.ts
index 843dc06d0741e98a9b987fb49b118997321c4f08..5fdf52e6566e6f54605154beff8257eb9deddee1 100644
--- a/src/components/proxy/use-render-list.ts
+++ b/src/components/proxy/use-render-list.ts
@@ -16,7 +16,7 @@ export const useRenderList = (mode: string) => {
   const { data: proxiesData, mutate: mutateProxies } = useSWR(
     "getProxies",
     getProxies,
-    { refreshInterval: 45000, suspense: true }
+    { refreshInterval: 45000 }
   );
 
   const [headStates, setHeadState] = useHeadStateNew();
@@ -35,6 +35,7 @@ export const useRenderList = (mode: string) => {
   }, [proxiesData, mode]);
 
   const renderList: IRenderItem[] = useMemo(() => {
+    if (!proxiesData) return [];
     const useRule = mode === "rule" || mode === "script";
     const renderGroups =
       (useRule ? proxiesData?.groups : [proxiesData?.global!]) || [];
diff --git a/src/components/setting/mods/clash-field-viewer.tsx b/src/components/setting/mods/clash-field-viewer.tsx
index bb1579f3c058553b2a8e35e68166be5e611d32da..d9bc09e20ca20e48aaa73ccf9c2c67243260e62a 100644
--- a/src/components/setting/mods/clash-field-viewer.tsx
+++ b/src/components/setting/mods/clash-field-viewer.tsx
@@ -11,7 +11,7 @@ import {
 } from "@/utils/clash-fields";
 import { BaseDialog, DialogRef } from "@/components/base";
 import { useProfiles } from "@/hooks/use-profiles";
-import Notice from "@/components/base/base-notice";
+import { Notice } from "@/components/base";
 
 const fieldSorter = (a: string, b: string) => {
   if (a.includes("-") === a.includes("-")) {
diff --git a/src/components/setting/mods/clash-port-viewer.tsx b/src/components/setting/mods/clash-port-viewer.tsx
index 36604cb3f345575f3452de13f6d7cd0236743e2f..e09fe54896077821e8b718a453435e43667aa008 100644
--- a/src/components/setting/mods/clash-port-viewer.tsx
+++ b/src/components/setting/mods/clash-port-viewer.tsx
@@ -7,8 +7,7 @@ import { List, ListItem, ListItemText, TextField } from "@mui/material";
 import { atomClashPort } from "@/services/states";
 import { getClashConfig } from "@/services/api";
 import { patchClashConfig } from "@/services/cmds";
-import { BaseDialog, DialogRef } from "@/components/base";
-import Notice from "@/components/base/base-notice";
+import { BaseDialog, DialogRef, Notice } from "@/components/base";
 
 export const ClashPortViewer = forwardRef<DialogRef>((props, ref) => {
   const { t } = useTranslation();
diff --git a/src/components/setting/mods/controller-viewer.tsx b/src/components/setting/mods/controller-viewer.tsx
index 3a49c8dbd52e5b07902230032c785fcd2e44e6cc..d3d6a43d4ccf0ca3b99e49568d26a5204e9d65d0 100644
--- a/src/components/setting/mods/controller-viewer.tsx
+++ b/src/components/setting/mods/controller-viewer.tsx
@@ -5,8 +5,7 @@ import { useTranslation } from "react-i18next";
 import { List, ListItem, ListItemText, TextField } from "@mui/material";
 import { getClashInfo, patchClashConfig } from "@/services/cmds";
 import { getAxios } from "@/services/api";
-import { BaseDialog, DialogRef } from "@/components/base";
-import Notice from "@/components/base/base-notice";
+import { BaseDialog, DialogRef, Notice } from "@/components/base";
 
 export const ControllerViewer = forwardRef<DialogRef>((props, ref) => {
   const { t } = useTranslation();
diff --git a/src/components/setting/mods/core-switch.tsx b/src/components/setting/mods/core-switch.tsx
index f57825924c146923aa38370d57ad3dfde013c0bf..d54e6787507f35b2f8375488e25875cf7de5db46 100644
--- a/src/components/setting/mods/core-switch.tsx
+++ b/src/components/setting/mods/core-switch.tsx
@@ -5,7 +5,7 @@ import { Menu, MenuItem } from "@mui/material";
 import { Settings } from "@mui/icons-material";
 import { changeClashCore } from "@/services/cmds";
 import { useVerge } from "@/hooks/use-verge";
-import Notice from "@/components/base/base-notice";
+import { Notice } from "@/components/base";
 
 const VALID_CORE = [
   { name: "Clash", core: "clash" },
diff --git a/src/components/setting/mods/hotkey-viewer.tsx b/src/components/setting/mods/hotkey-viewer.tsx
index 9f41fde82bd4a26d8b0e287b89a0520920732c6e..22a2dacc9c28b01c4968a776274fcee2855b26de 100644
--- a/src/components/setting/mods/hotkey-viewer.tsx
+++ b/src/components/setting/mods/hotkey-viewer.tsx
@@ -3,9 +3,8 @@ import { useTranslation } from "react-i18next";
 import { useLockFn } from "ahooks";
 import { styled, Typography } from "@mui/material";
 import { useVerge } from "@/hooks/use-verge";
-import { BaseDialog, DialogRef } from "@/components/base";
+import { BaseDialog, DialogRef, Notice } from "@/components/base";
 import { HotkeyInput } from "./hotkey-input";
-import Notice from "@/components/base/base-notice";
 
 const ItemWrapper = styled("div")`
   display: flex;
diff --git a/src/components/setting/mods/misc-viewer.tsx b/src/components/setting/mods/misc-viewer.tsx
index 89d2f991ab6d7b165990c4ec4528a66e6a20145b..81b235cde7d0fe5075d9dd1fca22f9709d02c2f0 100644
--- a/src/components/setting/mods/misc-viewer.tsx
+++ b/src/components/setting/mods/misc-viewer.tsx
@@ -3,8 +3,7 @@ import { useLockFn } from "ahooks";
 import { useTranslation } from "react-i18next";
 import { List, ListItem, ListItemText, Switch, TextField } from "@mui/material";
 import { useVerge } from "@/hooks/use-verge";
-import { BaseDialog, DialogRef } from "@/components/base";
-import Notice from "@/components/base/base-notice";
+import { BaseDialog, DialogRef, Notice } from "@/components/base";
 
 export const MiscViewer = forwardRef<DialogRef>((props, ref) => {
   const { t } = useTranslation();
diff --git a/src/components/setting/mods/service-viewer.tsx b/src/components/setting/mods/service-viewer.tsx
index 52c0ebb1cde2f2e0bdbc01abc5f6e1057355beea..9052559b7870c4446f70e50287476e367a30f7f4 100644
--- a/src/components/setting/mods/service-viewer.tsx
+++ b/src/components/setting/mods/service-viewer.tsx
@@ -9,8 +9,7 @@ import {
   patchVergeConfig,
 } from "@/services/cmds";
 import { forwardRef, useState } from "react";
-import { BaseDialog, DialogRef } from "@/components/base";
-import Notice from "@/components/base/base-notice";
+import { BaseDialog, DialogRef, Notice } from "@/components/base";
 
 interface Props {
   enable: boolean;
diff --git a/src/components/setting/mods/sysproxy-viewer.tsx b/src/components/setting/mods/sysproxy-viewer.tsx
index edb5a8c27866f3cb9833ca4822b351461efb7d98..44682dcf638c8297bbe83e83e1c9a13aee3fe451 100644
--- a/src/components/setting/mods/sysproxy-viewer.tsx
+++ b/src/components/setting/mods/sysproxy-viewer.tsx
@@ -14,8 +14,7 @@ import {
 } from "@mui/material";
 import { useVerge } from "@/hooks/use-verge";
 import { getSystemProxy } from "@/services/cmds";
-import { BaseDialog, DialogRef } from "@/components/base";
-import Notice from "@/components/base/base-notice";
+import { BaseDialog, DialogRef, Notice } from "@/components/base";
 
 export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
   const { t } = useTranslation();
diff --git a/src/components/setting/mods/theme-viewer.tsx b/src/components/setting/mods/theme-viewer.tsx
index 014decd85646a6adaecdabd7facdf8d74abc84f6..c68ada296ccf0761b3625e2ff6f4022892f520cb 100644
--- a/src/components/setting/mods/theme-viewer.tsx
+++ b/src/components/setting/mods/theme-viewer.tsx
@@ -11,8 +11,7 @@ import {
 } from "@mui/material";
 import { useVerge } from "@/hooks/use-verge";
 import { defaultTheme, defaultDarkTheme } from "@/pages/_theme";
-import { BaseDialog, DialogRef } from "@/components/base";
-import Notice from "../../base/base-notice";
+import { BaseDialog, DialogRef, Notice } from "@/components/base";
 
 export const ThemeViewer = forwardRef<DialogRef>((props, ref) => {
   const { t } = useTranslation();
diff --git a/src/components/setting/mods/web-ui-viewer.tsx b/src/components/setting/mods/web-ui-viewer.tsx
index cc0d679e2a8610a5348c78f1d2ab734f33a9dbc6..bb47a99b5541bb368093d12dc99fde07265c5aa8 100644
--- a/src/components/setting/mods/web-ui-viewer.tsx
+++ b/src/components/setting/mods/web-ui-viewer.tsx
@@ -5,10 +5,8 @@ import { useTranslation } from "react-i18next";
 import { Button, Box, Typography } from "@mui/material";
 import { useVerge } from "@/hooks/use-verge";
 import { getClashInfo, openWebUrl } from "@/services/cmds";
+import { BaseDialog, BaseEmpty, DialogRef, Notice } from "@/components/base";
 import { WebUIItem } from "./web-ui-item";
-import { BaseDialog, DialogRef } from "@/components/base";
-import BaseEmpty from "@/components/base/base-empty";
-import Notice from "@/components/base/base-notice";
 
 export const WebUIViewer = forwardRef<DialogRef>((props, ref) => {
   const { t } = useTranslation();
diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx
index 145eb3199fc6176b64efcb56b3ccf2b76c509f3e..c2ba2b07d86482f1eae31925a19ccaf9d3cbe546 100644
--- a/src/pages/_layout.tsx
+++ b/src/pages/_layout.tsx
@@ -15,13 +15,12 @@ import { atomCurrentProfile } from "@/services/states";
 import { getProfiles } from "@/services/cmds";
 import { useVerge } from "@/hooks/use-verge";
 import { ReactComponent as LogoSvg } from "@/assets/image/logo.svg";
-import Notice from "@/components/base/base-notice";
+import { BaseErrorBoundary, Notice } from "@/components/base";
 import LayoutItem from "@/components/layout/layout-item";
 import LayoutControl from "@/components/layout/layout-control";
 import LayoutTraffic from "@/components/layout/layout-traffic";
 import UpdateButton from "@/components/layout/update-button";
 import useCustomTheme from "@/components/layout/use-custom-theme";
-import BaseErrorBoundary from "@/components/base/base-error-boundary";
 import getSystem from "@/utils/get-system";
 import "dayjs/locale/zh-cn";
 
diff --git a/src/pages/connections.tsx b/src/pages/connections.tsx
index 059bd63b2aec9df4b287490ed278f73f2a4632f0..eefaa6aed9806814851b0a77443daa28f092bade 100644
--- a/src/pages/connections.tsx
+++ b/src/pages/connections.tsx
@@ -15,8 +15,7 @@ import { useTranslation } from "react-i18next";
 import { TableChartRounded, TableRowsRounded } from "@mui/icons-material";
 import { closeAllConnections, getInformation } from "@/services/api";
 import { atomConnectionSetting } from "@/services/states";
-import BasePage from "@/components/base/base-page";
-import BaseEmpty from "@/components/base/base-empty";
+import { BaseEmpty, BasePage } from "@/components/base";
 import ConnectionItem from "@/components/connection/connection-item";
 import ConnectionTable from "@/components/connection/connection-table";
 
diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx
index 905c7a327e8d7c0fe53f222ea3bef38c880142a8..f7326f2c1fbb310cf52e1da1654375bdbb2f55a4 100644
--- a/src/pages/logs.tsx
+++ b/src/pages/logs.tsx
@@ -16,8 +16,7 @@ import {
   PauseCircleOutlineRounded,
 } from "@mui/icons-material";
 import { atomEnableLog, atomLogData } from "@/services/states";
-import BasePage from "@/components/base/base-page";
-import BaseEmpty from "@/components/base/base-empty";
+import { BaseEmpty, BasePage } from "@/components/base";
 import LogItem from "@/components/log/log-item";
 
 const LogPage = () => {
diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx
index fad443481c2bb9a7407345b7f8a5b169dc9be7d3..15cd711b078b765a31f6d8eddd82f54ea3c206cc 100644
--- a/src/pages/profiles.tsx
+++ b/src/pages/profiles.tsx
@@ -12,8 +12,7 @@ import {
 } from "@/services/cmds";
 import { getProxies, updateProxy } from "@/services/api";
 import { atomCurrentProfile } from "@/services/states";
-import Notice from "@/components/base/base-notice";
-import BasePage from "@/components/base/base-page";
+import { BasePage, Notice } from "@/components/base";
 import ProfileNew from "@/components/profile/profile-new";
 import ProfileItem from "@/components/profile/profile-item";
 import EnhancedMode from "@/components/profile/enhanced";
diff --git a/src/pages/proxies.tsx b/src/pages/proxies.tsx
index 6816bbc276ee82ce38395047508d0de837576ea6..67452cca1d742eb3e558d1ae76a1693300a0a8e2 100644
--- a/src/pages/proxies.tsx
+++ b/src/pages/proxies.tsx
@@ -5,7 +5,7 @@ import { Button, ButtonGroup, Paper } from "@mui/material";
 import { getClashConfig, updateConfigs } from "@/services/api";
 import { patchClashConfig } from "@/services/cmds";
 import { ProxyGroups } from "@/components/proxy/proxy-groups";
-import BasePage from "@/components/base/base-page";
+import { BasePage } from "@/components/base";
 
 const ProxyPage = () => {
   const { t } = useTranslation();
diff --git a/src/pages/rules.tsx b/src/pages/rules.tsx
index 0bc0139d7d895c78bd6f7f51cb75906601c4f56a..86cbdfa9d6f8f3e7f1f911f9d66dd65d2a5d006d 100644
--- a/src/pages/rules.tsx
+++ b/src/pages/rules.tsx
@@ -2,10 +2,9 @@ import useSWR from "swr";
 import { useState, useMemo } from "react";
 import { useTranslation } from "react-i18next";
 import { Virtuoso } from "react-virtuoso";
-import { Box, Button, MenuItem, Paper, Select, TextField } from "@mui/material";
+import { Box, Paper, TextField } from "@mui/material";
 import { getRules } from "@/services/api";
-import BasePage from "@/components/base/base-page";
-import BaseEmpty from "@/components/base/base-empty";
+import { BaseEmpty, BasePage } from "@/components/base";
 import RuleItem from "@/components/rule/rule-item";
 
 const RulesPage = () => {
diff --git a/src/pages/settings.tsx b/src/pages/settings.tsx
index fcf7bd6f13580c30c8d8750eea1e49514e31a507..9904335f9383390a2f1ab651c1463d80f2a6ce04 100644
--- a/src/pages/settings.tsx
+++ b/src/pages/settings.tsx
@@ -1,7 +1,6 @@
 import { Paper } from "@mui/material";
 import { useTranslation } from "react-i18next";
-import Notice from "@/components/base/base-notice";
-import BasePage from "@/components/base/base-page";
+import { BasePage, Notice } from "@/components/base";
 import SettingVerge from "@/components/setting/setting-verge";
 import SettingClash from "@/components/setting/setting-clash";
 import SettingSystem from "@/components/setting/setting-system";
diff --git a/src/services/cmds.ts b/src/services/cmds.ts
index 168378ec8d7cd361a45f2d9097f15982f9bdbf45..b5a7d3d793abcdab76cc7709d9808d619f8877ad 100644
--- a/src/services/cmds.ts
+++ b/src/services/cmds.ts
@@ -1,5 +1,5 @@
 import { invoke } from "@tauri-apps/api/tauri";
-import Notice from "@/components/base/base-notice";
+import { Notice } from "@/components/base";
 
 export async function getClashLogs() {
   const regex = /time="(.+?)"\s+level=(.+?)\s+msg="(.+?)"/;