HMR

Open
#3 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
25/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
react, typescript, vite

Research direction

Start by reproducing the HMR behavior with the example files a.ts and b.ts using the documented steps: edit the beginning of b.ts, change the counter, and inspect the logger output. Done means hot replacement preserves store state and does not create duplicate units, connections, or logger executions; the issue leaves the implementation choice open.

Written by the indexing model from the issue text.

Description

question

There are two issues related with hot module replacement(HMR), these issues is following:

  1. keep states of stores between module replacements
  2. avoid duplicates of units and connection between units

For example we have two files a.ts and b.ts:

// a.ts

import { createEvent } from "effector";

export const reset = createEvent();
export const inc = createEvent();
export const dec = createEvent();
// b.ts

import { inc, dec, reset } from "./a";
import { attach, createStore, sample } from "effector";

export const $count = createStore(0)
  .on(inc, (count) => count + 1)
  .on(dec, (count) => count - 1)
  .reset(reset);

const logFx = attach({
  source: $count,
  effect(count) {
    console.log("COUNT: ", count);
  },
});

sample({
  clock: $count,
  target: logFx,
});
import { $count } from "./a";
import { inc, dec } from "./b";
import { useStore } from "effector-react";
import React from "react";

export function App() {
  const count = useStore($count);

  return (
    <>
      <div>Count: {count}</div>
      <button onClick={() => inc()}>+</button>
      <button onClick={() => dec()}>-</button>
    </>
  );
}

When we start project this files will be compiled and executed by compiler, so we will have one set of units and connections. But when we make a change, vite's hmr will replace changed module and the compiler compiles and executes the changed module again. After all we have two copies of units and connections. Thus, we get a copy for each replaced module.

How to reproduce:

  1. make change in the beginning of the b.ts file
  2. increase or decrease counter
  3. check console, when logger effect fired twice

What I think about possible solutions.:

  1. For the second issue: we could create domain for each module and wrap up all content of module in withRegion, and when hmr is fired we could clean replaced module
  2. For both issues: we need a more stable sids that is not related from position in file and can keep between hmr
Dominant language
TypeScript
Stars
22
Forks
2
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from effector/vite-react-template

All issues in effector/vite-react-template

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.