Skip to content

prevent frequent rerenders#895

Merged
hatemhosny merged 1 commit intodevelopfrom
prevent-frequent-rerenders
Oct 8, 2025
Merged

prevent frequent rerenders#895
hatemhosny merged 1 commit intodevelopfrom
prevent-frequent-rerenders

Conversation

@hatemhosny
Copy link
Copy Markdown
Collaborator

@hatemhosny hatemhosny commented Oct 8, 2025

Summary by CodeRabbit

  • Bug Fixes

    • Prevents rare infinite reload loops during full-page previews.
    • Avoids duplicate runs triggered in rapid succession, reducing unexpected reloads.
  • Performance & Stability

    • Improves live preview reliability by tracking recent runs to skip redundant reloads.
    • Delivers a smoother, less flickery experience during quick edits and reloads.

@netlify
Copy link
Copy Markdown

netlify Bot commented Oct 8, 2025

Deploy Preview for livecodes ready!

Name Link
🔨 Latest commit 43b1f62
🔍 Latest deploy log https://app.netlify.com/projects/livecodes/deploys/68e5ace24990a10008743bb3
😎 Deploy Preview https://deploy-preview-895--livecodes.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented Oct 8, 2025

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented Oct 8, 2025

Deploying livecodes with  Cloudflare Pages  Cloudflare Pages

Latest commit: 43b1f62
Status: ✅  Deploy successful!
Preview URL: https://c257cea8.livecodes.pages.dev
Branch Preview URL: https://prevent-frequent-rerenders.livecodes.pages.dev

View logs

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Oct 8, 2025

Walkthrough

Adds a lastRun state to track the prior iframe run. In the iframe creation/full-page reload path, introduces a time-and-result guard: if a new result matches the previous and occurred within 500 ms, it is treated as already loaded. Updates lastRun timestamp and result whenever issuing a full-page postMessage.

Changes

Cohort / File(s) Summary
Iframe run guard and state tracking
src/livecodes/core.ts
Added lastRun state (timestamp and result). Extended full-page reload logic with a 500 ms guard comparing current result to lastRun. Updated lastRun on each full-page postMessage to detect repeated runs within a short window.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User as User
  participant Core as Core (core.ts)
  participant Iframe as Preview Iframe

  User->>Core: Trigger run (full-page path)
  Core->>Core: Compute newResult
  alt Guard: recent duplicate (<=500ms) AND result matches lastRun
    Note over Core: Treat as already loaded
    Core-->>User: Skip reload/postMessage
  else Proceed with reload
    Core->>Iframe: postMessage(newResult)
    Note over Core: Update lastRun = { now, newResult }
    Iframe-->>Core: load/ack (async)
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

I tapped the run, then paused mid-bounce—
A twin result? The guard announced.
Within a whisker’s half a sec,
No loop to chase, no double check.
I nibble logs, ears high, content—
One hop, one load, a tidy event.

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title “prevent frequent rerenders” accurately captures the primary change of adding logic to track the last iframe run and guard against rapid repeated reloads, clearly summarizing the main functionality introduced.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch prevent-frequent-rerenders

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 and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Oct 8, 2025

Size Change: -115 B (-0.01%)

Total Size: 956 kB

ℹ️ View Unchanged
Filename Size Change
./build/404.html 1 kB 0 B
./build/app.html 250 B 0 B
./build/index.html 2.47 kB +6 B (+0.24%)
./build/livecodes/app.css 22.4 kB 0 B
./build/livecodes/app.js 111 kB -30 B (-0.03%)
./build/livecodes/assets.js 8.64 kB +26 B (+0.3%)
./build/livecodes/assets/noop.js 18 B 0 B
./build/livecodes/assets/templates/diagrams-starter.html 2.19 kB 0 B
./build/livecodes/backup.js 3.73 kB 0 B
./build/livecodes/blockly.js 13.3 kB 0 B
./build/livecodes/broadcast.js 1.19 kB -1 B (-0.08%)
./build/livecodes/bundle-types.js 4.37 kB 0 B
./build/livecodes/code-to-image.js 9.09 kB -9 B (-0.1%)
./build/livecodes/codejar.js 17.6 kB 0 B
./build/livecodes/codemirror.js 6.33 kB 0 B
./build/livecodes/compile.page.js 2.39 kB 0 B
./build/livecodes/compile.worker.js 14.3 kB 0 B
./build/livecodes/compiler-utils.js 3.18 kB 0 B
./build/livecodes/custom-editor-utils.js 198 B 0 B
./build/livecodes/deploy.js 6.87 kB -38 B (-0.55%)
./build/livecodes/editor-settings.js 17.7 kB -10 B (-0.06%)
./build/livecodes/embed-ui.js 5.55 kB -1 B (-0.02%)
./build/livecodes/embed.js 89.4 kB -19 B (-0.02%)
./build/livecodes/export.js 3.89 kB 0 B
./build/livecodes/firebase.js 22.7 kB 0 B
./build/livecodes/format.worker.js 13.4 kB 0 B
./build/livecodes/google-fonts.js 7.12 kB 0 B
./build/livecodes/headless.js 78.2 kB -5 B (-0.01%)
./build/livecodes/i18n-ar-language-info.json 5.23 kB 0 B
./build/livecodes/i18n-ar-translation.json 9.33 kB 0 B
./build/livecodes/i18n-de-language-info.json 5.25 kB 0 B
./build/livecodes/i18n-de-translation.json 9.44 kB 0 B
./build/livecodes/i18n-en-language-info.json 4.53 kB 0 B
./build/livecodes/i18n-en-translation.json 8.03 kB 0 B
./build/livecodes/i18n-es-language-info.json 5 kB 0 B
./build/livecodes/i18n-es-translation.json 9.17 kB 0 B
./build/livecodes/i18n-fa-language-info.json 5.35 kB 0 B
./build/livecodes/i18n-fa-translation.json 9.48 kB 0 B
./build/livecodes/i18n-fr-language-info.json 5.17 kB 0 B
./build/livecodes/i18n-fr-translation.json 9.42 kB 0 B
./build/livecodes/i18n-hi-language-info.json 5.78 kB 0 B
./build/livecodes/i18n-hi-translation.json 9.95 kB 0 B
./build/livecodes/i18n-it-language-info.json 5.04 kB 0 B
./build/livecodes/i18n-it-translation.json 9.26 kB 0 B
./build/livecodes/i18n-ja-language-info.json 5.57 kB 0 B
./build/livecodes/i18n-ja-translation.json 9.61 kB 0 B
./build/livecodes/i18n-pt-language-info.json 5.05 kB 0 B
./build/livecodes/i18n-pt-translation.json 9.35 kB 0 B
./build/livecodes/i18n-ru-language-info.json 5.56 kB 0 B
./build/livecodes/i18n-ru-translation.json 10.3 kB 0 B
./build/livecodes/i18n-ur-language-info.json 5.81 kB 0 B
./build/livecodes/i18n-ur-translation.json 9.78 kB 0 B
./build/livecodes/i18n-zh-CN-language-info.json 4.9 kB 0 B
./build/livecodes/i18n-zh-CN-translation.json 8.64 kB 0 B
./build/livecodes/i18n.js 20.2 kB -50 B (-0.25%)
./build/livecodes/import-src.js 16 kB 0 B
./build/livecodes/import.js 14.5 kB -11 B (-0.08%)
./build/livecodes/index.js 5.37 kB +18 B (+0.34%)
./build/livecodes/lang-art-template-compiler.js 1.65 kB 0 B
./build/livecodes/lang-assemblyscript-compiler.js 290 B 0 B
./build/livecodes/lang-assemblyscript-script.js 386 B 0 B
./build/livecodes/lang-astro-compiler.js 2.34 kB 0 B
./build/livecodes/lang-clio-compiler.js 1.55 kB 0 B
./build/livecodes/lang-commonlisp-script.js 123 B 0 B
./build/livecodes/lang-cpp-script.js 1.75 kB 0 B
./build/livecodes/lang-cpp-wasm-script.js 2.84 kB 0 B
./build/livecodes/lang-csharp-wasm-script.js 2.18 kB 0 B
./build/livecodes/lang-diagrams-compiler-esm.js 5.09 kB 0 B
./build/livecodes/lang-dot-compiler.js 1.66 kB 0 B
./build/livecodes/lang-ejs-compiler.js 1.63 kB 0 B
./build/livecodes/lang-eta-compiler.js 1.65 kB 0 B
./build/livecodes/lang-fennel-compiler.js 1.61 kB 0 B
./build/livecodes/lang-gleam-compiler.js 3.09 kB 0 B
./build/livecodes/lang-go-wasm-script.js 3.26 kB 0 B
./build/livecodes/lang-haml-compiler.js 1.65 kB 0 B
./build/livecodes/lang-handlebars-compiler.js 1.92 kB 0 B
./build/livecodes/lang-imba-compiler.js 147 B 0 B
./build/livecodes/lang-java-script.js 4.05 kB 0 B
./build/livecodes/lang-jinja-compiler.js 1.65 kB 0 B
./build/livecodes/lang-julia-script.js 3.3 kB 0 B
./build/livecodes/lang-liquid-compiler.js 1.68 kB 0 B
./build/livecodes/lang-lua-wasm-script.js 205 B 0 B
./build/livecodes/lang-malina-compiler.js 2.96 kB 0 B
./build/livecodes/lang-mustache-compiler.js 1.65 kB 0 B
./build/livecodes/lang-nunjucks-compiler.js 1.93 kB 0 B
./build/livecodes/lang-perl-script.js 268 B 0 B
./build/livecodes/lang-php-wasm-script.js 347 B 0 B
./build/livecodes/lang-postgresql-compiler-esm.js 1.73 kB 0 B
./build/livecodes/lang-prolog-script.js 204 B 0 B
./build/livecodes/lang-pug-compiler.js 371 B 0 B
./build/livecodes/lang-python-wasm-script.js 1.86 kB 0 B
./build/livecodes/lang-r-script-esm.js 2.44 kB 0 B
./build/livecodes/lang-rescript-compiler-esm.js 2.16 kB 0 B
./build/livecodes/lang-rescript-formatter.js 1.52 kB 0 B
./build/livecodes/lang-riot-compiler.js 2.81 kB 0 B
./build/livecodes/lang-ruby-wasm-script.js 1.71 kB 0 B
./build/livecodes/lang-scss-compiler.js 1.71 kB 0 B
./build/livecodes/lang-solid-compiler.js 263 B 0 B
./build/livecodes/lang-sql-compiler.js 1.64 kB 0 B
./build/livecodes/lang-sql-script.js 1.95 kB 0 B
./build/livecodes/lang-svelte-compiler.js 4.69 kB 0 B
./build/livecodes/lang-tcl-script.js 1.82 kB 0 B
./build/livecodes/lang-teal-compiler.js 1.72 kB 0 B
./build/livecodes/lang-twig-compiler.js 1.64 kB 0 B
./build/livecodes/lang-vento-compiler.js 1.68 kB 0 B
./build/livecodes/lang-vue-compiler.js 6.09 kB 0 B
./build/livecodes/lang-vue2-compiler.js 3.47 kB 0 B
./build/livecodes/lang-wat-compiler.js 348 B 0 B
./build/livecodes/lang-wat-script.js 1.58 kB 0 B
./build/livecodes/language-info.js 7.71 kB +2 B (+0.03%)
./build/livecodes/monaco-lang-astro.js 947 B 0 B
./build/livecodes/monaco-lang-clio.js 639 B 0 B
./build/livecodes/monaco-lang-imba.js 7.35 kB 0 B
./build/livecodes/monaco-lang-wat.js 2.46 kB 0 B
./build/livecodes/monaco.js 10.1 kB 0 B
./build/livecodes/open.js 6.2 kB +1 B (+0.02%)
./build/livecodes/processor-lightningcss-compiler.js 1.88 kB 0 B
./build/livecodes/processor-postcss-compiler.js 2.02 kB 0 B
./build/livecodes/processor-tailwindcss-compiler.js 5.19 kB 0 B
./build/livecodes/processor-unocss-compiler.js 355 B 0 B
./build/livecodes/processor-windicss-compiler.js 450 B 0 B
./build/livecodes/quill.css 697 B 0 B
./build/livecodes/quill.js 5.76 kB 0 B
./build/livecodes/resources.js 3.43 kB +1 B (+0.03%)
./build/livecodes/result-utils.js 1.17 kB 0 B
./build/livecodes/share.js 3.81 kB -2 B (-0.05%)
./build/livecodes/snippets.js 6.05 kB +5 B (+0.08%)
./build/livecodes/sync-ui.js 3.25 kB +2 B (+0.06%)
./build/livecodes/sync.js 3.52 kB 0 B
./build/livecodes/sync.worker.js 29.7 kB 0 B
./build/livecodes/templates.js 25.4 kB 0 B
./build/sdk/livecodes.js 3.96 kB 0 B
./build/sdk/livecodes.umd.js 4.02 kB 0 B
./build/sdk/package.json 291 B 0 B
./build/sdk/react.js 4.26 kB 0 B
./build/sdk/vue.js 4.35 kB 0 B

compressed-size-action

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/livecodes/core.ts (1)

341-344: Effective guard against duplicate renders.

The condition properly checks for duplicate results within a 500ms window, preventing unnecessary iframe reloads. The logic is sound:

  • Checks are ordered efficiently (no result → local loaded flag → lastRun check)
  • String comparison with === correctly compares result content
  • Early return prevents the postMessage from firing for duplicates

Consider extracting the 500ms threshold as a named constant for maintainability:

+const RERENDER_DEBOUNCE_MS = 500;
+
 let lastRun = { time: 0, result: '' };
 const createIframe = (container: HTMLElement, result = '', service = sandboxService) =>

Then use it in the condition:

-        if (!result || loaded || (lastRun.result === result && Date.now() - lastRun.time < 500)) {
+        if (!result || loaded || (lastRun.result === result && Date.now() - lastRun.time < RERENDER_DEBOUNCE_MS)) {
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7b4906d and 43b1f62.

📒 Files selected for processing (1)
  • src/livecodes/core.ts (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Redirect rules - livecodes
  • GitHub Check: Header rules - livecodes
  • GitHub Check: Pages changed - livecodes
  • GitHub Check: build (18.x)
  • GitHub Check: tests (18.x, 2)
  • GitHub Check: tests (18.x, 4)
  • GitHub Check: tests (18.x, 5)
  • GitHub Check: tests (18.x, 3)
  • GitHub Check: tests (18.x, 1)
  • GitHub Check: build (18.x)
🔇 Additional comments (2)
src/livecodes/core.ts (2)

264-264: LGTM! Clear initialization for rerender prevention.

The lastRun state variable is well-initialized with sensible defaults (time: 0 ensures the first run always proceeds). The module-level scope is appropriate for tracking state across multiple createIframe calls to prevent rapid successive reloads.


347-347: LGTM! Proper state update after successful message post.

The lastRun update is correctly placed after the postMessage call, ensuring the state only reflects successful operations. Creating a new object (rather than mutating) is good practice and avoids potential reference issues.

@hatemhosny hatemhosny merged commit 5c6383c into develop Oct 8, 2025
20 checks passed
@hatemhosny hatemhosny deleted the prevent-frequent-rerenders branch October 8, 2025 01:08
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