test(dev): support full reload in tests#6259
Conversation
How to use the Graphite Merge QueueAdd the label graphite: merge to this PR to add it to the merge queue. You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
✅ Deploy Preview for rolldown-rs canceled.
|
b66b250 to
f03bf87
Compare
c608578 to
e7f5aa9
Compare
Merge activity
|
Extracted `waitFor` from `waitForPathExists` to use it for `waitForFileToBeModified` in #6259.
f03bf87 to
292f5cd
Compare
Added support for full reloads in the node hmr test infra.
292f5cd to
51820d3
Compare
| if (this.#devOptions?.platform === 'browser') { | ||
| // TODO: send reload message to client | ||
| } | ||
| this.#devEngine?.ensureLatestBuild(); |
There was a problem hiding this comment.
I guess this might be not stable even with adding await.
We need to ensure, before calling node main.js, await this.#devEngine?.ensureLatestBuild(). Just like how did for browser platform.
There was a problem hiding this comment.
My epxectation of the process would be:
(Dev server sending reload message to client) -> (Client recived reload message, finds itself can't handle it, and then send a message to dev server to require reload) -> (Dev server ensures latest build output and reload).
This requires dev server to manage the lifecycle of node process, which is kind of expected I guess? (I wonder if this is how vite-node works.
Dev server needs a http-server to support develpoment for browser. It also makes sense we need a equal concept/tool for node.
I also tried to explore solution that's similar to browser's, which is to implement an reload() in nodejs.
ChatGPT tells that it might be feasible with injecting runtime code that start a new process that responsible to close the previous node process and start a new one.
However, it's just an idea.
Another solution would be the dev-server could brocast a event to notify fixture.test.ts that the build output is fresh.
There was a problem hiding this comment.
The reason of adding this.#devEngine?.ensureLatestBuild(); here is to trigger the rebuild. It doesn't require waiting the build to finish.
The waiting is done at https://github.com/rolldown/rolldown/pull/6259/files#diff-3ea7fe1271d5080b97d22732d516b71771bac38d798d13ad0a4dc1a7d15d325cR156-R159 instead. (it is waiting the file to be output before calling node main.js)
There was a problem hiding this comment.
This requires dev server to manage the lifecycle of node process
Yes, that would be the way if we were to implement it for actual usecases. But that's quite complicated. I implemented a more easy way that would work fine for tests (which is to manage the node process in the test script).
There was a problem hiding this comment.
I wonder if this is how vite-node works.
vite-node simply re-executes the files (and doesn't require restarting the process), because it has the module-runner which is isolated from the actual node's module loader system.
There was a problem hiding this comment.
also tried to explore solution that's similar to browser's, which is to implement an
reload()in nodejs.
It might work. But maybe tricky as the new process spawned would be a child process of the old process. That might cause the new process to close when the old process closes?
## [1.0.0-beta.39] - 2025-09-22 ⚡ MacOS Performance Boost - 10%-30% faster bundling - Up to 45% in extreme cases ### 🚀 Features - rolldown: oxc v0.90.0 + other oxc crate updates (#6274) by @Boshen - support ignoring `/* @vite-ignore */` comment for dynamic imports (#6264) by @IWANABETHATGUY - dev: merge mergeable queued tasks into one (#6253) by @hyf0 - dev: ignore self imports when computing update for invalidate (#6252) by @sapphi-red - support `#__NO_SIDE_EFFECTS__` annotation for export default function declaration (#6239) by @IWANABETHATGUY - rolldown_plugin_dynamic_import_vars: respect `@vite-ignore` comment (#6240) by @shulaoda - rolldown_plugin_import_glob: support `exhaustive` option (#6236) by @shulaoda - cross chunk /* @__NO_SIDE_EFFECTS__ */ support (#6207) by @IWANABETHATGUY - rolldown_plugin_react_refresh_wrapper: make the plugin callable (#6229) by @sapphi-red ### 🐛 Bug Fixes - handle optional chaining in scope hoisting member expression rewriting (#6278) by @shulaoda - release: Fix semver commit release format to use plus instead of dash (#6273) by @Copilot - dev: `ensure_latest_build_output` should work correctly when `eagerBuild: false` (#6262) by @hyf0 - browser: does not work in stackblitz (#6257) by @shulaoda - only inline constants that are not reassigned (#6247) by @IWANABETHATGUY - handle lexical declarations in root scope (#6230) by @IWANABETHATGUY ### 🚜 Refactor - move oxc runtime helper generation from `build.rs` to task generator (#6284) by @shulaoda - remove unused `SpanExt` (#6266) by @IWANABETHATGUY - remove `@rolldown-ignore` ignore comment support (#6265) by @IWANABETHATGUY - enhance CommonJsAstType to track property names (#6250) by @IWANABETHATGUY - simplify usage for `Address::from` (#6245) by @IWANABETHATGUY - remove `stmt_info_idx` in StmtInfo (#6244) by @IWANABETHATGUY - extract `CrossModuleOptimizationRunnerContext` in cross_module_optimization (#6243) by @IWANABETHATGUY - dev: task-queue based deisgn (#6233) by @hyf0 - extract immutable context from AstScanner (#6238) by @IWANABETHATGUY - dev: rename `WatcherEventService` to `BuildDriverService` (#6232) by @hyf0 - move FlatOptions to rolldown_common (#6235) by @IWANABETHATGUY - extract mutable state from ScopeHoistingFinalizerContext (#6234) by @IWANABETHATGUY - wait `this.load` using futures instead of callbacks (#6222) by @sapphi-red - rolldown_plugin_transform: remove unused `runtime_resolve_base` option (#6226) by @sapphi-red ### 📚 Documentation - add "edit this page on GitHub" button (#6241) by @siaeyy ### ⚡ Performance - rolldown: minor performance optimization (#6271) by @Brooooooklyn - rolldown: take advantage of tokio blocking threads (#6270) by @Brooooooklyn ### 🧪 Testing - dev: add rebuild after HMR case (#6260) by @sapphi-red - dev: support full reload in tests (#6259) by @sapphi-red - dev: extract waitFor from waitForPathExists (#6261) by @sapphi-red - add class like cases for empty function optimizations (#6248) by @sapphi-red ### ⚙️ Miscellaneous Tasks - deps: update github-actions (#6298) by @renovate[bot] - deps: update dependency dprint/dprint-plugin-typescript to v0.95.11 (#6296) by @renovate[bot] - deps: update dependency dprint/dprint-plugin-markdown to v0.19.0 (#6295) by @renovate[bot] - deps: update dependency g-plane/pretty_yaml to v0.5.1 (#6294) by @renovate[bot] - use a forked version of openharmony-rs/setup-ohos-sdk (#6290) by @Boshen - deps: update dependency tsdown to v0.15.4 (#6286) by @renovate[bot] - deps: update dependency rolldown-plugin-dts to v0.16.7 (#6285) by @renovate[bot] - rust: continue to make `cargo publish --workspace` work (#6281) by @Boshen - deps: update dependency tsdown to v0.15.3 (#6280) by @renovate[bot] - rust: fixes for `cargo publish --dry-run --workspace` (#6279) by @Boshen - deps: update dependency rust to v1.90.0 (#6277) by @renovate[bot] - deps: update dependency rolldown-plugin-dts to v0.16.6 (#6276) by @renovate[bot] - adding tracing for all sub stage in LinkStage:link (#6268) by @IWANABETHATGUY - deps: update oxc-project/setup-node action to v1.0.4 (#6258) by @renovate[bot] - deps: update github-actions (#6249) by @renovate[bot] - deps: update dependency tsdown to v0.15.2 (#6242) by @renovate[bot] - dev: output error when the initial bundle failed (#6228) by @sapphi-red ### ❤️ New Contributors * @siaeyy made their first contribution in [#6241](#6241)

Added support for full reloads in the node hmr test infra.