如何查看Vite项目中的公共目录进行热加载?

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 上发布的示例:

结果说明

在此输入图像描述