javascript - 如何有条件地加载语言相关的 Javascript 文件

标签 javascript es6-modules

如何有条件地导出2个变量?

这些是语言标志使用的 2 个 Javascript 文件。

// text.fr.js
export const LOGIN_TITLE_fr = {
    title: 'Hello!', 
};

export const LOGIN_ERROR_fr = {
    err_msg: 'Error!', 
};

// text.en.js
export const LOGIN_TITLE_en = {
    title: 'Hello!', 
};

export const LOGIN_ERROR_en = {
    err_msg: 'Error!', 
};

这是用于有条件导入然后导出 2 个变量的文件,该文件将由此处未列出的另一个文件使用。

1)情况1:

// text1.js
// No compiler error, but for 'fr', LOGIN_TITLE, LOGIN_ERROR are still en. Why?
import { LOGIN_TITLE_en, LOGIN_ERROR_en } from './text.en.js';
import { LOGIN_TITLE_ch, LOGIN_ERROR_ch } from './text.fr.js';

const LOGIN_TITLE = LOGIN_TITLE_en;
const LOGIN_ERROR = LOGIN_ERROR_en;

if (window.loi_language == 'fr') {
  const LOGIN_TITLE = LOGIN_TITLE_fr;
  const LOGIN_ERROR = LOGIN_ERROR_fr;
}


export {
  LOGIN_TITLE,
  LOGIN_ERROR
}

2)案例2

// text2.js
// Error when loading at last line!!! 
import { LOGIN_TITLE_en, LOGIN_ERROR_en } from './text.en.js';
import { LOGIN_TITLE_ch, LOGIN_ERROR_fr } from './text.fr.js';


if (window.loi_language == 'fr') {
  const LOGIN_TITLE = LOGIN_TITLE_fr;
  const LOGIN_ERROR = LOGIN_ERROR_fr;
} else {
  const LOGIN_TITLE = LOGIN_TITLE_en;
  const LOGIN_ERROR = LOGIN_ERROR_en;
}


export {
  LOGIN_TITLE,
  LOGIN_ERROR    // Error: not defined.
}

尝试了以上2种情况,均无效。想知道导出 2 个变量的正确方法是什么取决于语言。

最佳答案

您正在const - 声明 block 作用域内的变量,它们不会影响模块作用域中的变量。您需要使用

let LOGIN_TITLE = LOGIN_TITLE_en;
let LOGIN_ERROR = LOGIN_ERROR_en;

if (window.loi_language == 'fr') {
  LOGIN_TITLE = LOGIN_TITLE_fr;
  LOGIN_ERROR = LOGIN_ERROR_fr;
}

但是我建议简化为

// text.fr.js
export const LOGIN_TITLE = 'Bonjour!';
export const LOGIN_ERROR = 'Défaut!';

// text.en.js
export const LOGIN_TITLE = 'Hello!';
export const LOGIN_ERROR = 'Error!';

// text.js
import * as en from './text.en.js';
import * as fr from './text.fr.js';

const dict = window.loi_language == 'fr' ? fr : en;

export const LOGIN_TITLE = dict.LOGIN_TITLE;
export const LOGIN_ERROR = dict.LOGIN_ERROR;

对导出使用相同的名称可能会在某些时候允许您将动态 text.js 替换为模块 bundler 中特定于语言的名称。

关于javascript - 如何有条件地加载语言相关的 Javascript 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57648378/

相关文章:

typescript - "... resolves to a non-module entity and cannot be imported using this construct"是什么意思?

javascript - Angular 形式保存不适用于动态推送数据

javascript - 在侧边栏 GAS 中调用服务器端脚本

javascript - 如何知道 npm 包是否可以使用 ES6 导入语法导入?

modernizr - 我可以使用 Modernizr 来检测 ES6 模块支持吗?

javascript - Chrome 61 : Unexpected token import

javascript - webpack:字符串中的逗号在 bundle 期间导致语法错误

javascript - PhantomJS 我的代码甚至不会点击或运行点击

javascript - Array.prototype.forEach() - 为什么该方法的代码拥有按位移位运算符?

javascript - 在jqPlot中表示具有相等值的多个数据点