Two*_*ses 17 javascript typescript reactjs vite
我有一个使用 Vite 配置的 React 项目。
热重载效果很好,但我使用react-i18next多语言支持,这是我的结构:
public
-> en
-> translation.json
-> ru
-> translation.json
Run Code Online (Sandbox Code Playgroud)
当我更改translation.json文件时,Vite不看,我必须刷新页面才能看到更改。
有没有办法让Vite查看public目录下的所有文件?
小智 15
我修改了 Flydev 的答案,以便它可以热重新加载依赖于 i18n 的组件,而无需重新加载整个页面。(目前在打字稿项目中使用)
import { PluginOption } from "vite";
export default function I18nHotReload(): PluginOption {
return {
name: 'i18n-hot-reload',
handleHotUpdate({ file, server }) {
if (file.includes('locales') && file.endsWith('.json')) {
console.log('Locale file updated')
server.ws.send({
type: "custom",
event: "locales-update",
});
}
},
}
}
Run Code Online (Sandbox Code Playgroud)
然后将其添加到vite的插件中:
plugins: [
...,
i18nHotReload(),
]
Run Code Online (Sandbox Code Playgroud)
然后在代码可以到达的任何地方添加侦听器(我在 i18n 初始配置文件中使用它)
if (import.meta.hot) {
import.meta.hot.on('locales-update', () => {
i18n.reloadResources().then(() => {
i18n.changeLanguage(i18n.language)
})
})
}
Run Code Online (Sandbox Code Playgroud)
i18n.reloadResources()单独不会触发翻译热重载
JEd*_*dot 13
2023 年更新:您应该阅读并使用 @ErickLima 的答案,以避免完全重新加载。
您可以通过插件来实现这一点。
我在第一个答案中犯了一个错误,这应该是一个full-reload事件而不是一个update事件
export default function CustomHmr() {
return {
name: 'custom-hmr',
enforce: 'post',
// HMR
handleHotUpdate({ file, server }) {
if (file.endsWith('.json')) {
console.log('reloading json file...');
server.ws.send({
type: 'full-reload',
path: '*'
});
}
},
}
}
Run Code Online (Sandbox Code Playgroud)
然后添加插件vite.config.js:
{
plugins: [
CustomHmr() <--- custom plugin
]
}
Run Code Online (Sandbox Code Playgroud)
查看 Stackblitz 上发布的示例:
| 归档时间: |
|
| 查看次数: |
13797 次 |
| 最近记录: |