如何使用 React 在资源(.json、.csv 等)上使用代码拆分
How to use code splitting on a ressouce (.json, .csv, etc.) with React
问题:
我正在使用 react-intl 我想加载与语言相关的 JSON 文件 只有当它是需要的,简而言之延迟加载它。
文档:
https://reactjs.org/docs/code-splitting.html
这里的问题是我希望延迟加载 JSON 文件而不是组件,所以我对如何在没有 JSX 的情况下使用它有点迷茫。
实际代码:
import React from 'react';
import {IntlProvider} from 'react-intl';
import English from "../i18n/en.json";
import Polish from "../i18n/pl.json";
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
lang = Polish;
break;
default:
lang = English;
}
function Wrapper () {
[...]
}
export default Wrapper
我试过的方法没有有效:
测试 1:
import React from 'react';
import {IntlProvider} from 'react-intl';
const English = React.lazy(() => import('../i18n/en.json'));
const Polish = React.lazy(() => import('../i18n/pl.json'));
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
lang = Polish;
break;
default:
lang = English;
}
function Wrapper () {
[...]
}
export default Wrapper
测试 2:
import React from 'react';
import {IntlProvider} from 'react-intl';
const English = React.lazy(() => import('../i18n/en.json'));
const Polish = React.lazy(() => import('../i18n/pl.json'));
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
Polish.then(polish => {lang = polish});
break;
default:
English.then(english=> {lang = english});
}
function Wrapper () {
[...]
}
export default Wrapper
测试 3(灵感来自 ):
import React from 'react';
import {IntlProvider} from 'react-intl';
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
import("../i18n/pl.json").then(Polish=> {
lang = Polish);
});
break;
default:
import("../i18n/en.json").then(English=> {
lang = English);
});
}
function Wrapper () {
[...]
}
export default Wrapper
如果需要更多代码(例如 Wrapper 函数),请在评论中告诉我:)
我也遇到了同样的问题,我想在 React 中对 JSON 进行代码拆分。我找到了一个使用动态导入功能的解决方法。
我没有使用 Intl,所以我无法确认这是否满足您的需求,但这正是满足我的需求的方法(我认为它应该适合您)
我创建了一个函数来 return 对我需要编码拆分的数据作出承诺。然后我在我的组件中调用了异步函数并等待数据。
我的用例是从 API 中获取数据,如果已完成,则加载缓存的 JSON 数据。
const loadCached = (key) => {
return new Promise((res, rej) => {
import(`../datasets/cached/${key}.json`).then((data) => {
res(data?.default);
});
});
};
然后我从 async catch
中调用了它
const cachedData = await loadCached(key);
所以为了您的使用,我会保留我的 loadCached
功能(也许将其重命名为 loadLang
)
然后将其包裹在 useEffect
中以在加载时触发以更改语言并收集 JSON。
以下是我将如何处理您的问题(未经测试的代码)
const local = navigator.language; // get language
const [lang, setLang] = useState("English"); // for a default of english
// fire when we get local from DOM
useEffect(() => {
async function getLangData() {
const response = await loadLang(local);
setLang(reponse);
}
getLangData();
}, [local])
const setLang = (lang) => {
return new Promise((res, rej) => {
import(`../i18n/${lang}.json`).then((data) => {
res(data?.default);
});
});
};
问题:
我正在使用 react-intl 我想加载与语言相关的 JSON 文件 只有当它是需要的,简而言之延迟加载它。
文档:
https://reactjs.org/docs/code-splitting.html 这里的问题是我希望延迟加载 JSON 文件而不是组件,所以我对如何在没有 JSX 的情况下使用它有点迷茫。
实际代码:
import React from 'react';
import {IntlProvider} from 'react-intl';
import English from "../i18n/en.json";
import Polish from "../i18n/pl.json";
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
lang = Polish;
break;
default:
lang = English;
}
function Wrapper () {
[...]
}
export default Wrapper
我试过的方法没有有效:
测试 1:
import React from 'react';
import {IntlProvider} from 'react-intl';
const English = React.lazy(() => import('../i18n/en.json'));
const Polish = React.lazy(() => import('../i18n/pl.json'));
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
lang = Polish;
break;
default:
lang = English;
}
function Wrapper () {
[...]
}
export default Wrapper
测试 2:
import React from 'react';
import {IntlProvider} from 'react-intl';
const English = React.lazy(() => import('../i18n/en.json'));
const Polish = React.lazy(() => import('../i18n/pl.json'));
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
Polish.then(polish => {lang = polish});
break;
default:
English.then(english=> {lang = english});
}
function Wrapper () {
[...]
}
export default Wrapper
测试 3(灵感来自
import React from 'react';
import {IntlProvider} from 'react-intl';
const local = navigator.language;
let lang;
switch (local){
case "pl":
case "pl-pl":
import("../i18n/pl.json").then(Polish=> {
lang = Polish);
});
break;
default:
import("../i18n/en.json").then(English=> {
lang = English);
});
}
function Wrapper () {
[...]
}
export default Wrapper
如果需要更多代码(例如 Wrapper 函数),请在评论中告诉我:)
我也遇到了同样的问题,我想在 React 中对 JSON 进行代码拆分。我找到了一个使用动态导入功能的解决方法。
我没有使用 Intl,所以我无法确认这是否满足您的需求,但这正是满足我的需求的方法(我认为它应该适合您)
我创建了一个函数来 return 对我需要编码拆分的数据作出承诺。然后我在我的组件中调用了异步函数并等待数据。
我的用例是从 API 中获取数据,如果已完成,则加载缓存的 JSON 数据。
const loadCached = (key) => {
return new Promise((res, rej) => {
import(`../datasets/cached/${key}.json`).then((data) => {
res(data?.default);
});
});
};
然后我从 async catch
const cachedData = await loadCached(key);
所以为了您的使用,我会保留我的 loadCached
功能(也许将其重命名为 loadLang
)
然后将其包裹在 useEffect
中以在加载时触发以更改语言并收集 JSON。
以下是我将如何处理您的问题(未经测试的代码)
const local = navigator.language; // get language
const [lang, setLang] = useState("English"); // for a default of english
// fire when we get local from DOM
useEffect(() => {
async function getLangData() {
const response = await loadLang(local);
setLang(reponse);
}
getLangData();
}, [local])
const setLang = (lang) => {
return new Promise((res, rej) => {
import(`../i18n/${lang}.json`).then((data) => {
res(data?.default);
});
});
};