【问题标题】:Is there a way to "dynamically" load json files into my component based on a condition?有没有办法根据条件“动态”将 json 文件加载到我的组件中?
【发布时间】:2021-10-09 23:46:01
【问题描述】:

假设我有几个这样的翻译文件:

import English from "./lang/compiled-en.json";
import Spanish from "./lang/compiled-es.json";

对于我们计划支持的所有语言等等。这些直接导入到它们使用的组件中,我们的应用程序作为一个整体被 webpack 分割成块,其中可能包含许多组件,因此也包含许多字符串。
最好只根据用户的语言环境导入我需要的 language.json 文件,而不是在必须检查语言环境并只使用一个时导入所有文件。
我在这里尝试了一个超级幼稚的尝试,但它确实有效:
另一个目录中存在的辅助函数:

export async function loadLocaleData(locale: string, path: string ) {
  switch (locale) {
    case "en-US":
      return await import(path + "/lang/en-compiled.json");
    case "pt-BR":
      return await import(path + "/lang/pt-br-compiled.json");
    default:
      return await import(path + "/lang/en-compiled/en.json");
  }
}

我在想,将这个辅助函数导入到我需要翻译的组件中会在它们自己的目录中查找翻译文件。但即使我将该路径硬编码以指定翻译文件的确切位置,我仍然会收到错误。
上面可以实现成这样的组件:

  const localeContext = useContext(LocaleContext);

  const messages = loadLocaleData(
    localeContext.locale,
    "packages/components/Preferences/Billing"
  );

然后,理想情况下,我会将该消息传递到包装这个单独组件的 IntlProvider 中。

这绝对行不通。有没有办法让它工作?我知道我想做什么,但我不确定这有多大可能。

【问题讨论】:

    标签: reactjs typescript webpack code-splitting


    【解决方案1】:

    您可以像尝试一样使用动态导入,但需要使用绝对路径。否则你的打包器(Webpack)实际上不知道在哪里可以找到它们。

    或者,将您的语言文件存储在您的public/ 目录中并使用它的公共路径。 Webpack 不会接触这些文件(除了index.html,这可能是你最好的选择。

    【讨论】:

    • 嗯,很有趣。我正在尝试包含绝对路径(例如,从我的存储库根目录开始,路径将是“packages/components/Preferences/Billing/lang/pt-br-compiled.json”,即路径变量 + 我的扩展名出来是。但是,我收到一个 webpack 缺少模块错误。通过绝对路径,你的意思是来自我的计算机本身吗?
    • 也许我措辞错误:当我说绝对路径时,我的意思是相对于您要从中导入的模块的“完整相对路径”。相对但没有连接。 毕竟,绝对路径实际上会检查你的 node_modules/,而不是你的实际文件系统。 Webpack 基本上会检查你的代码,查找导入并看到“我可以知道这个导入试图做什么导入?太好了,捆绑它!”,连接时失败。你基本上总是想用import('...'),虽然我认为它也支持import(cond ? 'pathA' : 'pathB'),但是非常有限。
    • 现在,它可以被重复使用吗?我所有的组件都应该具有相同的模式——它们目录中的一个 lang 文件夹,其中包含已编译的语言文件,所有文件的名称都相同。因此,通过在不同目录中的任何其他组件中使用此函数,它仍应查看所述目录的路径?
    • 导入相对于使用/写入导入的模块。例如模块 A 导入模块 B,模块 B 执行 import('./c'),它将与模块​​ B 所在的目录相关,而不是 C。
    • 更正:它将与 B 所在的目录模块相关,而不是 A。
    猜你喜欢
    • 2021-02-25
    • 2017-05-06
    • 2012-05-23
    • 2019-11-21
    • 2021-02-12
    • 2010-09-09
    • 2021-11-04
    • 2011-11-22
    相关资源
    最近更新 更多