@lark-apaas/fullstack-rspack-preset 1.0.20-alpha.1 → 1.0.20-alpha.app.2
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/lib/preset.js
CHANGED
|
@@ -12,6 +12,7 @@ const dev_server_listener_1 = require("./utils/dev-server-listener");
|
|
|
12
12
|
const route_parser_plugin_1 = __importDefault(require("./rspack-plugins/route-parser-plugin"));
|
|
13
13
|
const slardar_performance_monitor_plugin_1 = __importDefault(require("./rspack-plugins/slardar-performance-monitor-plugin"));
|
|
14
14
|
const view_context_injection_plugin_1 = __importDefault(require("./rspack-plugins/view-context-injection-plugin"));
|
|
15
|
+
const og_meta_injection_plugin_1 = __importDefault(require("./rspack-plugins/og-meta-injection-plugin"));
|
|
15
16
|
const dev_server_snapdom_proxy_1 = require("./utils/dev-server-snapdom-proxy");
|
|
16
17
|
function createRecommendRspackConfig(options) {
|
|
17
18
|
const { isDev = true, enableReactRefresh = isDev, needRoutes = true, clientBasePath = '', publicPath = '', // 静态资源路径
|
|
@@ -163,6 +164,8 @@ function createRecommendRspackConfig(options) {
|
|
|
163
164
|
new slardar_performance_monitor_plugin_1.default(),
|
|
164
165
|
// 视图上下文注入插件
|
|
165
166
|
new view_context_injection_plugin_1.default(),
|
|
167
|
+
// OG Meta 标签注入插件
|
|
168
|
+
new og_meta_injection_plugin_1.default(),
|
|
166
169
|
// 开发环境下,解析路由
|
|
167
170
|
isDev && needRoutes &&
|
|
168
171
|
new route_parser_plugin_1.default({
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface OgMetaInjectionPluginOptions {
|
|
2
|
+
customTags?: Array<{
|
|
3
|
+
property: string;
|
|
4
|
+
placeholder: string;
|
|
5
|
+
}>;
|
|
6
|
+
titlePlaceholder?: string;
|
|
7
|
+
faviconPlaceholder?: string;
|
|
8
|
+
}
|
|
9
|
+
declare class OgMetaInjectionPlugin {
|
|
10
|
+
private options;
|
|
11
|
+
private defaultOgTags;
|
|
12
|
+
private defaultTitlePlaceholder;
|
|
13
|
+
private defaultFaviconPlaceholder;
|
|
14
|
+
constructor(options?: OgMetaInjectionPluginOptions);
|
|
15
|
+
apply(compiler: any): void;
|
|
16
|
+
}
|
|
17
|
+
export default OgMetaInjectionPlugin;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class OgMetaInjectionPlugin {
|
|
4
|
+
constructor(options) {
|
|
5
|
+
// 默认需要处理的 OG 标签配置
|
|
6
|
+
this.defaultOgTags = [
|
|
7
|
+
{ property: 'og:title', placeholder: '{{appName}}' },
|
|
8
|
+
{ property: 'og:description', placeholder: '{{appDescription}}' },
|
|
9
|
+
{ property: 'og:image', placeholder: '{{appAvatar}}' },
|
|
10
|
+
{ property: 'og:url', placeholder: '{{currentUrl}}' },
|
|
11
|
+
];
|
|
12
|
+
// 默认 title 占位符
|
|
13
|
+
this.defaultTitlePlaceholder = '{{appName}}';
|
|
14
|
+
// 默认 favicon 占位符
|
|
15
|
+
this.defaultFaviconPlaceholder = '{{appAvatar}}';
|
|
16
|
+
this.options = options || {};
|
|
17
|
+
}
|
|
18
|
+
apply(compiler) {
|
|
19
|
+
compiler.hooks.compilation.tap('OgMetaInjectionPlugin', (compilation) => {
|
|
20
|
+
try {
|
|
21
|
+
// 从 compiler.webpack 或 compiler.rspack 获取 HtmlRspackPlugin
|
|
22
|
+
// 这样可以避免在 npm link 环境下的模块解析问题
|
|
23
|
+
let HtmlPlugin;
|
|
24
|
+
try {
|
|
25
|
+
// 尝试从 compiler 中获取 rspack
|
|
26
|
+
const rspack = compiler.webpack || compiler.rspack || compiler.constructor.webpack;
|
|
27
|
+
if (rspack && rspack.HtmlRspackPlugin) {
|
|
28
|
+
HtmlPlugin = rspack.HtmlRspackPlugin;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// 降级到 require,但这在 npm link 下可能失败
|
|
32
|
+
try {
|
|
33
|
+
HtmlPlugin = require('html-webpack-plugin');
|
|
34
|
+
}
|
|
35
|
+
catch (e2) {
|
|
36
|
+
console.warn('OgMetaInjectionPlugin: HtmlRspackPlugin not found');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
console.warn('OgMetaInjectionPlugin: Failed to get HtmlRspackPlugin');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const hooks = HtmlPlugin.getHooks(compilation);
|
|
46
|
+
// 使用 beforeEmit 钩子,在 HTML 字符串层面操作
|
|
47
|
+
hooks.beforeEmit.tapAsync('OgMetaInjectionPlugin', (data, callback) => {
|
|
48
|
+
try {
|
|
49
|
+
let html = data.html;
|
|
50
|
+
// 1. 处理 OG Meta 标签
|
|
51
|
+
const ogTags = this.options.customTags || this.defaultOgTags;
|
|
52
|
+
ogTags.forEach(({ property, placeholder }) => {
|
|
53
|
+
// 转义特殊字符,避免正则表达式错误
|
|
54
|
+
const escapedProperty = property.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
55
|
+
// 检查是否存在该 property 的 meta 标签
|
|
56
|
+
const metaRegex = new RegExp(`<meta\\s+[^>]*property=["']?${escapedProperty}["']?[^>]*>`, 'i');
|
|
57
|
+
if (metaRegex.test(html)) {
|
|
58
|
+
// 如果存在,替换其 content 为占位符
|
|
59
|
+
const replaceRegex = new RegExp(`(<meta\\s+[^>]*property=["']?${escapedProperty}["']?[^>]*content=)["'][^"']*["']([^>]*>)`, 'gi');
|
|
60
|
+
html = html.replace(replaceRegex, `$1"${placeholder}"$2`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// 如果不存在,在 </head> 前插入新标签
|
|
64
|
+
const newMetaTag = `\n <meta property="${property}" content="${placeholder}">`;
|
|
65
|
+
html = html.replace('</head>', `${newMetaTag}\n </head>`);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// 2. 处理 <title> 标签
|
|
69
|
+
const titlePlaceholder = this.options.titlePlaceholder || this.defaultTitlePlaceholder;
|
|
70
|
+
const titleRegex = /<title>[^<]*<\/title>/i;
|
|
71
|
+
if (titleRegex.test(html)) {
|
|
72
|
+
// 如果存在 title 标签,替换其内容
|
|
73
|
+
html = html.replace(/<title>[^<]*<\/title>/gi, `<title>${titlePlaceholder}</title>`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// 如果不存在,在 </head> 前插入
|
|
77
|
+
const newTitleTag = `\n <title>${titlePlaceholder}</title>`;
|
|
78
|
+
html = html.replace('</head>', `${newTitleTag}\n </head>`);
|
|
79
|
+
}
|
|
80
|
+
// 3. 处理 <link rel="icon"> 标签
|
|
81
|
+
const faviconPlaceholder = this.options.faviconPlaceholder || this.defaultFaviconPlaceholder;
|
|
82
|
+
const iconRegex = /<link\s+[^>]*rel=["']?(?:icon|shortcut icon)["']?[^>]*>/i;
|
|
83
|
+
if (iconRegex.test(html)) {
|
|
84
|
+
// 如果存在 icon 标签,替换其 href
|
|
85
|
+
const replaceIconRegex = /(<link\s+[^>]*rel=["']?(?:icon|shortcut icon)["']?[^>]*href=)["'][^"']*["']([^>]*>)/gi;
|
|
86
|
+
html = html.replace(replaceIconRegex, `$1"${faviconPlaceholder}"$2`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// 如果不存在,在 </head> 前插入
|
|
90
|
+
const newIconTag = `\n <link rel="icon" href="${faviconPlaceholder}">`;
|
|
91
|
+
html = html.replace('</head>', `${newIconTag}\n </head>`);
|
|
92
|
+
}
|
|
93
|
+
data.html = html;
|
|
94
|
+
callback(null, data);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error('Error in OgMetaInjectionPlugin:', error);
|
|
98
|
+
callback(error);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('Error in OgMetaInjectionPlugin:', error);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.default = OgMetaInjectionPlugin;
|
|
@@ -70,5 +70,13 @@ function getViewContextScriptContent() {
|
|
|
70
70
|
window.userId = "{{userId}}";
|
|
71
71
|
window.tenantId = "{{tenantId}}";
|
|
72
72
|
window.appId = "{{appId}}";
|
|
73
|
+
const appInfo = {
|
|
74
|
+
name: "{{appName}}",
|
|
75
|
+
avatar: "{{appAvatar}}",
|
|
76
|
+
description: "{{appDescription}}",
|
|
77
|
+
};
|
|
78
|
+
if (appInfo.name) {
|
|
79
|
+
window._appInfo = appInfo;
|
|
80
|
+
}
|
|
73
81
|
`;
|
|
74
82
|
}
|
package/package.json
CHANGED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"themeName": "UD Theme Style",
|
|
4
|
-
"theme": {
|
|
5
|
-
"seriesCnt": "6",
|
|
6
|
-
"backgroundColor": "rgba(0,0,0,0)",
|
|
7
|
-
"titleColor": "#1f2329",
|
|
8
|
-
"subtitleColor": "#8f959e",
|
|
9
|
-
"textColorShow": false,
|
|
10
|
-
"textColor": "#333",
|
|
11
|
-
"markTextColor": "#ffffff",
|
|
12
|
-
"color": [
|
|
13
|
-
"#3370eb",
|
|
14
|
-
"#1bcebf",
|
|
15
|
-
"#ffc60a",
|
|
16
|
-
"#ed6d0c",
|
|
17
|
-
"#dca1e4",
|
|
18
|
-
"#25b2e5",
|
|
19
|
-
"#6dcdeb",
|
|
20
|
-
"#288fcb",
|
|
21
|
-
"#94b5f5",
|
|
22
|
-
"#8f61d1",
|
|
23
|
-
"#8f61d1",
|
|
24
|
-
"#bf78e9",
|
|
25
|
-
"#008280",
|
|
26
|
-
"#27ad8e",
|
|
27
|
-
"#7bc335"
|
|
28
|
-
],
|
|
29
|
-
"borderColor": "#dee0e3",
|
|
30
|
-
"borderWidth": 0,
|
|
31
|
-
"visualMapColor": ["#25b2e5", "#6dcdeb", "#288fcb"],
|
|
32
|
-
"legendTextColor": "#8f959e",
|
|
33
|
-
"kColor": "#fdc6c4",
|
|
34
|
-
"kColor0": "transparent",
|
|
35
|
-
"kBorderColor": "#f54a45",
|
|
36
|
-
"kBorderColor0": "#32a645",
|
|
37
|
-
"kBorderWidth": "2",
|
|
38
|
-
"lineWidth": "1",
|
|
39
|
-
"symbolSize": "6",
|
|
40
|
-
"symbol": "emptyCircle",
|
|
41
|
-
"symbolBorderWidth": "1",
|
|
42
|
-
"lineSmooth": true,
|
|
43
|
-
"graphLineWidth": 1,
|
|
44
|
-
"graphLineColor": "#dee0e3",
|
|
45
|
-
"mapLabelColor": "#000",
|
|
46
|
-
"mapLabelColorE": "#516b91",
|
|
47
|
-
"mapBorderColor": "#516b91",
|
|
48
|
-
"mapBorderColorE": "#516b91",
|
|
49
|
-
"mapBorderWidth": 0.5,
|
|
50
|
-
"mapBorderWidthE": 1,
|
|
51
|
-
"mapAreaColor": "#f3f3f3",
|
|
52
|
-
"mapAreaColorE": "#a5e7f0",
|
|
53
|
-
"axes": [
|
|
54
|
-
{
|
|
55
|
-
"type": "all",
|
|
56
|
-
"name": "通用坐标轴",
|
|
57
|
-
"axisLineShow": true,
|
|
58
|
-
"axisLineColor": "#dee0e3",
|
|
59
|
-
"axisTickShow": false,
|
|
60
|
-
"axisTickColor": "#333",
|
|
61
|
-
"axisLabelShow": true,
|
|
62
|
-
"axisLabelColor": "#8f959e",
|
|
63
|
-
"splitLineShow": true,
|
|
64
|
-
"splitLineColor": ["#dee0e3"],
|
|
65
|
-
"splitAreaShow": false,
|
|
66
|
-
"splitAreaColor": ["rgba(250,250,250,0.05)", "rgba(200,200,200,0.02)"]
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
"type": "category",
|
|
70
|
-
"name": "类目坐标轴",
|
|
71
|
-
"axisLineShow": true,
|
|
72
|
-
"axisLineColor": "#333",
|
|
73
|
-
"axisTickShow": true,
|
|
74
|
-
"axisTickColor": "#333",
|
|
75
|
-
"axisLabelShow": true,
|
|
76
|
-
"axisLabelColor": "#333",
|
|
77
|
-
"splitLineShow": false,
|
|
78
|
-
"splitLineColor": ["#ccc"],
|
|
79
|
-
"splitAreaShow": false,
|
|
80
|
-
"splitAreaColor": ["rgba(250,250,250,0.3)", "rgba(200,200,200,0.3)"]
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"type": "value",
|
|
84
|
-
"name": "数值坐标轴",
|
|
85
|
-
"axisLineShow": true,
|
|
86
|
-
"axisLineColor": "#333",
|
|
87
|
-
"axisTickShow": true,
|
|
88
|
-
"axisTickColor": "#333",
|
|
89
|
-
"axisLabelShow": true,
|
|
90
|
-
"axisLabelColor": "#333",
|
|
91
|
-
"splitLineShow": true,
|
|
92
|
-
"splitLineColor": ["#ccc"],
|
|
93
|
-
"splitAreaShow": false,
|
|
94
|
-
"splitAreaColor": ["rgba(250,250,250,0.3)", "rgba(200,200,200,0.3)"]
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
"type": "log",
|
|
98
|
-
"name": "对数坐标轴",
|
|
99
|
-
"axisLineShow": true,
|
|
100
|
-
"axisLineColor": "#333",
|
|
101
|
-
"axisTickShow": true,
|
|
102
|
-
"axisTickColor": "#333",
|
|
103
|
-
"axisLabelShow": true,
|
|
104
|
-
"axisLabelColor": "#333",
|
|
105
|
-
"splitLineShow": true,
|
|
106
|
-
"splitLineColor": ["#ccc"],
|
|
107
|
-
"splitAreaShow": false,
|
|
108
|
-
"splitAreaColor": ["rgba(250,250,250,0.3)", "rgba(200,200,200,0.3)"]
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"type": "time",
|
|
112
|
-
"name": "时间坐标轴",
|
|
113
|
-
"axisLineShow": true,
|
|
114
|
-
"axisLineColor": "#333",
|
|
115
|
-
"axisTickShow": true,
|
|
116
|
-
"axisTickColor": "#333",
|
|
117
|
-
"axisLabelShow": true,
|
|
118
|
-
"axisLabelColor": "#333",
|
|
119
|
-
"splitLineShow": true,
|
|
120
|
-
"splitLineColor": ["#ccc"],
|
|
121
|
-
"splitAreaShow": false,
|
|
122
|
-
"splitAreaColor": ["rgba(250,250,250,0.3)", "rgba(200,200,200,0.3)"]
|
|
123
|
-
}
|
|
124
|
-
],
|
|
125
|
-
"axisSeperateSetting": false,
|
|
126
|
-
"toolboxColor": "#8f959e",
|
|
127
|
-
"toolboxEmphasisColor": "#1f2329",
|
|
128
|
-
"tooltipAxisColor": "#dee0e3",
|
|
129
|
-
"tooltipAxisWidth": 1,
|
|
130
|
-
"timelineLineColor": "#336df4",
|
|
131
|
-
"timelineLineWidth": "-1",
|
|
132
|
-
"timelineItemColor": "#336df4",
|
|
133
|
-
"timelineItemColorE": "#1456f0",
|
|
134
|
-
"timelineCheckColor": "#1456f0",
|
|
135
|
-
"timelineCheckBorderColor": "#94b4ff",
|
|
136
|
-
"timelineItemBorderWidth": "0.5",
|
|
137
|
-
"timelineControlColor": "#336df4",
|
|
138
|
-
"timelineControlBorderColor": "#336df4",
|
|
139
|
-
"timelineControlBorderWidth": 0.5,
|
|
140
|
-
"timelineLabelColor": "#8f959e",
|
|
141
|
-
"datazoomBackgroundColor": "rgba(0,0,0,0)",
|
|
142
|
-
"datazoomDataColor": "rgba(255,255,255,0.3)",
|
|
143
|
-
"datazoomFillColor": "rgba(167,183,204,0.4)",
|
|
144
|
-
"datazoomHandleColor": "#a7b7cc",
|
|
145
|
-
"datazoomHandleWidth": "100",
|
|
146
|
-
"datazoomLabelColor": "#333"
|
|
147
|
-
}
|
|
148
|
-
}
|