made live reloading optional

This commit is contained in:
Daniel Fichtinger 2025-07-06 15:35:02 -04:00
parent a03e9bfb82
commit cefd57d8d7

View file

@ -129,11 +129,11 @@ class ZonaReloadHandler(FileSystemEventHandler):
self, self,
builder: ZonaBuilder, builder: ZonaBuilder,
output: Path, output: Path,
ws_server: WebSocketServer, ws_server: WebSocketServer | None,
): ):
self.builder: ZonaBuilder = builder self.builder: ZonaBuilder = builder
self.output: Path = output.resolve() self.output: Path = output.resolve()
self.ws_server: WebSocketServer = ws_server self.ws_server: WebSocketServer | None = ws_server
def _trigger_rebuild(self, event: FileSystemEvent): def _trigger_rebuild(self, event: FileSystemEvent):
# check if it's an event we care about # check if it's an event we care about
@ -141,7 +141,7 @@ class ZonaReloadHandler(FileSystemEventHandler):
logger.info(f"Modified: {event.src_path}, rebuilding...") logger.info(f"Modified: {event.src_path}, rebuilding...")
# rebuild static site # rebuild static site
self.builder.build() self.builder.build()
assert self.ws_server if self.ws_server:
# trigger browser refresh # trigger browser refresh
self.ws_server.notify_all() self.ws_server.notify_all()
@ -170,6 +170,7 @@ def serve(
draft: bool = False, draft: bool = False,
host: str = "localhost", host: str = "localhost",
port: int = 8000, port: int = 8000,
live_reload: bool = True,
): ):
"""Serve preview website with live reload and automatic rebuild.""" """Serve preview website with live reload and automatic rebuild."""
builder = ZonaBuilder(root, output, draft) builder = ZonaBuilder(root, output, draft)
@ -182,20 +183,25 @@ def serve(
root = builder.layout.root root = builder.layout.root
# spin up websocket server for live reloading # spin up websocket server for live reloading
if live_reload:
ws_port = port + 1 ws_port = port + 1
ws_server = WebSocketServer(host, ws_port) ws_server = WebSocketServer(host, ws_port)
ws_server.start() ws_server.start()
# generate reload script for injection # generate reload script for injection
reload_script = make_reload_script(host, ws_port) reload_script = make_reload_script(host, ws_port)
# serve the output directory
os.chdir(output)
# generate handler with reload script as attribute # generate handler with reload script as attribute
handler = make_handler_class(reload_script) handler = make_handler_class(reload_script)
else:
handler = QuietHandler
ws_server = None
# serve the output directory
os.chdir(output)
# initialize http server # initialize http server
httpd = ZonaServer( httpd = ZonaServer(
server_address=(host, port), RequestHandlerClass=handler server_address=(host, port), RequestHandlerClass=handler
) )
# link websocket server # link websocket server
if ws_server:
httpd.set_ws_server(ws_server) httpd.set_ws_server(ws_server)
# provide link to user # provide link to user
print(f"Serving {output} at http://{host}:{port}") print(f"Serving {output} at http://{host}:{port}")