JavaScript中的条件导入或替代(ReactJS WebApp)
Conditional import or alternative in JavaScript (ReactJS WebApp)?
我正在为ReactJS Web应用程序实现国际化。如何避免加载所有语言文件?
import ru from './ru';
import en from './en';
// next lines are not important for this question from here
import locale from 'locale';
const supported = new locale.Locales(["en", "ru"])
let language = 'ru';
const acceptableLanguages = {
ru: ru,
en: en,
}
if (typeof window !== 'undefined') {
const browserLanguage = window.navigator.userLanguage || window.navigator.language;
const locales = new locale.Locales(browserLanguage)
language = locales.best(supported).code
}
// till here
// and here i'm returning a static object, containing all language variables
const chooseLang = () => {
return acceptableLanguages[language];
}
const lang = chooseLang();
export default lang;
不幸的是,没有办法在ES6中动态加载模块。
即将推出的HTML Loader Spec将允许此功能,因此您可以使用polyfill来使用它。
const chooseLang = () => System.import(`./${language}`);
export default chooseLang;
然而,这将是基于承诺的,因此需要这样称呼:
import language from "./language";
language.chooseLang().then(l => {
console.log(l);
});
但请记住,该规范可能会发生根本性的变化(或者完全取消)。
另一种选择是不将本地化存储为Javascript模块,而是存储为JSON,例如
en.json
{ "hello_string": "Hi!" }
language.js
const chooseLang = () => {
return fetch(`./${language}.json`)
.then(response => response.json());
};
同样,这将是基于承诺的,因此需要这样访问:
import language from "./language";
language.chooseLang().then(l => {
console.log(l.hello_string);
});
该解决方案将完全符合ES6,并且不会依赖于未来可能的功能。
看起来我来晚了,但我想回答我正在使用的方法。我有一个异步组件:
import React from 'react';
export default (loader, collection) => (
class AsyncComponent extends React.Component {
constructor(props) {
super(props);
this.Component = null;
this.state = { Component: AsyncComponent.Component };
}
componentWillMount() {
if (!this.state.Component) {
loader().then((Component) => {
AsyncComponent.Component = Component;
this.setState({ Component });
});
}
}
render() {
if (this.state.Component) {
return (
<this.state.Component { ...this.props } { ...collection } />
)
}
return null;
}
}
);
我们称之为使用:
const page1 = asyncComponent(() => import('./page1')
.then(module => module.default), { name: 'page1' });
然后我们将其与一起使用
<Route path='/page1' component= {page1}/>
这将确保加载是动态完成的。
看看react可加载包——如果你能以某种方式将语言文件封装到组件中,这可能会解决你的问题。
相关文章:
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 如何更改reactjs中外部/独立组件的状态或属性
- ReactJS和SpringDataRest缓存问题可能与websocket有关
- reactjs this.refs vs document.getElementById
- 同构reactjs-cdn资产
- 在ReactJS中重新渲染孩子3次可以接受吗
- 如何在ReactJs中显示Json数据
- 将IndexedDB中的数据拉入数组,并通过ReactJS输出
- 如何在ReactJs中渲染子组件时重新加载子组件的数据
- 如何在ReactJs中链接下拉列表和文本区域
- 如何在ReactJs中呈现选定选项的更改表
- 在select上呈现不同形式的reactjs
- onClick事件未触发reactjs
- 如何在ReactJs中渲染重音符号
- reactjs无法将this.pops传递到react图表列表中
- 在reactjs组件中预加载数据
- JavaScript中的条件导入或替代(ReactJS WebApp)
- 关于webapp架构和reactJs的建议