有条件地导入局部变量以提高组件的性能
Conditionally import locals for improving performance on components
尝试从相对路径中的许多其他语言导入一种语言,以阻止页面刷新时不必要的负载并获得更好的 Lighthouse 结果。
当Vue18i是这样的时候,它加载了这2种语言。
locales: [
{
code: 'en',
iso: 'en-GB',
name: 'English',
// file: 'en.json',
file: 'en.js'
},
{
code: 'tr',
iso: 'tr-TR',
name: 'Türkçe',
file: 'tr.js',
// isCatchallLocale: true
},
],
我想让它加载一种语言,并且 1 个页面有一个包含 200 多个数组的类别组件。要求有条件地只加载一种语言类别的翻译。
例如,考虑到每个语言数组和类别翻译,下面的解决方案并不好。
<i18n>
{
"en": {
"hello": "hello world!"
},
"ja": {
"hello": "こんにちは、世界!"
}
}
</i18n>
<template>
<p>{{ $t('hello') }}</p>
</template>
当Categorizer.vue组件打开时,当config.baseapi是http://localhost:3000/en/p/add。它应该将分类翻译加载到 i18n。
import en from '~/locales/encategory.json'
如果是 http://localhost:3000/tr/p/add,应该加载土耳其语翻译。
import tr from '~/locales/trcategory.json'
找到了一个简单的方法。找不到参考资料,因为有很多针对 CommonJS 而不是针对 ES6 JavaScript。这是针对纯粹的 JavaScript 优化的,因此针对 Nuxt。您不想为土耳其用户加载 50 种语言:
let productcolortr;
let productcoloren;
const sleep = (ms) => new Promise((f) => setTimeout(f, ms));
if ($locale == 'en') {
await sleep(4000); // simulate network delay
productcoloren = (await import('../../../locales/productcoloren')).default;
addMessages('en', productcoloren);
} else {
await sleep(4000); // simulate network delay
productcolortr = (await import('../../../locales/productcolortr')).default;
addMessages('tr', productcolortr);
}
这是新一代Sveltekit的含义。它在 DOM 加载并执行 if 条件之前等待。 $lan 是存储变量,这里比 Nuxt 好多了:
{#if $lan == "en"}
{#await import('../../locales/en.js') then c}
{$lan = "en"}
{/await}
{:else}
{#await import('../../locales/tr.js') then c}
{$lan = "tr"}
{/await}
{/if}
尝试从相对路径中的许多其他语言导入一种语言,以阻止页面刷新时不必要的负载并获得更好的 Lighthouse 结果。
当Vue18i是这样的时候,它加载了这2种语言。
locales: [
{
code: 'en',
iso: 'en-GB',
name: 'English',
// file: 'en.json',
file: 'en.js'
},
{
code: 'tr',
iso: 'tr-TR',
name: 'Türkçe',
file: 'tr.js',
// isCatchallLocale: true
},
],
我想让它加载一种语言,并且 1 个页面有一个包含 200 多个数组的类别组件。要求有条件地只加载一种语言类别的翻译。
例如,考虑到每个语言数组和类别翻译,下面的解决方案并不好。
<i18n>
{
"en": {
"hello": "hello world!"
},
"ja": {
"hello": "こんにちは、世界!"
}
}
</i18n>
<template>
<p>{{ $t('hello') }}</p>
</template>
当Categorizer.vue组件打开时,当config.baseapi是http://localhost:3000/en/p/add。它应该将分类翻译加载到 i18n。
import en from '~/locales/encategory.json'
如果是 http://localhost:3000/tr/p/add,应该加载土耳其语翻译。
import tr from '~/locales/trcategory.json'
找到了一个简单的方法。找不到参考资料,因为有很多针对 CommonJS 而不是针对 ES6 JavaScript。这是针对纯粹的 JavaScript 优化的,因此针对 Nuxt。您不想为土耳其用户加载 50 种语言:
let productcolortr;
let productcoloren;
const sleep = (ms) => new Promise((f) => setTimeout(f, ms));
if ($locale == 'en') {
await sleep(4000); // simulate network delay
productcoloren = (await import('../../../locales/productcoloren')).default;
addMessages('en', productcoloren);
} else {
await sleep(4000); // simulate network delay
productcolortr = (await import('../../../locales/productcolortr')).default;
addMessages('tr', productcolortr);
}
这是新一代Sveltekit的含义。它在 DOM 加载并执行 if 条件之前等待。 $lan 是存储变量,这里比 Nuxt 好多了:
{#if $lan == "en"}
{#await import('../../locales/en.js') then c}
{$lan = "en"}
{/await}
{:else}
{#await import('../../locales/tr.js') then c}
{$lan = "tr"}
{/await}
{/if}