vue2升级vue3:vue-i18n国际化异步按需加载
vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage
但是本文还是详细说一遍:
为什么需要异步加载语言包
主要还是缩小提代码包,没有按需加载前,语言包内容太多

好几屏幕全部是,虽然从webpack-analysis 看图里面占比可以忽略不计
按语言异步加载语言包
一次加载所有翻译文件是过度和不必要的。
因为可能一直用中文,那么就不会用到英文的数据,就没必要去加载。只在请求的时候去加载它
改动前代码
import { createI18n } from 'vue-i18n';
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn';
import cookies from '@/utils/cookies';
import chineseJson from '../lang/zh-cn.json';
import englishJson from '../lang/en.json';
//****n
const currentLang = cookies.get('blueking_language') || 'zh-cn';
if (currentLang === 'en') {
dayjs.locale('en');
} else {
dayjs.locale('zh-cn');
}
const i18n = createI18n({
locale: currentLang,
fallbackLocale: 'zh-cn', // 设置备用语言
silentFallbackWarn: true,
silentTranslationWarn: true,
globalInjection: true,
allowComposition: true,
messages: {
en: { ...englishJson },
'zh-cn': { ...chineseJson },
//****n
},
});
export default i18n;
这个文件n多,堆叠起来体积也不少
改动后
import { createI18n } from 'vue-i18n';
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn';
import cookies from '@/utils/cookies';
// import chineseJson from '../lang/zh-cn.json';
// import englishJson from '../lang/en.json';
export type LangType = 'zh-cn'|'en';
const currentLang: LangType = cookies.get('blueking_language') as LangType || 'zh-cn';
// 初始化加载fallbackLocale 语言包,但是图表平台首先加载框架,无需放到框架里面去加载
/* const messages = {
// en: { ...englishJson },
'zh-cn': { ...chineseJson },
};*/
const i18n = createI18n({
locale: currentLang,
fallbackLocale: 'zh-cn', // 设置备用语言
silentFallbackWarn: true,
silentTranslationWarn: true,
globalInjection: true,
allowComposition: true,
// messages,
});
export function changLang(langs: LangType) {
if (currentLang === 'en') {
dayjs.locale('en');
} else {
dayjs.locale('zh-cn');
}
cookies.set('blueking_language', langs);
loadLanguageAsync(langs);
// window.location.reload();
}
export function setI18nLanguage(lang: LangType) {
i18n.global.locale = lang;
return lang;
}
export function loadLanguageAsync(lang: LangType) {
return import(/* webpackChunkName: "lang-request" */`../lang/${lang}.json`).then((langfile) => { // 动态加载对应的语言包
i18n.global.setLocaleMessage(lang, langfile);
return setI18nLanguage(lang); // 返回并且设置
});
}
changLang(currentLang);
export default i18n;
这样就可以了
注意事项
由于是异步加载,比如初始化只加载 fallbackLocale ,代码中注释的部分
vue3使用vue-i18n 9.x ,相关方法在i18n.global.xxx
但是这个加载包还是有些打,需要进一步拆分
按模块或路由加载语言包
这个优化有很多措施
拆分模块
之前的语言包全部是在一个json文件里面。第一个,json无法tree-shake 树摇 掉不用代码。
如果是ts,首先第一个按页面、功能 分成一个个 对象。虽然不用tree-shake。
但是可以通过组合得到不同的js。
然后在路由钩子里面,按需注入。loadLanguageAsync
参考文章:
vueI18n 多语言文件按需加载:https://blog.csdn.net/yujin0213/article/details/119137798
vue 多语言 vue-i18n 按需加载,异步调用 https://www.cnblogs.com/chenyi4/p/12409074.html
十分钟入门前端最佳的语言国际化方案 https://zhuanlan.zhihu.com/p/144717545
转载本站文章《vue2升级vue3:vue-i18n国际化异步按需加载》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/vue3/8930.html
vue2升级vue3:vue-i18n国际化异步按需加载的更多相关文章
- vue项目实现路由按需加载的3种方式
vue异步组件技术 ==== 异步加载vue-router配置路由 , 使用vue的异步组件技术 , 可以实现按需加载 .但是,这种情况下一个组件生成一个js文件 /* vue异步组件技术 */ { ...
- vue3.0使用ant-design-vue进行按需加载原来这么简单
下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...
- D3树状图异步按需加载数据
D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...
- vue项目优化之按需加载组件-使用webpack require.ensure
require-ensure和require-amd的区别: require-amd 说明: 同AMD规范的require函数,使用时传递一个模块数组和回调函数,模块都被下载下来且都被执行后才执行回调 ...
- vue 动态路由按需加载的三种方式
在Vue项目中,一般使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如: import Hello from '@/components/Hell ...
- Vue3 使用 svg-sprite-loader 实现 svg 图标按需加载
前面文章有讲到 svg 图标按需加载的优势以及 Vue 如何使用 vue-svg-icon 实现 svg 图标按需载入: https://www.cnblogs.com/Leophen/p/13201 ...
- 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)
1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...
- vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件
如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...
- vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9
项目从vue2 升级vue3,VueI18n需要做适当的调整.主要是Vue I18n v8.x 到Vue I18n v9 or later 的变化,其中初始化: 具体可以参看:https://vue- ...
- vue2升级vue3指南(二)—— 语法warning&error篇
本文总结了vue2升级vue3可能会遇到的语法警告和错误,如果想知道怎样升级,可以查看我的上一篇文章:vue2升级vue3指南(一)-- 环境准备和构建篇 Warning 1.deep /deep/和 ...
随机推荐
- Java-【大数处理】和【日期类】
[大数类] BigInteger(整数) 和 BigDecimal(小数) 都是Java针对大数提供的类 常用方法: (1)加:add (2)减:subtract (3)乘:multiply (4)除 ...
- 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1000),请问能否通过删除SS中的字符(不改变顺序)将它变换成TS,如果可以输出“YES",不可以则输出“NO"。 输入说明:第一行为源字符串SS,第二行为目标字符串TS。
import java.util.Scanner;/* 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1 ...
- Flutter基于Mac的环境配置
1.下载Flutter SDK git clone https://github.com/flutter/flutter.git 2.配置Flutter镜像+Flutter环境变量 ( 先创建.bas ...
- html页面下载为docx文档
1.安装要用到的两个插件:html-docx-js-typescript.file-saver. 2.导入两个方法: import { asBlob } from 'html-docx-js-type ...
- Postgresql统计所有表的基本信息(如行数、大小等)
目录 pg_class 记录表和几乎所有具有列或者像表的东西.这包括索引(但还要参见 pg_index ).序列.视图.物化视图.组合类型和TOAST表,参见 relkind .下面,当我们提及所有这 ...
- Shell脚本结构化-控制流
脚本结构化命令 上一章给出的那些 shell 脚本里,shell 按照命令在脚本中出现的顺序依次进行处理.对顺序操作来说,这已经足够了,因为在这种操作环境下,你想要的就是所有的命令按照正确的顺序执行. ...
- 中值滤波 ordfilt2函数
滤波是过滤掉信号中没用的波段 ordfilt2函数语法格式为:B=ordfilt2(A,order,domain)B=ordfilt2(A,order,domain,S)B=ordfilt2(..., ...
- Vue系列---【自定义vue组件发布npm仓库】
自定义vue组件发布npm仓库 参考链接:自定义vue组件发布npm仓库
- Oracle_20200416
PLSQL 新建普通用户 1.使用system登录 2.File-->NEW-->SQL WINDOW 3.执行语句 --创建用户 --create user 用户名 identified ...
- Java经典知识复习
1.自增变量 int i = 1; i = i++; int j = i++; int k = i + ++i * i++; 问i.j.k分别等于? 针对这类题目, 1. 赋值操作=,最后计算: ...