Merge branch 'cocos-main'

# Conflicts:
#	docker-conf/conf.d/nginx.conf
#	nginx.conf
#	scratch-blocks/build.py
#	scratch-blocks/cleanup.sh
#	scratch-blocks/i18n/create_messages.py
#	scratch-blocks/i18n/dedup_json.py
#	scratch-blocks/i18n/js_to_json.py
#	scratch-blocks/i18n/json_to_js.py
#	scratch-blocks/i18n/sync_tx_translations.js
#	scratch-blocks/i18n/xliff_to_json.py
#	scratch-blocks/local_build.sh
#	scratch-blocks/media/icons/control_forever.svg
#	scratch-blocks/media/icons/control_repeat.svg
#	scratch-blocks/media/icons/control_wait.svg
#	scratch-blocks/media/icons/event_broadcast_blue.svg
#	scratch-blocks/media/icons/event_broadcast_coral.svg
#	scratch-blocks/media/icons/event_broadcast_green.svg
#	scratch-blocks/media/icons/event_broadcast_magenta.svg
#	scratch-blocks/media/icons/event_broadcast_orange.svg
#	scratch-blocks/media/icons/event_broadcast_purple.svg
#	scratch-blocks/media/icons/event_when-broadcast-received_blue.svg
#	scratch-blocks/media/icons/event_when-broadcast-received_coral.svg
#	scratch-blocks/media/icons/event_when-broadcast-received_green.svg
#	scratch-blocks/media/icons/event_when-broadcast-received_magenta.svg
#	scratch-blocks/media/icons/event_when-broadcast-received_orange.svg
#	scratch-blocks/media/icons/event_when-broadcast-received_purple.svg
#	scratch-blocks/media/icons/event_whenflagclicked.svg
#	scratch-blocks/media/icons/set-led_blue.svg
#	scratch-blocks/media/icons/set-led_coral.svg
#	scratch-blocks/media/icons/set-led_green.svg
#	scratch-blocks/media/icons/set-led_magenta.svg
#	scratch-blocks/media/icons/set-led_mystery.svg
#	scratch-blocks/media/icons/set-led_orange.svg
#	scratch-blocks/media/icons/set-led_purple.svg
#	scratch-blocks/media/icons/set-led_white.svg
#	scratch-blocks/media/icons/set-led_yellow.svg
#	scratch-blocks/media/icons/wedo_motor-clockwise.svg
#	scratch-blocks/media/icons/wedo_motor-counterclockwise.svg
#	scratch-blocks/media/icons/wedo_when-distance_close.svg
#	scratch-blocks/media/icons/wedo_when-tilt-backward.svg
#	scratch-blocks/media/icons/wedo_when-tilt-forward.svg
#	scratch-blocks/media/icons/wedo_when-tilt-left.svg
#	scratch-blocks/media/icons/wedo_when-tilt-right.svg
#	scratch-blocks/media/icons/wedo_when-tilt.svg
#	scratch-blocks/package-lock.json
#	scratch-blocks/pull_from_blockly.sh
#	scratch-gui/competitio_login/index.html
#	scratch-gui/package-lock.json
#	scratch-gui/package.json
#	scratch-gui/prune-gh-pages.sh
#	scratch-gui/src/components/menu-bar/menu-bar.css
#	scratch-gui/src/components/menu-bar/menu-bar.jsx
#	scratch-gui/src/components/nopermission-modal/NoPermissionModal.jsx
#	scratch-gui/src/components/stage-cpp-unity/currentLevelChoose.jsx
#	scratch-gui/src/components/stage-cpp-unity/stage-unity.jsx
#	scratch-gui/src/components/stage-cpp/cpp-parser.js
#	scratch-gui/src/components/stage-cpp/stage-cpp-clang.jsx
#	scratch-gui/src/components/stage-cpp/stage-cpp.css
#	scratch-gui/src/components/stage-python-unity/currentLevelChoose.jsx
#	scratch-gui/src/components/stage-python-unity/stage-unity.jsx
#	scratch-gui/src/components/stage-python/stage-python.css
#	scratch-gui/src/components/stage-python/stage-python.jsx
#	scratch-gui/src/components/stage-unity/currentLevelChoose.jsx
#	scratch-gui/src/components/stage-unity/stage-unity.jsx
#	scratch-gui/src/lib/libraries/decks/steps/add-effects.es.png
#	scratch-gui/src/lib/libraries/decks/steps/animate-char-add-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/animate-char-change-color.es.png
#	scratch-gui/src/lib/libraries/decks/steps/animate-char-jump.es.png
#	scratch-gui/src/lib/libraries/decks/steps/animate-char-move.es.png
#	scratch-gui/src/lib/libraries/decks/steps/animate-char-say-something.es.png
#	scratch-gui/src/lib/libraries/decks/steps/animate-char-talk.es.png
#	scratch-gui/src/lib/libraries/decks/steps/change-size.es.png
#	scratch-gui/src/lib/libraries/decks/steps/chase-game-change-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/chase-game-move-randomly.es.png
#	scratch-gui/src/lib/libraries/decks/steps/chase-game-play-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/chase-game-right-left.es.png
#	scratch-gui/src/lib/libraries/decks/steps/chase-game-up-down.es.png
#	scratch-gui/src/lib/libraries/decks/steps/cn-backdrop.es.png
#	scratch-gui/src/lib/libraries/decks/steps/cn-collect.es.png
#	scratch-gui/src/lib/libraries/decks/steps/cn-glide.es.png
#	scratch-gui/src/lib/libraries/decks/steps/cn-say.es.png
#	scratch-gui/src/lib/libraries/decks/steps/cn-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-01-say-something.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-02-animate.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-03-select-different-character.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-04-use-minus-sign.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-05-grow-shrink.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-06-select-another-different-character.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-07-jump.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-08-change-scenes.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-09-glide-around.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-10-change-costumes.es.png
#	scratch-gui/src/lib/libraries/decks/steps/code-cartoon-11-choose-more-characters.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-choose-character.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-flying-heart.es.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-keep-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-make-interactive.es.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-move-scenery.es.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-object-to-collect.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-say-something.es.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-select-flyer.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/fly-switch-costume.es.png
#	scratch-gui/src/lib/libraries/decks/steps/glide-around-back-and-forth.es.png
#	scratch-gui/src/lib/libraries/decks/steps/glide-around-point.es.png
#	scratch-gui/src/lib/libraries/decks/steps/hide-show.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-change-costumes.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-choose-another-backdrop.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-choose-another-sprite.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-choose-any-sprite.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-choose-backdrop.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-choose-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-click-green-flag.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-fly-around.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-glide-to-point.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-grow-shrink.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-left-right.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-type-what-you-want.es.png
#	scratch-gui/src/lib/libraries/decks/steps/imagine-up-down.es.png
#	scratch-gui/src/lib/libraries/decks/steps/move-arrow-keys-left-right.es.png
#	scratch-gui/src/lib/libraries/decks/steps/move-arrow-keys-up-down.es.png
#	scratch-gui/src/lib/libraries/decks/steps/music-make-beat.es.png
#	scratch-gui/src/lib/libraries/decks/steps/music-make-beatbox.es.png
#	scratch-gui/src/lib/libraries/decks/steps/music-make-song.es.png
#	scratch-gui/src/lib/libraries/decks/steps/music-play-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/name-change-color.es.png
#	scratch-gui/src/lib/libraries/decks/steps/name-grow.es.png
#	scratch-gui/src/lib/libraries/decks/steps/name-play-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/name-spin.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-add-backdrop.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-add-ball-sprite.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-add-code-to-ball.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-bounce-around.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-choose-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-game-over.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-insert-change-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-move-the-paddle.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-reset-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pong-select-ball.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/pop-game-change-color.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pop-game-change-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pop-game-play-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pop-game-random-position.es.png
#	scratch-gui/src/lib/libraries/decks/steps/pop-game-reset-score.es.png
#	scratch-gui/src/lib/libraries/decks/steps/record-a-sound-choose-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/record-a-sound-click-record.es.png
#	scratch-gui/src/lib/libraries/decks/steps/record-a-sound-play-your-sound.es.png
#	scratch-gui/src/lib/libraries/decks/steps/record-a-sound-press-record-button.es.png
#	scratch-gui/src/lib/libraries/decks/steps/record-a-sound-sounds-tab.es.png
#	scratch-gui/src/lib/libraries/decks/steps/speech-change-color.es.png
#	scratch-gui/src/lib/libraries/decks/steps/speech-grow-shrink.es.png
#	scratch-gui/src/lib/libraries/decks/steps/speech-move-around.es.png
#	scratch-gui/src/lib/libraries/decks/steps/speech-say-something.es.png
#	scratch-gui/src/lib/libraries/decks/steps/speech-set-voice.es.png
#	scratch-gui/src/lib/libraries/decks/steps/speech-song.es.png
#	scratch-gui/src/lib/libraries/decks/steps/speech-spin.es.png
#	scratch-gui/src/lib/libraries/decks/steps/spin-point-in-direction.es.png
#	scratch-gui/src/lib/libraries/decks/steps/spin-turn.es.png
#	scratch-gui/src/lib/libraries/decks/steps/story-conversation.es.png
#	scratch-gui/src/lib/libraries/decks/steps/story-hide-character.es.png
#	scratch-gui/src/lib/libraries/decks/steps/story-say-something.es.png
#	scratch-gui/src/lib/libraries/decks/steps/story-show-character.es.png
#	scratch-gui/src/lib/libraries/decks/steps/story-switch-backdrop.es.png
#	scratch-gui/src/lib/libraries/decks/steps/switch-costumes.es.png
#	scratch-gui/src/lib/libraries/decks/steps/talking-10-choose-third-backdrop.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/talking-12-dance-moves.es.png
#	scratch-gui/src/lib/libraries/decks/steps/talking-2-choose-sprite.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/talking-4-choose-backdrop.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/talking-6-choose-another-sprite.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/talking-7-move-around.es.png
#	scratch-gui/src/lib/libraries/decks/steps/talking-8-choose-another-backdrop.LTR.png
#	scratch-gui/src/lib/libraries/decks/steps/video-animate.es.png
#	scratch-gui/src/lib/libraries/decks/steps/video-pet.es.png
#	scratch-gui/src/lib/libraries/decks/steps/video-pop.es.png
#	scratch-gui/src/playground/aboutus.ejs
#	scratch-gui/src/playground/checkStatus.js
#	scratch-gui/src/playground/competition.ejs
#	scratch-gui/src/playground/competition.js
#	scratch-gui/src/playground/competition_list.ejs
#	scratch-gui/src/playground/competition_list.js
#	scratch-gui/src/playground/competition_sum.ejs
#	scratch-gui/src/playground/competition_sum.js
#	scratch-gui/src/playground/config.js
#	scratch-gui/src/playground/home.ejs
#	scratch-gui/src/playground/import-check.js
#	scratch-gui/src/playground/leaderboard.ejs
#	scratch-gui/src/playground/login-new.ejs
#	scratch-gui/src/playground/login.ejs
#	scratch-gui/src/playground/login.js
#	scratch-gui/src/playground/matchsum.js
#	scratch-gui/src/playground/programming-learning.ejs
#	scratch-gui/src/playground/programming-learning.js
#	scratch-gui/src/playground/signup-new.ejs
#	scratch-gui/src/playground/third-part-login.js
#	scratch-gui/src/playground/welcome.ejs
#	scratch-gui/src/playground/welcome.js
#	scratch-gui/static/css/welcome-new.css
#	scratch-gui/static/pyodide/pyodide.asm.wasm.br
#	scratch-gui/static/unity/Build/mstest5.data.br
#	scratch-gui/static/unity/Build/mstest5.framework.js.br
#	scratch-gui/static/unity/Build/mstest5.loader.js
#	scratch-gui/static/unity/Build/mstest5.wasm.br
#	scratch-gui/static/unity/StreamingAssets/aa/AddressablesLink/link.xml
#	scratch-gui/static/unity/StreamingAssets/aa/catalog.json
#	scratch-gui/static/unity/StreamingAssets/aa/settings.json
#	scratch-gui/webpack.config.js
#	scratch-l10n/scripts/build-data.js
#	scratch-l10n/scripts/build-i18n-src.js
#	scratch-l10n/scripts/tw-push.js
#	scratch-l10n/scripts/tx-pull-help-articles.js
#	scratch-l10n/scripts/tx-pull-help-names.js
#	scratch-l10n/scripts/tx-pull-locale-articles.js
#	scratch-l10n/scripts/tx-pull-www.js
#	scratch-l10n/scripts/tx-push-help.js
#	scratch-l10n/scripts/tx-push-src.js
#	scratch-l10n/scripts/update-translations.sh
#	scratch-l10n/scripts/validate-www.js
#	scratch-vm/package-lock.json
#	scratch-vm/src/extensions/scratch3_music/assets/instruments/11-saxophone/36.mp3
#	scratch-vm/src/extensions/scratch3_music/assets/instruments/11-saxophone/60.mp3
#	scratch-vm/src/extensions/scratch3_music/assets/instruments/11-saxophone/84.mp3
#	scratch-vm/src/extensions/scratch3_music/assets/instruments/5-electric-guitar/60.mp3
#	scratch-vm/test/fixtures/sprite.json
This commit is contained in:
Evan
2026-09-07 11:35:22 +08:00
206 changed files with 21799 additions and 437 deletions

View File

@@ -28,12 +28,29 @@ if (root.length > 0 && !root.endsWith('/')) {
throw new Error('If ROOT is defined, it must have a trailing slash.');
}
function readConfigQuotedValue(key, fallback) {
const src = fs.readFileSync(path.join(__dirname, 'src/playground/config.js'), 'utf8');
let value = fallback;
src.split(/\r?\n/).forEach((line) => {
const trimmed = line.trim();
if (trimmed.startsWith('//')) return;
const match = trimmed.match(new RegExp(key + '\\s*:\\s*["\']([^"\']+)["\']'));
if (match) value = match[1];
});
return value;
}
const DATA_SERVER_BASE_URL = readConfigQuotedValue('DataServerBaseUrl', 'https://test-service.001code.cn');
const AI_COURSE_OSS_BASE = readConfigQuotedValue('aiCourseOssBase', 'https://oss.001code.cn/ai_courses');
console.log('[webpack] DataServerBaseUrl =', DATA_SERVER_BASE_URL);
const version = "2025071401";
const htmlWebpackPluginCommon = {
root: root,
meta: JSON.parse(process.env.EXTRA_META || '{}'),
APP_NAME,
version: version, // 使用时间戳作为版本号
dataServerBaseUrl: DATA_SERVER_BASE_URL,
aiCourseOssBase: AI_COURSE_OSS_BASE,
minify: process.env.NODE_ENV === 'production' ? {
collapseWhitespace: true,
removeComments: true,
@@ -85,6 +102,16 @@ const base = {
{ from: /^\/competition-groups\/?$/, to: '/competition-groups.html' },
{ from: /^\/sichuan-chongqing-competition\/?$/, to: '/sichuan-chongqing-competition.html' },
{ from: /^\/aboutus\/?$/, to: '/aboutus.html' },
{ from: /^\/ai\/?$/, to: '/ai.html' },
{ from: /^\/coming-soon\/?$/, to: '/coming-soon.html' },
{ from: /^\/ai-text\/?$/, to: '/ai-text.html' },
{ from: /^\/ai-draw\/?$/, to: '/ai-draw.html' },
{ from: /^\/ai-huiben\/?$/, to: '/ai-huiben.html' },
{ from: /^\/ai-voice\/?$/, to: '/ai-voice.html' },
{ from: /^\/ai-video\/?$/, to: '/ai-video.html' },
{ from: /^\/ai-music\/?$/, to: '/ai-music.html' },
{ from: /^\/works-plaza\/?$/, to: '/works-plaza.html' },
{ from: /^\/course-detail\/?$/, to: '/course-detail.html' },
{ from: /^\/home\/?$/, to: '/home.html' },
{ from: /^\/home-laoshan\/?$/, to: '/competition-scssn-laoshan.html' }, //崂山赛事定制
{ from: /^\/aicoding-groups-laoshan\/?$/, to: '/competition-groups-laoshan.html' },
@@ -257,14 +284,17 @@ module.exports = [
'signup': '/src/playground/signup.js',
'matchsum': ['./src/playground/checkStatus.js', '/src/playground/matchsum.js', './src/playground/auth.js'],
'app-target': './src/playground/app-target.js', // 确保全局入口文件被包含
'welcome': ['./src/playground/checkStatus.js', './src/playground/welcome.js', './src/playground/auth.js'],
'welcome': ['./src/playground/welcome.js', './src/playground/auth.js'],
'programming-learning': ['./src/playground/checkStatus.js', './src/playground/programming-learning.js', './src/playground/auth.js'],
'competition_sum': ['./src/playground/checkcompetitionStatus.js', './src/playground/competition_sum.js', './src/playground/auth.js'],
'competition': ['./src/playground/competition.js'],
'competition_list': ['./src/playground/competition_list.js'],
// 'onegame': ['./src/playground/import-check.js', './src/playground/onegame.js']
'third-part-login': ['./src/playground/third-part-login.js'],
'leaderboard': './src/playground/leaderboard.js'
'leaderboard': './src/playground/leaderboard.js',
'home': './src/playground/home.js',
// AI 静态页与 login 共用 config.js避免只烘焙启动时的旧地址
'aiConfig': './src/playground/ai-config.js'
},
output: {
path: path.resolve(__dirname, 'build')
@@ -372,6 +402,25 @@ module.exports = [
'process.env.ROOT': JSON.stringify(root),
'process.env.ROUTING_STYLE': JSON.stringify(process.env.ROUTING_STYLE || 'filehash')
}),
{
apply: function (compiler) {
compiler.hooks.compilation.tap('SyncDataServerBaseUrl', function (compilation) {
var hooks = HtmlWebpackPlugin.getHooks && HtmlWebpackPlugin.getHooks(compilation);
if (!hooks || !hooks.beforeHtmlGeneration) return;
hooks.beforeHtmlGeneration.tap('SyncDataServerBaseUrl', function (data) {
data.plugin.options.dataServerBaseUrl = readConfigQuotedValue(
'DataServerBaseUrl',
data.plugin.options.dataServerBaseUrl || DATA_SERVER_BASE_URL
);
data.plugin.options.aiCourseOssBase = readConfigQuotedValue(
'aiCourseOssBase',
data.plugin.options.aiCourseOssBase || AI_COURSE_OSS_BASE
);
return data;
});
});
}
},
new HtmlWebpackPlugin({
chunks: ['editor'],
template: 'src/playground/index.ejs',
@@ -448,6 +497,14 @@ module.exports = [
}
]
}),
new CopyWebpackPlugin({
patterns: [
{
from: 'static',
to: ''
}
]
}),
new HtmlWebpackPlugin({
chunks: ['login'],
template: 'src/playground/login-new.ejs', // 新创建的 EJS 文件
@@ -594,7 +651,7 @@ module.exports = [
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['import-check', 'welcome'],
chunks: ['welcome'],
template: 'src/playground/welcome.ejs',
filename: 'welcome.html',
title: `Welcome - ${APP_NAME}`,
@@ -622,7 +679,97 @@ module.exports = [
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['import-check', 'home'],
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/ai.ejs',
filename: 'ai.html',
title: `灵丌AI - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/course-detail.ejs',
filename: 'course-detail.html',
title: `课程详情 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/coming-soon.ejs',
filename: 'coming-soon.html',
title: `即将上线 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/ai-text.ejs',
filename: 'ai-text.html',
title: `AI文本 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/ai-draw.ejs',
filename: 'ai-draw.html',
title: `AI绘图 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/ai-huiben.ejs',
filename: 'ai-huiben.html',
title: `AI绘本 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/ai-voice.ejs',
filename: 'ai-voice.html',
title: `AI语音 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/ai-video.ejs',
filename: 'ai-video.html',
title: `AI视频 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/ai-music.ejs',
filename: 'ai-music.html',
title: `AI音乐 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['aiConfig'],
inject: 'head',
scriptLoading: 'blocking',
template: 'src/playground/works-plaza.ejs',
filename: 'works-plaza.html',
title: `作品广场 - ${APP_NAME}`,
...htmlWebpackPluginCommon
}),
new HtmlWebpackPlugin({
chunks: ['home'],
template: 'src/playground/home.ejs',
filename: 'home.html',
title: `home - ${APP_NAME}`,