diff --git a/reflex/compiler/templates.py b/reflex/compiler/templates.py index ba286a8decc..0f28cc401ea 100644 --- a/reflex/compiler/templates.py +++ b/reflex/compiler/templates.py @@ -502,11 +502,13 @@ def package_json_template( ) -def vite_config_template(base: str): +def vite_config_template(base: str, hmr: bool, force_full_reload: bool): """Template for vite.config.js. Args: base: The base path for the Vite config. + hmr: Whether to enable hot module replacement. + force_full_reload: Whether to force a full reload on changes. Returns: Rendered vite.config.js content as string. @@ -537,12 +539,25 @@ def vite_config_template(base: str): }}; }} +function fullReload() {{ + return {{ + name: "full-reload", + enforce: "pre", + handleHotUpdate({{ server }}) {{ + server.ws.send({{ + type: "full-reload", + }}); + return []; + }} + }}; +}} + export default defineConfig((config) => ({{ plugins: [ alwaysUseReactDomServerNode(), reactRouter(), safariCacheBustPlugin(), - ], + ].concat({"[fullReload()]" if force_full_reload else "[]"}), build: {{ assetsDir: "{base}assets".slice(1), rollupOptions: {{ @@ -564,6 +579,7 @@ def vite_config_template(base: str): }}, server: {{ port: process.env.PORT, + hmr: {"true" if hmr else "false"}, watch: {{ ignored: [ "**/.web/backend/**", diff --git a/reflex/environment.py b/reflex/environment.py index 5e5eb5ff873..30ff71880d1 100644 --- a/reflex/environment.py +++ b/reflex/environment.py @@ -640,6 +640,12 @@ class EnvironmentVariables: # Enable full logging of debug messages to reflex user directory. REFLEX_ENABLE_FULL_LOGGING: EnvVar[bool] = env_var(False) + # Whether to enable hot module replacement + VITE_HMR: EnvVar[bool] = env_var(True) + + # Whether to force a full reload on changes. + VITE_FORCE_FULL_RELOAD: EnvVar[bool] = env_var(False) + environment = EnvironmentVariables() diff --git a/reflex/utils/frontend_skeleton.py b/reflex/utils/frontend_skeleton.py index a6317ddad68..2b704c9bb24 100644 --- a/reflex/utils/frontend_skeleton.py +++ b/reflex/utils/frontend_skeleton.py @@ -10,6 +10,7 @@ from reflex import constants from reflex.compiler import templates from reflex.config import Config, get_config +from reflex.environment import environment from reflex.utils import console, path_ops from reflex.utils.prerequisites import get_project_hash, get_web_dir from reflex.utils.registry import get_npm_registry @@ -192,7 +193,11 @@ def _compile_vite_config(config: Config): base = "/" if frontend_path := config.frontend_path.strip("/"): base += frontend_path + "/" - return templates.vite_config_template(base=base) + return templates.vite_config_template( + base=base, + hmr=environment.VITE_HMR.get(), + force_full_reload=environment.VITE_FORCE_FULL_RELOAD.get(), + ) def initialize_vite_config():