chore: adjust webpack output (#11573)

- automatically split i18n resources into i18n-langs.{lang} naming
- force worker resources to be bundled in one file
This commit is contained in:
forehalo
2025-04-10 01:48:28 +00:00
parent 1bd31b67cd
commit cdbcb8a42a
3 changed files with 37 additions and 23 deletions

View File

@@ -45,122 +45,120 @@ export const SUPPORTED_LANGUAGES: Record<
name: 'Korean (South Korea)', name: 'Korean (South Korea)',
originalName: '한국어(대한민국)', originalName: '한국어(대한민국)',
flagEmoji: '🇰🇷', flagEmoji: '🇰🇷',
resource: () => /* webpackChunkName "i18n-ko" */ import('./ko.json'), resource: () => import('./ko.json'),
}, },
'pt-BR': { 'pt-BR': {
name: 'Portuguese (Brazil)', name: 'Portuguese (Brazil)',
originalName: 'português (Brasil)', originalName: 'português (Brasil)',
flagEmoji: '🇧🇷', flagEmoji: '🇧🇷',
resource: () => /* webpackChunkName "i18n-pt_BR" */ import('./pt-BR.json'), resource: () => import('./pt-BR.json'),
}, },
'zh-Hans': { 'zh-Hans': {
name: 'Simplified Chinese', name: 'Simplified Chinese',
originalName: '简体中文', originalName: '简体中文',
flagEmoji: '🇨🇳', flagEmoji: '🇨🇳',
resource: () => resource: () => import('./zh-Hans.json'),
/* webpackChunkName "i18n-zh_Hans" */ import('./zh-Hans.json'),
}, },
'zh-Hant': { 'zh-Hant': {
name: 'Traditional Chinese', name: 'Traditional Chinese',
originalName: '繁體中文', originalName: '繁體中文',
flagEmoji: '🇭🇰', flagEmoji: '🇭🇰',
resource: () => resource: () => import('./zh-Hant.json'),
/* webpackChunkName "i18n-zh_Hant" */ import('./zh-Hant.json'),
}, },
fr: { fr: {
name: 'French', name: 'French',
originalName: 'français', originalName: 'français',
flagEmoji: '🇫🇷', flagEmoji: '🇫🇷',
resource: () => /* webpackChunkName "i18n-fr" */ import('./fr.json'), resource: () => import('./fr.json'),
}, },
es: { es: {
name: 'Spanish', name: 'Spanish',
originalName: 'español', originalName: 'español',
flagEmoji: '🇪🇸', flagEmoji: '🇪🇸',
resource: () => /* webpackChunkName "i18n-es" */ import('./es.json'), resource: () => import('./es.json'),
}, },
'es-AR': { 'es-AR': {
name: 'Spanish (Argentina)', name: 'Spanish (Argentina)',
originalName: 'español (Argentina)', originalName: 'español (Argentina)',
flagEmoji: '🇦🇷', flagEmoji: '🇦🇷',
resource: () => /* webpackChunkName "i18n-es_AR" */ import('./es-AR.json'), resource: () => import('./es-AR.json'),
}, },
'es-CL': { 'es-CL': {
name: 'Spanish (Chile)', name: 'Spanish (Chile)',
originalName: 'español (Chile)', originalName: 'español (Chile)',
flagEmoji: '🇨🇱', flagEmoji: '🇨🇱',
resource: () => /* webpackChunkName "i18n-es_CL" */ import('./es-CL.json'), resource: () => import('./es-CL.json'),
}, },
de: { de: {
name: 'German', name: 'German',
originalName: 'Deutsch', originalName: 'Deutsch',
flagEmoji: '🇩🇪', flagEmoji: '🇩🇪',
resource: () => /* webpackChunkName "i18n-de" */ import('./de.json'), resource: () => import('./de.json'),
}, },
ru: { ru: {
name: 'Russian', name: 'Russian',
originalName: 'русский', originalName: 'русский',
flagEmoji: '🇷🇺', flagEmoji: '🇷🇺',
resource: () => /* webpackChunkName "i18n-ru" */ import('./ru.json'), resource: () => import('./ru.json'),
}, },
ja: { ja: {
name: 'Japanese', name: 'Japanese',
originalName: '日本語', originalName: '日本語',
flagEmoji: '🇯🇵', flagEmoji: '🇯🇵',
resource: () => /* webpackChunkName "i18n-ja" */ import('./ja.json'), resource: () => import('./ja.json'),
}, },
it: { it: {
name: 'Italian', name: 'Italian',
originalName: 'italiano', originalName: 'italiano',
flagEmoji: '🇮🇹', flagEmoji: '🇮🇹',
resource: () => /* webpackChunkName "i18n-it" */ import('./it.json'), resource: () => import('./it.json'),
}, },
ca: { ca: {
name: 'Catalan', name: 'Catalan',
originalName: 'català', originalName: 'català',
flagEmoji: '🇦🇩', flagEmoji: '🇦🇩',
resource: () => /* webpackChunkName "i18n-ca" */ import('./ca.json'), resource: () => import('./ca.json'),
}, },
da: { da: {
name: 'Danish', name: 'Danish',
originalName: 'dansk', originalName: 'dansk',
flagEmoji: '🇩🇰', flagEmoji: '🇩🇰',
resource: () => /* webpackChunkName "i18n-da" */ import('./da.json'), resource: () => import('./da.json'),
}, },
hi: { hi: {
name: 'Hindi', name: 'Hindi',
originalName: 'हिन्दी', originalName: 'हिन्दी',
flagEmoji: '🇮🇳', flagEmoji: '🇮🇳',
resource: () => /* webpackChunkName "i18n-hi" */ import('./hi.json'), resource: () => import('./hi.json'),
}, },
'sv-SE': { 'sv-SE': {
name: 'Swedish (Sweden)', name: 'Swedish (Sweden)',
originalName: 'svenska (Sverige)', originalName: 'svenska (Sverige)',
flagEmoji: '🇸🇪', flagEmoji: '🇸🇪',
resource: () => /* webpackChunkName "i18n-sv_SE" */ import('./sv-SE.json'), resource: () => import('./sv-SE.json'),
}, },
ur: { ur: {
name: 'Urdu', name: 'Urdu',
originalName: 'اردو', originalName: 'اردو',
flagEmoji: '🇵🇰', flagEmoji: '🇵🇰',
resource: () => /* webpackChunkName "i18n-ur" */ import('./ur.json'), resource: () => import('./ur.json'),
}, },
ar: { ar: {
name: 'Arabic', name: 'Arabic',
originalName: 'العربية', originalName: 'العربية',
flagEmoji: '🇸🇦', flagEmoji: '🇸🇦',
resource: () => /* webpackChunkName "i18n-ar" */ import('./ar.json'), resource: () => import('./ar.json'),
}, },
fa: { fa: {
name: 'Persian', name: 'Persian',
originalName: 'فارسی', originalName: 'فارسی',
flagEmoji: '🇮🇷', flagEmoji: '🇮🇷',
resource: () => /* webpackChunkName "i18n-ar" */ import('./fa.json'), resource: () => import('./fa.json'),
}, },
uk: { uk: {
name: 'Ukrainian', name: 'Ukrainian',
originalName: 'українська', originalName: 'українська',
flagEmoji: '🇺🇦', flagEmoji: '🇺🇦',
resource: () => /* webpackChunkName "i18n-uk" */ import('./uk.json'), resource: () => import('./uk.json'),
}, },
}; };

View File

@@ -5,6 +5,19 @@ function testPackageName(regexp: RegExp): (module: any) => boolean {
// https://hackernoon.com/the-100-correct-way-to-split-your-chunks-with-webpack-f8a9df5b7758 // https://hackernoon.com/the-100-correct-way-to-split-your-chunks-with-webpack-f8a9df5b7758
export const productionCacheGroups = { export const productionCacheGroups = {
i18n: {
test: /frontend[\\/]i18n[\\/]/,
name: (module: any) => {
const name = module.resource.match(/[\\/]([^\\/]+)\.json$/)?.[1];
if (name && name !== 'en') {
return `i18n-langs.${name}`;
}
return 'i18n';
},
priority: 200,
enforce: true,
},
asyncVendor: { asyncVendor: {
test: /[\\/]node_modules[\\/]/, test: /[\\/]node_modules[\\/]/,
name(module: any) { name(module: any) {

View File

@@ -414,7 +414,7 @@ export function createWorkerTargetConfig(
return { return {
name: entry, name: entry,
context: pkg.path.value, context: ProjectRoot.value,
experiments: { experiments: {
topLevelAwait: true, topLevelAwait: true,
outputModule: false, outputModule: false,
@@ -541,6 +541,9 @@ export function createWorkerTargetConfig(
{} as Record<string, string> {} as Record<string, string>
) )
), ),
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1,
}),
process.env.SENTRY_AUTH_TOKEN && process.env.SENTRY_AUTH_TOKEN &&
process.env.SENTRY_ORG && process.env.SENTRY_ORG &&
process.env.SENTRY_PROJECT && process.env.SENTRY_PROJECT &&