{"record":{"id":"edb663e72b3b47e0","repo":"solidjs/solid","slug":"computations-created-outside-a-createroot-or-re","errorCode":null,"errorMessage":"computations created outside a `createRoot` or `render` will never be disposed","messagePattern":"computations created outside a `createRoot` or `render` will never be disposed","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/solid/src/reactive/signal.ts","lineNumber":1469,"sourceCode":"    updatedAt: null,\n    owned: null,\n    sources: null,\n    sourceSlots: null,\n    cleanups: null,\n    value: init,\n    owner: Owner,\n    context: Owner ? Owner.context : null,\n    pure\n  };\n\n  if (Transition && Transition.running) {\n    c.state = 0;\n    c.tState = state;\n  }\n\n  if (Owner === null)\n    IS_DEV &&\n      console.warn(\n        \"computations created outside a `createRoot` or `render` will never be disposed\"\n      );\n  else if (Owner !== UNOWNED) {\n    if (Transition && Transition.running && (Owner as Memo<Init, Next>).pure) {\n      if (!(Owner as Memo<Init, Next>).tOwned) (Owner as Memo<Init, Next>).tOwned = [c];\n      else (Owner as Memo<Init, Next>).tOwned!.push(c);\n    } else {\n      if (!Owner.owned) Owner.owned = [c];\n      else Owner.owned.push(c);\n    }\n  }\n\n  if (IS_DEV && options && options.name) c.name = options.name;\n\n  if (ExternalSourceConfig && c.fn) {\n    const sourceFn = c.fn;\n    const [track, trigger] = createSignal<void>(undefined, { equals: false });\n    const ordinary = ExternalSourceConfig.factory(sourceFn, trigger);","sourceCodeStart":1451,"sourceCodeEnd":1487,"githubUrl":"https://github.com/solidjs/solid/blob/f47845f9cc16ecbb316aa6560c7161f45af9a3d8/packages/solid/src/reactive/signal.ts#L1451-L1487","documentation":"When a computation (createEffect/createMemo/createComputed etc.) is created with Owner === null, it is attached to the global UNOWNED graph and will never be disposed automatically, leaking memory and updates. Solid logs this dev-only warning; in production the computation still runs, just unowned.","triggerScenarios":"Calling createEffect/createComputed/createMemo at module scope or outside render()/createRoot; standalone reactive setups in scripts, workers, or top-level await contexts.","commonSituations":"Bootstrapping reactive logic at app entry before render; extracting effects into non-component utilities; SSR code paths creating effects outside roots.","solutions":["Wrap the reactive setup in createRoot(dispose => ...) so computations get an owner","Move the effect inside a component rendered by render(), which creates its own root","For intentionally global effects, accept the warning in dev or use a dedicated root island you dispose on shutdown"],"exampleFix":"// before\ncreateEffect(() => document.title = title()); // module scope: never disposed\n\n// after\ncreateRoot((dispose) => {\n  createEffect(() => (document.title = title()));\n  // call dispose() when the app tears down\n});","handlingStrategy":"validation","validationCode":"import { getOwner, createRoot } from 'solid-js';\nexport function withRoot<T>(fn: () => T): T {\n  return getOwner() ? fn() : createRoot((dispose) => { const r = fn(); queueMicrotask(dispose); return r; });\n}","typeGuard":"import { getOwner } from 'solid-js';\nconst hasOwner = (): boolean => getOwner() !== null;","tryCatchPattern":null,"preventionTips":["Create effects only inside a root (render or createRoot)","Dispose standalone roots when their island unmounts","Audit module-scope reactive calls during code review"],"tags":["solid","createeffect","owner","memory-leak","dev-warning"],"backgroundTag":"lifecycle-outside-reactive-root","analyzedSha":"f47845f9cc16ecbb316aa6560c7161f45af9a3d8","analyzedAt":"2026-08-27T05:39:24.283Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}