@4399ywkf/cli 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/templates/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/Locale.tsx +14 -18
- package/dist/templates/MainContentWrap.tsx +11 -15
- package/dist/templates/ThemeContext.tsx +27 -24
- package/dist/templates/app/config/env/.env.public.tpl +2 -19
- package/dist/templates/app/config/jwt/index.ts +4 -4
- package/dist/templates/app/config/request/error-handler.ts +67 -0
- package/dist/templates/app/config/request/index.ts +127 -129
- package/dist/templates/app/config/request/interceptors.ts +118 -0
- package/dist/templates/app/config/request/token-manager.ts +23 -0
- package/dist/templates/app/config/request/types.ts +63 -0
- package/dist/templates/app/config/rspack/rspack.config.mjs +62 -61
- package/dist/templates/app/config/rspack/rspack.prod.mjs +41 -62
- package/dist/templates/app/locales/zh-CN/common.json +3 -0
- package/dist/templates/app/package.json.tpl +1 -10
- package/dist/templates/app/public/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/app/public/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/app/public/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/app/react-app-env.d.ts +13 -8
- package/dist/templates/app/src/bootstrap/index.ts +34 -0
- package/dist/templates/app/src/config/env.ts +84 -0
- package/dist/templates/app/src/index.tsx +17 -51
- package/dist/templates/app/src/layout/Locale.tsx +14 -18
- package/dist/templates/app/src/layout/MainContentWrap.tsx +11 -15
- package/dist/templates/app/src/layout/ThemeContext.tsx +27 -24
- package/dist/templates/app/src/locales/default/common.ts +3 -1
- package/dist/templates/app/src/micro/garfish.ts +53 -0
- package/dist/templates/app/src/pages/base/index.tsx +189 -25
- package/dist/templates/app/src/routes.tsx +21 -12
- package/dist/templates/app/src/types/global.d.ts +19 -0
- package/dist/templates/app/src/utils/index.ts +3 -1
- package/dist/templates/app/store/middleware/createDevtools.ts +7 -7
- package/dist/templates/base/index.tsx +189 -25
- package/dist/templates/bootstrap/index.ts +34 -0
- package/dist/templates/common.json +3 -0
- package/dist/templates/common.ts +3 -1
- package/dist/templates/config/env/.env.public.tpl +2 -19
- package/dist/templates/config/env.ts +84 -0
- package/dist/templates/config/jwt/index.ts +4 -4
- package/dist/templates/config/request/error-handler.ts +67 -0
- package/dist/templates/config/request/index.ts +127 -129
- package/dist/templates/config/request/interceptors.ts +118 -0
- package/dist/templates/config/request/token-manager.ts +23 -0
- package/dist/templates/config/request/types.ts +63 -0
- package/dist/templates/config/rspack/rspack.config.mjs +62 -61
- package/dist/templates/config/rspack/rspack.prod.mjs +41 -62
- package/dist/templates/createDevtools.ts +7 -7
- package/dist/templates/default/common.ts +3 -1
- package/dist/templates/env/.env.public.tpl +2 -19
- package/dist/templates/env.ts +83 -2
- package/dist/templates/error-handler.ts +67 -0
- package/dist/templates/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/garfish.ts +53 -0
- package/dist/templates/global.d.ts +19 -0
- package/dist/templates/index.tsx +189 -25
- package/dist/templates/interceptors.ts +118 -0
- package/dist/templates/jwt/index.ts +4 -4
- package/dist/templates/layout/Locale.tsx +14 -18
- package/dist/templates/layout/MainContentWrap.tsx +11 -15
- package/dist/templates/layout/ThemeContext.tsx +27 -24
- package/dist/templates/locales/default/common.ts +3 -1
- package/dist/templates/locales/zh-CN/common.json +3 -0
- package/dist/templates/micro/garfish.ts +53 -0
- package/dist/templates/middleware/createDevtools.ts +7 -7
- package/dist/templates/package.json.tpl +1 -10
- package/dist/templates/page.tsx +21 -19
- package/dist/templates/pages/base/index.tsx +189 -25
- package/dist/templates/public/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/public/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/public/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/react-app-env.d.ts +13 -8
- package/dist/templates/request/error-handler.ts +67 -0
- package/dist/templates/request/index.ts +127 -129
- package/dist/templates/request/interceptors.ts +118 -0
- package/dist/templates/request/token-manager.ts +23 -0
- package/dist/templates/request/types.ts +63 -0
- package/dist/templates/routes.tsx +21 -12
- package/dist/templates/rspack/rspack.config.mjs +62 -61
- package/dist/templates/rspack/rspack.prod.mjs +41 -62
- package/dist/templates/rspack.config.mjs +62 -61
- package/dist/templates/rspack.prod.mjs +41 -62
- package/dist/templates/src/bootstrap/index.ts +34 -0
- package/dist/templates/src/config/env.ts +84 -0
- package/dist/templates/src/index.tsx +17 -51
- package/dist/templates/src/layout/Locale.tsx +14 -18
- package/dist/templates/src/layout/MainContentWrap.tsx +11 -15
- package/dist/templates/src/layout/ThemeContext.tsx +27 -24
- package/dist/templates/src/locales/default/common.ts +3 -1
- package/dist/templates/src/micro/garfish.ts +53 -0
- package/dist/templates/src/pages/base/index.tsx +189 -25
- package/dist/templates/src/routes.tsx +21 -12
- package/dist/templates/src/types/global.d.ts +19 -0
- package/dist/templates/src/utils/index.ts +3 -1
- package/dist/templates/store/middleware/createDevtools.ts +7 -7
- package/dist/templates/token-manager.ts +23 -0
- package/dist/templates/types/global.d.ts +19 -0
- package/dist/templates/utils/index.ts +3 -1
- package/dist/templates/zh-CN/common.json +3 -0
- package/package.json +1 -1
- package/dist/templates/app/config/sentry/sentry.config.ts +0 -188
- package/dist/templates/app/src/hooks/useRouteTitle.tsx +0 -36
- package/dist/templates/app/src/hooks/useSentry.ts +0 -92
- package/dist/templates/app/src/pages/base/layout.tsx +0 -6
- package/dist/templates/app/src/pages/base/page.tsx +0 -25
- package/dist/templates/app/src/utils/env.ts +0 -3
- package/dist/templates/app/src/utils/format.ts +0 -21
- package/dist/templates/app/src/utils/getMicroApp.ts +0 -39
- package/dist/templates/app/src/utils/sentry.ts +0 -187
- package/dist/templates/app/src/utils/sentryDecorators.ts +0 -34
- package/dist/templates/app/src/utils/updateVersion.ts +0 -186
- package/dist/templates/base/layout.tsx +0 -6
- package/dist/templates/base/page.tsx +0 -25
- package/dist/templates/config/public/404.png +0 -0
- package/dist/templates/config/public/favicon.ico +0 -0
- package/dist/templates/config/public/images/banner_market_modal.webp +0 -0
- package/dist/templates/config/public/images/chatmode_chat_dark.webp +0 -0
- package/dist/templates/config/public/images/chatmode_chat_light.webp +0 -0
- package/dist/templates/config/public/images/chatmode_docs_dark.webp +0 -0
- package/dist/templates/config/public/images/chatmode_docs_light.webp +0 -0
- package/dist/templates/config/public/images/empty_topic_dark.webp +0 -0
- package/dist/templates/config/public/images/empty_topic_light.webp +0 -0
- package/dist/templates/config/public/images/screenshot_background.webp +0 -0
- package/dist/templates/config/public/images/theme_auto.webp +0 -0
- package/dist/templates/config/public/images/theme_dark.webp +0 -0
- package/dist/templates/config/public/images/theme_light.webp +0 -0
- package/dist/templates/config/public/index.html +0 -29
- package/dist/templates/config/sentry/sentry.config.ts +0 -188
- package/dist/templates/format.ts +0 -21
- package/dist/templates/getMicroApp.ts +0 -39
- package/dist/templates/hooks/useRouteTitle.tsx +0 -36
- package/dist/templates/hooks/useSentry.ts +0 -92
- package/dist/templates/layout.tsx +0 -6
- package/dist/templates/pages/base/layout.tsx +0 -6
- package/dist/templates/pages/base/page.tsx +0 -25
- package/dist/templates/sentry/sentry.config.ts +0 -188
- package/dist/templates/sentry.config.ts +0 -188
- package/dist/templates/sentry.ts +0 -187
- package/dist/templates/sentryDecorators.ts +0 -34
- package/dist/templates/src/hooks/useRouteTitle.tsx +0 -36
- package/dist/templates/src/hooks/useSentry.ts +0 -92
- package/dist/templates/src/pages/base/layout.tsx +0 -6
- package/dist/templates/src/pages/base/page.tsx +0 -25
- package/dist/templates/src/utils/env.ts +0 -3
- package/dist/templates/src/utils/format.ts +0 -21
- package/dist/templates/src/utils/getMicroApp.ts +0 -39
- package/dist/templates/src/utils/sentry.ts +0 -187
- package/dist/templates/src/utils/sentryDecorators.ts +0 -34
- package/dist/templates/src/utils/updateVersion.ts +0 -186
- package/dist/templates/updateVersion.ts +0 -186
- package/dist/templates/useRouteTitle.tsx +0 -36
- package/dist/templates/useSentry.ts +0 -92
- package/dist/templates/utils/env.ts +0 -3
- package/dist/templates/utils/format.ts +0 -21
- package/dist/templates/utils/getMicroApp.ts +0 -39
- package/dist/templates/utils/sentry.ts +0 -187
- package/dist/templates/utils/sentryDecorators.ts +0 -34
- package/dist/templates/utils/updateVersion.ts +0 -186
- /package/dist/templates/app/{config/public → public}/404.png +0 -0
- /package/dist/templates/app/{config/public → public}/favicon.ico +0 -0
- /package/dist/templates/app/{config/public → public}/images/banner_market_modal.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_chat_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_chat_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_docs_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_docs_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/empty_topic_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/empty_topic_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/screenshot_background.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/theme_auto.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/theme_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/theme_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/index.html +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AxiosInstance,
|
|
3
|
+
InternalAxiosRequestConfig,
|
|
4
|
+
AxiosResponse,
|
|
5
|
+
} from "axios";
|
|
6
|
+
import { message as antdMessage } from "antd";
|
|
7
|
+
import type { TokenManager, RequestConfig, ApiResponse } from "./types";
|
|
8
|
+
import type { ErrorHandler } from "./error-handler";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 设置请求拦截器
|
|
12
|
+
*/
|
|
13
|
+
export function setupRequestInterceptor(
|
|
14
|
+
instance: AxiosInstance,
|
|
15
|
+
tokenManager: TokenManager
|
|
16
|
+
): void {
|
|
17
|
+
instance.interceptors.request.use(
|
|
18
|
+
(config: InternalAxiosRequestConfig) => {
|
|
19
|
+
const requestConfig = config as RequestConfig;
|
|
20
|
+
|
|
21
|
+
// 添加 Token(如果需要认证,默认为 true)
|
|
22
|
+
if (requestConfig.requireAuth !== false) {
|
|
23
|
+
const token = tokenManager.getToken();
|
|
24
|
+
if (token && config.headers) {
|
|
25
|
+
config.headers.Authorization = token;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// 添加自定义 Headers
|
|
30
|
+
if (requestConfig.customHeaders && config.headers) {
|
|
31
|
+
Object.entries(requestConfig.customHeaders).forEach(([key, value]) => {
|
|
32
|
+
config.headers[key] = value;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return config;
|
|
37
|
+
},
|
|
38
|
+
(error) => {
|
|
39
|
+
return Promise.reject(error);
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 设置响应拦截器
|
|
46
|
+
*/
|
|
47
|
+
export function setupResponseInterceptor(
|
|
48
|
+
instance: AxiosInstance,
|
|
49
|
+
tokenManager: TokenManager,
|
|
50
|
+
errorHandler: ErrorHandler,
|
|
51
|
+
onUnauthorized?: () => void
|
|
52
|
+
): void {
|
|
53
|
+
instance.interceptors.response.use(
|
|
54
|
+
(response: AxiosResponse<ApiResponse>) => {
|
|
55
|
+
const config = response.config as RequestConfig;
|
|
56
|
+
const messageConfig = config.message;
|
|
57
|
+
|
|
58
|
+
const { code, message: msg, data } = response.data;
|
|
59
|
+
|
|
60
|
+
// 业务成功(根据实际后端约定调整)
|
|
61
|
+
if (code === 0 || code === 200) {
|
|
62
|
+
// 显示成功消息
|
|
63
|
+
if (messageConfig?.showSuccess) {
|
|
64
|
+
const successMsg = messageConfig.successMessage || msg || "操作成功";
|
|
65
|
+
antdMessage.success(successMsg);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 直接返回 data,简化调用
|
|
69
|
+
return response.data;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 业务失败
|
|
73
|
+
const errorMsg = messageConfig?.errorMessage || msg || "操作失败";
|
|
74
|
+
|
|
75
|
+
if (messageConfig?.showError !== false) {
|
|
76
|
+
antdMessage.error(errorMsg);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return Promise.reject(new Error(errorMsg));
|
|
80
|
+
},
|
|
81
|
+
async (error) => {
|
|
82
|
+
const config = error.config as RequestConfig;
|
|
83
|
+
|
|
84
|
+
// 401 未授权
|
|
85
|
+
if (error.response?.status === 401) {
|
|
86
|
+
tokenManager.clearToken();
|
|
87
|
+
|
|
88
|
+
// 执行自定义的未授权回调
|
|
89
|
+
if (onUnauthorized) {
|
|
90
|
+
onUnauthorized();
|
|
91
|
+
} else {
|
|
92
|
+
// 默认跳转到登录页
|
|
93
|
+
redirectToLogin();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return Promise.reject(error);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 其他错误统一处理
|
|
100
|
+
errorHandler.handle(error, config);
|
|
101
|
+
|
|
102
|
+
return Promise.reject(error);
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 重定向到登录页
|
|
109
|
+
*/
|
|
110
|
+
function redirectToLogin(): void {
|
|
111
|
+
if (typeof window === "undefined") return;
|
|
112
|
+
|
|
113
|
+
const currentPath = window.location.pathname;
|
|
114
|
+
if (currentPath === "/login") return;
|
|
115
|
+
|
|
116
|
+
const redirectUrl = encodeURIComponent(window.location.href);
|
|
117
|
+
window.location.href = `${window.location.origin}/login?redirect=${redirectUrl}`;
|
|
118
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import jwt from "@config/jwt";
|
|
2
|
+
import type { TokenManager as TokenManagerType } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Token 刷新管理器
|
|
5
|
+
* 使用 Promise 避免并发刷新问题
|
|
6
|
+
*/
|
|
7
|
+
export class TokenManager implements TokenManagerType {
|
|
8
|
+
getToken(token?: string): string | undefined {
|
|
9
|
+
return jwt.getAccessToken(token);
|
|
10
|
+
}
|
|
11
|
+
setToken(token: {
|
|
12
|
+
token_type: any;
|
|
13
|
+
access_token: any;
|
|
14
|
+
expires_at: number;
|
|
15
|
+
}): void {
|
|
16
|
+
jwt.setAccessToken(token);
|
|
17
|
+
}
|
|
18
|
+
clearToken(token?: string): void {
|
|
19
|
+
jwt.clearAccessToken(token);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const tokenManager = new TokenManager();
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AxiosRequestConfig } from "axios";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 后端统一响应格式
|
|
5
|
+
*/
|
|
6
|
+
export interface ApiResponse<T = any> {
|
|
7
|
+
code: number;
|
|
8
|
+
message: string;
|
|
9
|
+
data: T;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 消息提示配置
|
|
14
|
+
*/
|
|
15
|
+
export interface MessageConfig {
|
|
16
|
+
/** 是否显示成功消息 */
|
|
17
|
+
showSuccess?: boolean;
|
|
18
|
+
/** 自定义成功消息 */
|
|
19
|
+
successMessage?: string;
|
|
20
|
+
/** 是否显示错误消息 */
|
|
21
|
+
showError?: boolean;
|
|
22
|
+
/** 自定义错误消息 */
|
|
23
|
+
errorMessage?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 扩展的请求配置
|
|
28
|
+
*/
|
|
29
|
+
export interface RequestConfig extends AxiosRequestConfig {
|
|
30
|
+
/** 消息提示配置 */
|
|
31
|
+
message?: MessageConfig;
|
|
32
|
+
/** 自定义请求头 */
|
|
33
|
+
customHeaders?: Record<string, string>;
|
|
34
|
+
/** 是否需要认证(默认 true) */
|
|
35
|
+
requireAuth?: boolean;
|
|
36
|
+
/** 请求元数据(用于日志、监控等) */
|
|
37
|
+
metadata?: Record<string, any>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Token 信息
|
|
42
|
+
*/
|
|
43
|
+
export interface TokenInfo {
|
|
44
|
+
token_type: string;
|
|
45
|
+
access_token: string;
|
|
46
|
+
expires_at: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Token 管理器接口
|
|
51
|
+
*/
|
|
52
|
+
export interface TokenManager {
|
|
53
|
+
getToken(key?: string): string | undefined;
|
|
54
|
+
setToken(token: TokenInfo): void;
|
|
55
|
+
clearToken(key?: string): void;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 错误处理器接口
|
|
60
|
+
*/
|
|
61
|
+
export interface ErrorHandler {
|
|
62
|
+
handle(error: any, config?: RequestConfig): void;
|
|
63
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { defineConfig } from
|
|
2
|
-
import { rspack } from
|
|
3
|
-
import path from
|
|
4
|
-
import fs from
|
|
5
|
-
import { RsdoctorRspackPlugin } from
|
|
6
|
-
import dotenv from
|
|
7
|
-
import { createRequire } from
|
|
1
|
+
import { defineConfig } from "@rspack/cli";
|
|
2
|
+
import { rspack } from "@rspack/core";
|
|
3
|
+
import path from "./paths.js";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import { RsdoctorRspackPlugin } from "@rsdoctor/rspack-plugin";
|
|
6
|
+
import dotenv from "dotenv";
|
|
7
|
+
import { createRequire } from "module";
|
|
8
8
|
|
|
9
9
|
// 创建 require 函数用于 require.resolve
|
|
10
10
|
const require = createRequire(import.meta.url);
|
|
11
11
|
|
|
12
12
|
// 复用现有的环境变量加载逻辑
|
|
13
|
-
dotenv.config({ path: path.resolveApp(
|
|
13
|
+
dotenv.config({ path: path.resolveApp("./config/env/.env.public") });
|
|
14
14
|
|
|
15
15
|
let extraConfig = {};
|
|
16
16
|
try {
|
|
@@ -19,40 +19,41 @@ try {
|
|
|
19
19
|
extraConfig = dotenv.parse(fs.readFileSync(envFile));
|
|
20
20
|
}
|
|
21
21
|
} catch (error) {
|
|
22
|
-
console.warn(
|
|
22
|
+
console.warn("环境变量文件读取失败:", error.message);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
for (const key in extraConfig) {
|
|
26
26
|
process.env[key] = extraConfig[key];
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
const APP_CNAME = process.env.APP_CNAME ||
|
|
30
|
-
const APP_NAME = process.env.APP_NAME ||
|
|
31
|
-
const OUTPUT_PATH = process.env.OUTPUT_PATH ||
|
|
32
|
-
const PUBLIC_PATH = process.env.PUBLIC_PATH ||
|
|
29
|
+
const APP_CNAME = process.env.APP_CNAME || "Chat应用";
|
|
30
|
+
const APP_NAME = process.env.APP_NAME || "chat";
|
|
31
|
+
const OUTPUT_PATH = process.env.OUTPUT_PATH || "dist";
|
|
32
|
+
const PUBLIC_PATH = process.env.PUBLIC_PATH || "/";
|
|
33
33
|
|
|
34
34
|
export default defineConfig({
|
|
35
|
-
entry: [path.resolveApp(
|
|
35
|
+
entry: [path.resolveApp("./src/index")],
|
|
36
36
|
|
|
37
37
|
resolve: {
|
|
38
|
-
extensions: [
|
|
38
|
+
extensions: [".ts", ".tsx", ".jsx", ".js", ".json"],
|
|
39
39
|
alias: {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
"@": path.resolveApp("./src"),
|
|
41
|
+
"@config": path.resolveApp("./config"),
|
|
42
|
+
"@store": path.resolveApp("./store"),
|
|
43
|
+
"@locales": path.resolveApp("./locales"),
|
|
44
|
+
"@public": path.resolveApp("./public"),
|
|
44
45
|
},
|
|
45
46
|
fallback: {
|
|
46
|
-
path: require.resolve(
|
|
47
|
-
process: require.resolve(
|
|
48
|
-
buffer: require.resolve(
|
|
49
|
-
util: require.resolve(
|
|
50
|
-
stream: require.resolve(
|
|
51
|
-
crypto: require.resolve(
|
|
52
|
-
zlib: require.resolve(
|
|
53
|
-
querystring: require.resolve(
|
|
54
|
-
url: require.resolve(
|
|
55
|
-
assert: require.resolve(
|
|
47
|
+
path: require.resolve("path-browserify"),
|
|
48
|
+
process: require.resolve("process/browser.js"),
|
|
49
|
+
buffer: require.resolve("buffer"),
|
|
50
|
+
util: require.resolve("util"),
|
|
51
|
+
stream: require.resolve("stream-browserify"),
|
|
52
|
+
crypto: require.resolve("crypto-browserify"),
|
|
53
|
+
zlib: require.resolve("browserify-zlib"),
|
|
54
|
+
querystring: require.resolve("querystring-es3"),
|
|
55
|
+
url: require.resolve("url"),
|
|
56
|
+
assert: require.resolve("assert"),
|
|
56
57
|
fs: false,
|
|
57
58
|
net: false,
|
|
58
59
|
tls: false,
|
|
@@ -67,28 +68,28 @@ export default defineConfig({
|
|
|
67
68
|
{
|
|
68
69
|
test: /\.[jt]sx?$/,
|
|
69
70
|
include: [
|
|
70
|
-
path.resolveApp(
|
|
71
|
-
path.resolveApp(
|
|
72
|
-
path.resolveApp(
|
|
73
|
-
path.resolveApp(
|
|
71
|
+
path.resolveApp("src"),
|
|
72
|
+
path.resolveApp("config"),
|
|
73
|
+
path.resolveApp("store"),
|
|
74
|
+
path.resolveApp("packages"),
|
|
74
75
|
],
|
|
75
|
-
exclude: [path.resolveApp(
|
|
76
|
+
exclude: [path.resolveApp("node_modules")],
|
|
76
77
|
use: [
|
|
77
78
|
{
|
|
78
|
-
loader:
|
|
79
|
+
loader: "builtin:swc-loader",
|
|
79
80
|
options: {
|
|
80
81
|
jsc: {
|
|
81
82
|
parser: {
|
|
82
|
-
syntax:
|
|
83
|
+
syntax: "typescript",
|
|
83
84
|
tsx: true,
|
|
84
85
|
decorators: true,
|
|
85
86
|
},
|
|
86
87
|
transform: {
|
|
87
88
|
react: {
|
|
88
|
-
runtime:
|
|
89
|
+
runtime: "automatic",
|
|
89
90
|
},
|
|
90
91
|
},
|
|
91
|
-
target:
|
|
92
|
+
target: "es2015",
|
|
92
93
|
},
|
|
93
94
|
sourceMaps: true,
|
|
94
95
|
},
|
|
@@ -96,10 +97,10 @@ export default defineConfig({
|
|
|
96
97
|
],
|
|
97
98
|
},
|
|
98
99
|
{
|
|
99
|
-
test: /\.(png|jpg|jpeg|gif|webp|m3u8|exr|hdr|json)$/,
|
|
100
|
-
include: [path.resolveApp(
|
|
101
|
-
exclude: [path.resolveApp(
|
|
102
|
-
type:
|
|
100
|
+
test: /\.(png|jpg|jpeg|gif|webp|m3u8|exr|hdr|json|woff2)$/,
|
|
101
|
+
include: [path.resolveApp("public")],
|
|
102
|
+
exclude: [path.resolveApp("src"), path.resolveApp("store")],
|
|
103
|
+
type: "asset",
|
|
103
104
|
parser: {
|
|
104
105
|
dataUrlCondition: {
|
|
105
106
|
maxSize: 10 * 1024,
|
|
@@ -107,33 +108,33 @@ export default defineConfig({
|
|
|
107
108
|
},
|
|
108
109
|
},
|
|
109
110
|
{
|
|
110
|
-
test: /\.md$/,
|
|
111
|
-
include: [path.resolveApp(
|
|
112
|
-
type:
|
|
111
|
+
test: /\.(md)$/,
|
|
112
|
+
include: [path.resolveApp("src")],
|
|
113
|
+
type: "asset/source",
|
|
113
114
|
},
|
|
114
115
|
{
|
|
115
116
|
test: /\.svg$/,
|
|
116
|
-
use: [
|
|
117
|
+
use: ["@svgr/webpack"],
|
|
117
118
|
},
|
|
118
119
|
],
|
|
119
120
|
},
|
|
120
121
|
|
|
121
122
|
plugins: [
|
|
122
123
|
new rspack.ProvidePlugin({
|
|
123
|
-
process:
|
|
124
|
-
Buffer: [
|
|
124
|
+
process: "process/browser.js",
|
|
125
|
+
Buffer: ["buffer", "Buffer"],
|
|
125
126
|
}),
|
|
126
127
|
new rspack.DefinePlugin({
|
|
127
|
-
|
|
128
|
+
"process.env": JSON.stringify(process.env),
|
|
128
129
|
// ["__CONVENTION_ROUTES__"]: JSON.stringify([]),
|
|
129
130
|
}),
|
|
130
131
|
new rspack.HtmlRspackPlugin({
|
|
131
|
-
template: path.resolveApp(
|
|
132
|
-
filename:
|
|
133
|
-
inject:
|
|
132
|
+
template: path.resolveApp("./public/index.html"),
|
|
133
|
+
filename: "index.html",
|
|
134
|
+
inject: "body",
|
|
134
135
|
hash: true,
|
|
135
|
-
minify: process.env.NODE_ENV ===
|
|
136
|
-
favicon: path.resolveApp(
|
|
136
|
+
minify: process.env.NODE_ENV === "production",
|
|
137
|
+
favicon: path.resolveApp("./public/favicon.ico"),
|
|
137
138
|
templateParameters: {
|
|
138
139
|
title: APP_CNAME,
|
|
139
140
|
mountRoot: APP_NAME,
|
|
@@ -142,8 +143,8 @@ export default defineConfig({
|
|
|
142
143
|
new rspack.CopyRspackPlugin({
|
|
143
144
|
patterns: [
|
|
144
145
|
{
|
|
145
|
-
from: path.resolveApp(
|
|
146
|
-
to:
|
|
146
|
+
from: path.resolveApp("./public/images"),
|
|
147
|
+
to: "public/images",
|
|
147
148
|
},
|
|
148
149
|
],
|
|
149
150
|
}),
|
|
@@ -165,11 +166,11 @@ export default defineConfig({
|
|
|
165
166
|
],
|
|
166
167
|
|
|
167
168
|
output: {
|
|
168
|
-
assetModuleFilename:
|
|
169
|
+
assetModuleFilename: "images/[hash][ext]",
|
|
169
170
|
library: `${APP_CNAME}-[name]`,
|
|
170
|
-
chunkFilename:
|
|
171
|
-
libraryTarget:
|
|
172
|
-
globalObject:
|
|
171
|
+
chunkFilename: "[name].[contenthash].js",
|
|
172
|
+
libraryTarget: "umd",
|
|
173
|
+
globalObject: "window",
|
|
173
174
|
chunkLoadingGlobal: `chunk_global_${APP_NAME}`,
|
|
174
175
|
publicPath: PUBLIC_PATH,
|
|
175
176
|
path: path.resolveApp(OUTPUT_PATH),
|
|
@@ -182,5 +183,5 @@ export default defineConfig({
|
|
|
182
183
|
},
|
|
183
184
|
],
|
|
184
185
|
|
|
185
|
-
devtool:
|
|
186
|
+
devtool: "source-map",
|
|
186
187
|
});
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import path from './paths.js';
|
|
6
|
-
import { sentryWebpackPlugin } from '@sentry/webpack-plugin';
|
|
1
|
+
import { merge } from "webpack-merge";
|
|
2
|
+
import { rspack } from "@rspack/core";
|
|
3
|
+
import baseConfig from "./rspack.config.mjs";
|
|
4
|
+
import path from "./paths.js";
|
|
7
5
|
|
|
8
6
|
export default merge(baseConfig, {
|
|
9
|
-
mode:
|
|
10
|
-
devtool:
|
|
7
|
+
mode: "production",
|
|
8
|
+
devtool: "hidden-source-map",
|
|
11
9
|
|
|
12
10
|
output: {
|
|
13
|
-
filename:
|
|
14
|
-
chunkFilename:
|
|
11
|
+
filename: "[name].[contenthash].bundle.js",
|
|
12
|
+
chunkFilename: "[name].[contenthash].chunk.js",
|
|
15
13
|
clean: true,
|
|
16
14
|
},
|
|
17
15
|
|
|
@@ -29,18 +27,18 @@ export default merge(baseConfig, {
|
|
|
29
27
|
loader: rspack.CssExtractRspackPlugin.loader,
|
|
30
28
|
},
|
|
31
29
|
{
|
|
32
|
-
loader:
|
|
30
|
+
loader: "css-loader",
|
|
33
31
|
options: {
|
|
34
32
|
sourceMap: true,
|
|
35
33
|
},
|
|
36
34
|
},
|
|
37
35
|
{
|
|
38
|
-
loader:
|
|
36
|
+
loader: "less-loader",
|
|
39
37
|
options: {
|
|
40
38
|
sourceMap: true,
|
|
41
39
|
lessOptions: {
|
|
42
40
|
strictMath: false,
|
|
43
|
-
math:
|
|
41
|
+
math: "always",
|
|
44
42
|
javascriptEnabled: true,
|
|
45
43
|
},
|
|
46
44
|
},
|
|
@@ -50,8 +48,8 @@ export default merge(baseConfig, {
|
|
|
50
48
|
// Less 处理 - 项目文件
|
|
51
49
|
{
|
|
52
50
|
test: /\.less$/,
|
|
53
|
-
include: [path.resolveApp(
|
|
54
|
-
exclude: [path.resolveApp(
|
|
51
|
+
include: [path.resolveApp("src")],
|
|
52
|
+
exclude: [path.resolveApp("node_modules")],
|
|
55
53
|
oneOf: [
|
|
56
54
|
{
|
|
57
55
|
test: /\.module\.less$/,
|
|
@@ -60,17 +58,17 @@ export default merge(baseConfig, {
|
|
|
60
58
|
loader: rspack.CssExtractRspackPlugin.loader,
|
|
61
59
|
},
|
|
62
60
|
{
|
|
63
|
-
loader:
|
|
61
|
+
loader: "css-loader",
|
|
64
62
|
options: {
|
|
65
63
|
sourceMap: true,
|
|
66
64
|
modules: {
|
|
67
|
-
localIdentName:
|
|
65
|
+
localIdentName: "[path][name]__[local]--[hash:base64:5]",
|
|
68
66
|
},
|
|
69
67
|
importLoaders: 2,
|
|
70
68
|
},
|
|
71
69
|
},
|
|
72
70
|
{
|
|
73
|
-
loader:
|
|
71
|
+
loader: "less-loader",
|
|
74
72
|
options: {
|
|
75
73
|
sourceMap: true,
|
|
76
74
|
lessOptions: {
|
|
@@ -86,13 +84,13 @@ export default merge(baseConfig, {
|
|
|
86
84
|
loader: rspack.CssExtractRspackPlugin.loader,
|
|
87
85
|
},
|
|
88
86
|
{
|
|
89
|
-
loader:
|
|
87
|
+
loader: "css-loader",
|
|
90
88
|
options: {
|
|
91
89
|
sourceMap: true,
|
|
92
90
|
},
|
|
93
91
|
},
|
|
94
92
|
{
|
|
95
|
-
loader:
|
|
93
|
+
loader: "less-loader",
|
|
96
94
|
options: {
|
|
97
95
|
sourceMap: true,
|
|
98
96
|
lessOptions: {
|
|
@@ -107,8 +105,8 @@ export default merge(baseConfig, {
|
|
|
107
105
|
// Sass 处理
|
|
108
106
|
{
|
|
109
107
|
test: /\.s[ac]ss$/i,
|
|
110
|
-
include: [path.resolveApp(
|
|
111
|
-
exclude: [path.resolveApp(
|
|
108
|
+
include: [path.resolveApp("src")],
|
|
109
|
+
exclude: [path.resolveApp("node_modules")],
|
|
112
110
|
oneOf: [
|
|
113
111
|
{
|
|
114
112
|
test: /\.module\.s[ac]ss$/,
|
|
@@ -117,21 +115,21 @@ export default merge(baseConfig, {
|
|
|
117
115
|
loader: rspack.CssExtractRspackPlugin.loader,
|
|
118
116
|
},
|
|
119
117
|
{
|
|
120
|
-
loader:
|
|
118
|
+
loader: "css-loader",
|
|
121
119
|
options: {
|
|
122
120
|
sourceMap: true,
|
|
123
121
|
modules: {
|
|
124
|
-
localIdentName:
|
|
122
|
+
localIdentName: "[path][name]__[local]--[hash:base64:5]",
|
|
125
123
|
},
|
|
126
124
|
importLoaders: 2,
|
|
127
125
|
},
|
|
128
126
|
},
|
|
129
127
|
{
|
|
130
|
-
loader:
|
|
128
|
+
loader: "sass-loader",
|
|
131
129
|
options: {
|
|
132
130
|
sourceMap: true,
|
|
133
131
|
sassOptions: {
|
|
134
|
-
outputStyle:
|
|
132
|
+
outputStyle: "compressed",
|
|
135
133
|
},
|
|
136
134
|
},
|
|
137
135
|
},
|
|
@@ -143,17 +141,17 @@ export default merge(baseConfig, {
|
|
|
143
141
|
loader: rspack.CssExtractRspackPlugin.loader,
|
|
144
142
|
},
|
|
145
143
|
{
|
|
146
|
-
loader:
|
|
144
|
+
loader: "css-loader",
|
|
147
145
|
options: {
|
|
148
146
|
sourceMap: true,
|
|
149
147
|
},
|
|
150
148
|
},
|
|
151
149
|
{
|
|
152
|
-
loader:
|
|
150
|
+
loader: "sass-loader",
|
|
153
151
|
options: {
|
|
154
152
|
sourceMap: true,
|
|
155
153
|
sassOptions: {
|
|
156
|
-
outputStyle:
|
|
154
|
+
outputStyle: "compressed",
|
|
157
155
|
},
|
|
158
156
|
},
|
|
159
157
|
},
|
|
@@ -164,26 +162,26 @@ export default merge(baseConfig, {
|
|
|
164
162
|
// CSS 处理 - TailwindCSS
|
|
165
163
|
{
|
|
166
164
|
test: /\.css$/,
|
|
167
|
-
include: [path.resolveApp(
|
|
165
|
+
include: [path.resolveApp("src/index.css")],
|
|
168
166
|
use: [
|
|
169
167
|
{
|
|
170
168
|
loader: rspack.CssExtractRspackPlugin.loader,
|
|
171
169
|
},
|
|
172
|
-
|
|
173
|
-
|
|
170
|
+
"css-loader",
|
|
171
|
+
"postcss-loader",
|
|
174
172
|
],
|
|
175
173
|
},
|
|
176
174
|
// CSS 处理 - src 目录中的其他 CSS
|
|
177
175
|
{
|
|
178
176
|
test: /\.css$/,
|
|
179
|
-
include: [path.resolveApp(
|
|
180
|
-
exclude: [path.resolveApp(
|
|
177
|
+
include: [path.resolveApp("src")],
|
|
178
|
+
exclude: [path.resolveApp("src/index.css")],
|
|
181
179
|
use: [
|
|
182
180
|
{
|
|
183
181
|
loader: rspack.CssExtractRspackPlugin.loader,
|
|
184
182
|
},
|
|
185
183
|
{
|
|
186
|
-
loader:
|
|
184
|
+
loader: "css-loader",
|
|
187
185
|
options: {
|
|
188
186
|
sourceMap: true,
|
|
189
187
|
},
|
|
@@ -193,13 +191,13 @@ export default merge(baseConfig, {
|
|
|
193
191
|
// CSS 处理 - node_modules
|
|
194
192
|
{
|
|
195
193
|
test: /\.css$/,
|
|
196
|
-
include: [path.resolveApp(
|
|
194
|
+
include: [path.resolveApp("node_modules")],
|
|
197
195
|
use: [
|
|
198
196
|
{
|
|
199
|
-
loader:
|
|
197
|
+
loader: "style-loader",
|
|
200
198
|
},
|
|
201
199
|
{
|
|
202
|
-
loader:
|
|
200
|
+
loader: "css-loader",
|
|
203
201
|
options: {
|
|
204
202
|
sourceMap: true,
|
|
205
203
|
},
|
|
@@ -211,41 +209,22 @@ export default merge(baseConfig, {
|
|
|
211
209
|
|
|
212
210
|
plugins: [
|
|
213
211
|
new rspack.CssExtractRspackPlugin({
|
|
214
|
-
filename:
|
|
215
|
-
chunkFilename:
|
|
212
|
+
filename: "[name].[contenthash:8].css",
|
|
213
|
+
chunkFilename: "[name].[contenthash:8].chunk.css",
|
|
216
214
|
}),
|
|
217
|
-
|
|
218
|
-
// Sentry 插件 (仅生产环境)
|
|
219
|
-
process.env.SENTRY_ENABLED === 'true' &&
|
|
220
|
-
process.env.SENTRY_AUTH_TOKEN &&
|
|
221
|
-
sentryWebpackPlugin({
|
|
222
|
-
org: process.env.SENTRY_ORG,
|
|
223
|
-
project: process.env.SENTRY_PROJECT,
|
|
224
|
-
authToken: process.env.SENTRY_AUTH_TOKEN,
|
|
225
|
-
url: process.env.SENTRY_URL,
|
|
226
|
-
errorHandler: () => false,
|
|
227
|
-
}),
|
|
228
|
-
].filter(Boolean),
|
|
215
|
+
],
|
|
229
216
|
|
|
230
217
|
optimization: {
|
|
231
218
|
minimize: true,
|
|
232
219
|
minimizer: [
|
|
233
220
|
new rspack.SwcJsMinimizerRspackPlugin({
|
|
234
|
-
exclude: [path.resolveApp(
|
|
221
|
+
exclude: [path.resolveApp("node_modules")],
|
|
235
222
|
minimizerOptions: {
|
|
236
223
|
compress: {
|
|
237
|
-
pure_funcs: [
|
|
224
|
+
pure_funcs: ["console.info", "console.debug", "console.warn"],
|
|
238
225
|
drop_console: false,
|
|
239
226
|
drop_debugger: false,
|
|
240
227
|
},
|
|
241
|
-
mangle: {
|
|
242
|
-
reserved: [
|
|
243
|
-
'Sentry',
|
|
244
|
-
'initSentry',
|
|
245
|
-
'captureException',
|
|
246
|
-
'captureMessage',
|
|
247
|
-
],
|
|
248
|
-
},
|
|
249
228
|
},
|
|
250
229
|
}),
|
|
251
230
|
new rspack.LightningCssMinimizerRspackPlugin(),
|