Skip to content

feat: apply webpack HMR updates while a debug app runs - #32

Merged
triniwiz merged 1 commit into
mainfrom
feat/webpack-hmr-livesync
Oct 22, 2026
Merged

triniwiz merged 1 commit into
mainfrom
feat/webpack-hmr-livesync

Conversation

@triniwiz

Copy link
Copy Markdown
Member

With webpack, ns run windows syncs the hot-update files into bin\app, but nothing tells the running app to apply them, so the CLI restarts the app on every change. On Android and iOS the runtime calls global.__onLiveSync() after a LiveSync, and webpack's HMR runtime hooks that to run its hot update.

Changes

template/framework/__PROJECT_NAME__/RuntimeHost.cs (Debug builds only):

  • WatchLiveSync(dispatcherQueue) watches the app's LocalState for an ns-livesync marker. When the marker appears or changes, the host consumes it on the UI thread and runs __onLiveSync() through runtime_runscript.
  • While it watches, the host writes ns-livesync-ready. The CLI only signals an app whose host wrote it, so a newer CLI with an older host still restarts as before. The ready marker is deleted at startup and on dispose.

App.xaml.cs starts the watcher once the pump runs.

The CLI side is NativeScript/nativescript-cli (against feat/windows). It writes the marker after syncing, and now restarts on a full sync, which is how the CLI recovers from a hot update that fails.

Testing

End to end on Windows 11 (Debug, x64): a TypeScript app on webpack 5.99.7, core and @nativescript/webpack built from feat/windows, this template, a current nativescript.dll and the CLI branch:

  • Editing app.css: the CLI synced the hot-update files and logged "Refreshing application" with no restart. The app logged [HMR] success | Successfully applied update. with the same PID.
  • Editing app.ts (not hot-acceptable): the app logged [HMR] failure | A module has not been accepted., and the CLI then restarted the app (new PID), as on Android and iOS.

I haven't built the published @nativescript/windows-* packages from this template. The NativeScriptWindowsDemo and TestApp copies of the host are unchanged.

The CLI syncs webpack's hot-update files into bin\app, but nothing told the
running app to apply them, so every change restarted the app.

Debug hosts now watch LocalState for an ns-livesync marker and call
global.__onLiveSync() on the UI thread when it appears, which runs webpack's
hot update, as the Android and iOS runtimes do after a LiveSync. The host
writes ns-livesync-ready while it watches, so a CLI only relies on the marker
when the app can act on it.
@coderabbitai

coderabbitai Bot commented Oct 22, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 3961616e-1a25-4011-8f0a-87a74a4489de

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@triniwiz
triniwiz merged commit 4c1ce4f into main Oct 22, 2026
1 check passed
@triniwiz
triniwiz deleted the feat/webpack-hmr-livesync branch October 22, 2026 07:34
triniwiz added a commit to NativeScript/nativescript-cli that referenced this pull request Oct 23, 2026
…6174)

tryRefreshApplication returned false for webpack, so every change restarted
the app even though the hot-update files were already in bin\app.

After a sync, the CLI now writes an ns-livesync marker into the app's
LocalState. The debug host watches for it and calls global.__onLiveSync(),
which runs webpack's hot update (NativeScript/windows#32). The CLI only does
this when the host has written ns-livesync-ready, so older hosts still restart.

shouldRestart now also restarts on a full sync, as Android and iOS do. That is
how the CLI recovers when a hot update fails.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant