如何配置Vite项目监听public目录以实现热重载?
解决Vite不监听public目录下翻译文件的问题
嘿,这个问题我之前也踩过坑!Vite默认确实不会监听public目录下的文件变化来触发热重载,不过有几种实用的方法可以解决这个问题,让你修改翻译文件后不用手动刷新页面:
方法1:修改Vite配置,添加监听目录
Vite的server.watch选项可以自定义需要监听的文件路径,我们只需要把public目录加入监听列表就行。在你的vite.config.js(或.ts)里修改配置:
import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [react()], server: { watch: { include: ['src/**', 'public/**'], // 明确包含public下所有文件 }, }, });
保存配置后重启Vite服务,现在修改public下的translation.json文件,页面应该会自动刷新了。
方法2:使用vite-plugin-full-reload插件
如果第一种方法没生效,或者你只想精准监听翻译文件,可以用这个专门的插件来触发页面刷新。
首先安装插件:
npm install vite-plugin-full-reload --save-dev
然后修改Vite配置:
import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import fullReload from 'vite-plugin-full-reload'; export default defineConfig({ plugins: [ react(), fullReload(['public/**/*.json']), // 只监听public下的JSON文件,更精准 ], });
这个插件会在指定文件变化时触发页面全量刷新,虽然不是热重载那种局部更新,但至少不用手动点刷新按钮了。
方法3:把翻译文件移到src目录下
如果愿意调整项目结构,把翻译文件放到src目录(比如src/locales/en/translation.json)是更彻底的解决方案——因为Vite默认会监听src下所有文件的变化,修改后会自动触发热重载。
你需要调整i18n的初始化代码,直接导入翻译文件而不是从public加载:
import i18next from 'i18next'; import { initReactI18next } from 'react-i18next'; import enTranslation from './locales/en/translation.json'; import ruTranslation from './locales/ru/translation.json'; i18next .use(initReactI18next) .init({ resources: { en: { translation: enTranslation }, ru: { translation: ruTranslation }, }, lng: 'en', // 默认语言 interpolation: { escapeValue: false, // React已经处理了XSS,这里不需要 }, });
这种方式不仅能触发热重载,还能让Vite对翻译文件进行打包优化,一举两得。
内容的提问来源于stack exchange,提问作者Two Horses




