Skip to content

Unexpected value in react context given a circular reference #475

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
8 of 10 tasks
SimonSimCity opened this issue May 8, 2025 · 2 comments
Open
8 of 10 tasks

Unexpected value in react context given a circular reference #475

SimonSimCity opened this issue May 8, 2025 · 2 comments

Comments

@SimonSimCity
Copy link

SimonSimCity commented May 8, 2025

Related plugins

Describe the bug

When changing a file (random-component.tsx), containing a circular reference to another component containing a context (value-provider.tsx), the context is set to its initial value.

This creates a problem in my scenario, because the context should never contain the initial values provided, but can (in a normal react life-cycle) only contain the data set in the ValueProvider component. This is known as the provider-pattern (https://medium.com/@vitorbritto/react-design-patterns-provider-pattern-b273ba665158).

I expect the context to never contain the initial value, but always contain the value I designed it to have (see the provider, which always wraps this component), as I have designed my app around this criteria, which always will yield true in production, but seems broken in development. I guess this is due to hot-module-reloading?

I've seen this problem both in react 19 and 18.

Reproduction

https://stackblitz.com/edit/vitejs-vite-22uuzwxi

Steps to reproduce

  1. Run npm install && npm run dev
  2. Open the website (e.g. http://localhost:5173/)
  3. Verify, that you see "Test"2 on the screen.
  4. Open the file src/page-layout.tsx in your favourite editor and replace the 2 in line 9 by 3.
  5. The text on the screen now turns into 3, but I would expect to see "Test"3.

System Info

System:
    OS: macOS 14.4.1
    CPU: (8) arm64 Apple M1
    Memory: 52.91 MB / 16.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 22.15.0 - ~/.nvm/versions/node/v22.15.0/bin/node
    npm: 10.9.2 - ~/.nvm/versions/node/v22.15.0/bin/npm
    pnpm: 9.12.2 - ~/Library/pnpm/pnpm
  Browsers:
    Chrome: 136.0.7103.92
    Safari: 17.4.1
  npmPackages:
    @vitejs/plugin-react: ^4.4.1 => 4.4.1
    vite: ^6.3.2 => 6.3.5

Used Package Manager

pnpm

Logs

The logs before changing the file:
  vite:config config file loaded in 301.28ms +0ms
  vite:env loading env files: [
  vite:env   '/home/projects/vitejs-vite-22uuzwxi/.env',
  vite:env   '/home/projects/vitejs-vite-22uuzwxi/.env.local',
  vite:env   '/home/projects/vitejs-vite-22uuzwxi/.env.development',
  vite:env   '/home/projects/vitejs-vite-22uuzwxi/.env.development.local'
  vite:env ] +0ms
  vite:env env files loaded in 0.82ms +1ms
  vite:env using resolved env: {} +0ms
  vite:config using resolved config: {
  vite:config   plugins: [
  vite:config     'vite:optimized-deps',
  vite:config     'vite:watch-package-data',
  vite:config     'vite:pre-alias',
  vite:config     'alias',
  vite:config     'vite:react-babel',
  vite:config     'vite:react-refresh',
  vite:config     'vite:modulepreload-polyfill',
  vite:config     'vite:resolve',
  vite:config     'vite:html-inline-proxy',
  vite:config     'vite:css',
  vite:config     'vite:esbuild',
  vite:config     'vite:json',
  vite:config     'vite:wasm-helper',
  vite:config     'vite:worker',
  vite:config     'vite:asset',
  vite:config     'vite:wasm-fallback',
  vite:config     'vite:define',
  vite:config     'vite:css-post',
  vite:config     'vite:worker-import-meta-url',
  vite:config     'vite:asset-import-meta-url',
  vite:config     'vite:dynamic-import-vars',
  vite:config     'vite:import-glob',
  vite:config     'vite:client-inject',
  vite:config     'vite:css-analysis',
  vite:config     'vite:import-analysis'
  vite:config   ],
  vite:config   server: {
  vite:config     port: 5173,
  vite:config     strictPort: false,
  vite:config     host: undefined,
  vite:config     allowedHosts: [],
  vite:config     https: undefined,
  vite:config     open: false,
  vite:config     proxy: undefined,
  vite:config     cors: {
  vite:config       origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
  vite:config     },
  vite:config     headers: {},
  vite:config     warmup: { clientFiles: [], ssrFiles: [] },
  vite:config     middlewareMode: false,
  vite:config     fs: {
  vite:config       strict: true,
  vite:config       deny: [ '.env', '.env.*', '*.{crt,pem}', '**/.git/**' ],
  vite:config       allow: [ '/home/projects/vitejs-vite-22uuzwxi' ]
  vite:config     },
  vite:config     preTransformRequests: true,
  vite:config     perEnvironmentStartEndDuringDev: false,
  vite:config     sourcemapIgnoreList: [Function: isInNodeModules$1]
  vite:config   },
  vite:config   esbuild: { jsxDev: true, jsx: 'automatic', jsxImportSource: undefined },
  vite:config   optimizeDeps: {
  vite:config     include: [
  vite:config       'react',
  vite:config       'react-dom',
  vite:config       'react/jsx-dev-runtime',
  vite:config       'react/jsx-runtime'
  vite:config     ],
  vite:config     exclude: [],
  vite:config     needsInterop: [],
  vite:config     extensions: [],
  vite:config     disabled: undefined,
  vite:config     holdUntilCrawlEnd: true,
  vite:config     force: false,
  vite:config     noDiscovery: false,
  vite:config     esbuildOptions: { preserveSymlinks: false, jsx: 'automatic' }
  vite:config   },
  vite:config   build: {
  vite:config     target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
  vite:config     polyfillModulePreload: true,
  vite:config     modulePreload: { polyfill: true },
  vite:config     outDir: 'dist',
  vite:config     assetsDir: 'assets',
  vite:config     assetsInlineLimit: 4096,
  vite:config     sourcemap: false,
  vite:config     terserOptions: {},
  vite:config     rollupOptions: { onwarn: [Function: onwarn] },
  vite:config     commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
  vite:config     dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
  vite:config     write: true,
  vite:config     emptyOutDir: null,
  vite:config     copyPublicDir: true,
  vite:config     manifest: false,
  vite:config     lib: false,
  vite:config     ssrManifest: false,
  vite:config     ssrEmitAssets: false,
  vite:config     reportCompressedSize: true,
  vite:config     chunkSizeWarningLimit: 500,
  vite:config     watch: null,
  vite:config     cssCodeSplit: true,
  vite:config     minify: 'esbuild',
  vite:config     ssr: false,
  vite:config     emitAssets: false,
  vite:config     createEnvironment: [Function: createEnvironment],
  vite:config     cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
  vite:config     cssMinify: true
  vite:config   },
  vite:config   resolve: {
  vite:config     externalConditions: [ 'node' ],
  vite:config     extensions: [
  vite:config       '.mjs',  '.js',
  vite:config       '.mts',  '.ts',
  vite:config       '.jsx',  '.tsx',
  vite:config       '.json'
  vite:config     ],
  vite:config     dedupe: [ 'react', 'react-dom' ],
  vite:config     noExternal: [],
  vite:config     external: [],
  vite:config     preserveSymlinks: false,
  vite:config     alias: [
  vite:config       {
  vite:config         find: /^\/?@vite\/env/,
  vite:config         replacement: '/@fs/home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/env.mjs'
  vite:config       },
  vite:config       {
  vite:config         find: /^\/?@vite\/client/,
  vite:config         replacement: '/@fs/home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/client.mjs'
  vite:config       }
  vite:config     ],
  vite:config     mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
  vite:config     conditions: [ 'module', 'browser', 'development|production' ],
  vite:config     builtins: []
  vite:config   },
  vite:config   environments: {
  vite:config     client: {
  vite:config       define: undefined,
  vite:config       resolve: {
  vite:config         externalConditions: [ 'node' ],
  vite:config         extensions: [
  vite:config           '.mjs',  '.js',
  vite:config           '.mts',  '.ts',
  vite:config           '.jsx',  '.tsx',
  vite:config           '.json'
  vite:config         ],
  vite:config         dedupe: [ 'react', 'react-dom' ],
  vite:config         noExternal: [],
  vite:config         external: [],
  vite:config         preserveSymlinks: false,
  vite:config         alias: [
  vite:config           {
  vite:config             find: /^\/?@vite\/env/,
  vite:config             replacement: '/@fs/home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/env.mjs'
  vite:config           },
  vite:config           {
  vite:config             find: /^\/?@vite\/client/,
  vite:config             replacement: '/@fs/home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/client.mjs'
  vite:config           }
  vite:config         ],
  vite:config         mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
  vite:config         conditions: [ 'module', 'browser', 'development|production' ],
  vite:config         builtins: []
  vite:config       },
  vite:config       keepProcessEnv: false,
  vite:config       consumer: 'client',
  vite:config       optimizeDeps: {
  vite:config         include: [
  vite:config           'react',
  vite:config           'react-dom',
  vite:config           'react/jsx-dev-runtime',
  vite:config           'react/jsx-runtime'
  vite:config         ],
  vite:config         exclude: [],
  vite:config         needsInterop: [],
  vite:config         extensions: [],
  vite:config         disabled: undefined,
  vite:config         holdUntilCrawlEnd: true,
  vite:config         force: false,
  vite:config         noDiscovery: false,
  vite:config         esbuildOptions: { preserveSymlinks: false, jsx: 'automatic' }
  vite:config       },
  vite:config       dev: {
  vite:config         warmup: [],
  vite:config         sourcemap: { js: true },
  vite:config         sourcemapIgnoreList: [Function: isInNodeModules$1],
  vite:config         preTransformRequests: true,
  vite:config         createEnvironment: [Function: defaultCreateClientDevEnvironment],
  vite:config         recoverable: true,
  vite:config         moduleRunnerTransform: false
  vite:config       },
  vite:config       build: {
  vite:config         target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
  vite:config         polyfillModulePreload: true,
  vite:config         modulePreload: { polyfill: true },
  vite:config         outDir: 'dist',
  vite:config         assetsDir: 'assets',
  vite:config         assetsInlineLimit: 4096,
  vite:config         sourcemap: false,
  vite:config         terserOptions: {},
  vite:config         rollupOptions: { onwarn: [Function: onwarn] },
  vite:config         commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
  vite:config         dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
  vite:config         write: true,
  vite:config         emptyOutDir: null,
  vite:config         copyPublicDir: true,
  vite:config         manifest: false,
  vite:config         lib: false,
  vite:config         ssrManifest: false,
  vite:config         ssrEmitAssets: false,
  vite:config         reportCompressedSize: true,
  vite:config         chunkSizeWarningLimit: 500,
  vite:config         watch: null,
  vite:config         cssCodeSplit: true,
  vite:config         minify: 'esbuild',
  vite:config         ssr: false,
  vite:config         emitAssets: true,
  vite:config         createEnvironment: [Function: createEnvironment],
  vite:config         cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
  vite:config         cssMinify: true
  vite:config       }
  vite:config     },
  vite:config     ssr: {
  vite:config       define: undefined,
  vite:config       resolve: {
  vite:config         externalConditions: [ 'node' ],
  vite:config         extensions: [
  vite:config           '.mjs',  '.js',
  vite:config           '.mts',  '.ts',
  vite:config           '.jsx',  '.tsx',
  vite:config           '.json'
  vite:config         ],
  vite:config         dedupe: [ 'react', 'react-dom' ],
  vite:config         noExternal: [],
  vite:config         external: [],
  vite:config         preserveSymlinks: false,
  vite:config         alias: [
  vite:config           {
  vite:config             find: /^\/?@vite\/env/,
  vite:config             replacement: '/@fs/home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/env.mjs'
  vite:config           },
  vite:config           {
  vite:config             find: /^\/?@vite\/client/,
  vite:config             replacement: '/@fs/home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/client.mjs'
  vite:config           }
  vite:config         ],
  vite:config         mainFields: [ 'module', 'jsnext:main', 'jsnext' ],
  vite:config         conditions: [ 'module', 'node', 'development|production' ],
  vite:config         builtins: [
  vite:config           '_http_agent',
  vite:config           '_http_client',
  vite:config           '_http_common',
  vite:config           '_http_incoming',
  vite:config           '_http_outgoing',
  vite:config           '_http_server',
  vite:config           '_stream_duplex',
  vite:config           '_stream_passthrough',
  vite:config           '_stream_readable',
  vite:config           '_stream_transform',
  vite:config           '_stream_wrap',
  vite:config           '_stream_writable',
  vite:config           '_tls_common',
  vite:config           '_tls_wrap',
  vite:config           'assert',
  vite:config           'async_hooks',
  vite:config           'buffer',
  vite:config           'child_process',
  vite:config           'cluster',
  vite:config           'console',
  vite:config           'constants',
  vite:config           'crypto',
  vite:config           'dgram',
  vite:config           'diagnostics_channel',
  vite:config           'dns',
  vite:config           'domain',
  vite:config           'events',
  vite:config           'fs',
  vite:config           'http',
  vite:config           'http2',
  vite:config           'https',
  vite:config           'inspector',
  vite:config           'module',
  vite:config           'net',
  vite:config           'os',
  vite:config           'path',
  vite:config           'perf_hooks',
  vite:config           'process',
  vite:config           'punycode',
  vite:config           'querystring',
  vite:config           'readline',
  vite:config           'repl',
  vite:config           'stream',
  vite:config           'string_decoder',
  vite:config           'sys',
  vite:config           'timers',
  vite:config           'tls',
  vite:config           'trace_events',
  vite:config           'tty',
  vite:config           'url',
  vite:config           'util',
  vite:config           'v8',
  vite:config           'vm',
  vite:config           'wasi',
  vite:config           'worker_threads',
  vite:config           'zlib',
  vite:config           'util/types',
  vite:config           'timers/promises',
  vite:config           'stream/consumers',
  vite:config           'stream/promises',
  vite:config           'stream/web',
  vite:config           'readline/promises',
  vite:config           'path/posix',
  vite:config           'path/win32',
  vite:config           'inspector/promises',
  vite:config           'fs/promises',
  vite:config           'dns/promises',
  vite:config           'assert/strict',
  vite:config           '@blitz/internal/kernel',
  vite:config           '@blitz/internal/platform-browser',
  vite:config           '@blitz/internal/native',
  vite:config           '@blitz/internal/comlink',
  vite:config           '@blitz/internal/git',
  vite:config           '@blitz/internal/message-port',
  vite:config           '@blitz/internal/pty',
  vite:config           '@blitz/internal/env',
  vite:config           '@blitz/env',
  vite:config           '@blitz/pty',
  vite:config           '@blitz/kernel',
  vite:config           '@blitz/platform-browser',
  vite:config           '@blitz/message-port',
  vite:config           /^node:/,
  vite:config           /^npm:/,
  vite:config           /^bun:/
  vite:config         ]
  vite:config       },
  vite:config       keepProcessEnv: true,
  vite:config       consumer: 'server',
  vite:config       optimizeDeps: {
  vite:config         include: [],
  vite:config         exclude: [],
  vite:config         needsInterop: [],
  vite:config         extensions: [],
  vite:config         disabled: undefined,
  vite:config         holdUntilCrawlEnd: true,
  vite:config         force: false,
  vite:config         noDiscovery: true,
  vite:config         esbuildOptions: { preserveSymlinks: false }
  vite:config       },
  vite:config       dev: {
  vite:config         warmup: [],
  vite:config         sourcemap: { js: true },
  vite:config         sourcemapIgnoreList: [Function: isInNodeModules$1],
  vite:config         preTransformRequests: false,
  vite:config         createEnvironment: [Function: defaultCreateDevEnvironment],
  vite:config         recoverable: false,
  vite:config         moduleRunnerTransform: true
  vite:config       },
  vite:config       build: {
  vite:config         target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
  vite:config         polyfillModulePreload: true,
  vite:config         modulePreload: { polyfill: true },
  vite:config         outDir: 'dist',
  vite:config         assetsDir: 'assets',
  vite:config         assetsInlineLimit: 4096,
  vite:config         sourcemap: false,
  vite:config         terserOptions: {},
  vite:config         rollupOptions: { onwarn: [Function: onwarn] },
  vite:config         commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
  vite:config         dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
  vite:config         write: true,
  vite:config         emptyOutDir: null,
  vite:config         copyPublicDir: true,
  vite:config         manifest: false,
  vite:config         lib: false,
  vite:config         ssrManifest: false,
  vite:config         ssrEmitAssets: false,
  vite:config         reportCompressedSize: true,
  vite:config         chunkSizeWarningLimit: 500,
  vite:config         watch: null,
  vite:config         cssCodeSplit: true,
  vite:config         minify: false,
  vite:config         ssr: true,
  vite:config         emitAssets: false,
  vite:config         createEnvironment: [Function: createEnvironment],
  vite:config         cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
  vite:config         cssMinify: 'esbuild'
  vite:config       }
  vite:config     }
  vite:config   },
  vite:config   configFile: '/home/projects/vitejs-vite-22uuzwxi/vite.config.ts',
  vite:config   configFileDependencies: [ '/home/projects/vitejs-vite-22uuzwxi/vite.config.ts' ],
  vite:config   inlineConfig: {
  vite:config     root: undefined,
  vite:config     base: undefined,
  vite:config     mode: undefined,
  vite:config     configFile: undefined,
  vite:config     configLoader: undefined,
  vite:config     logLevel: undefined,
  vite:config     clearScreen: undefined,
  vite:config     server: { host: undefined },
  vite:config     forceOptimizeDeps: undefined
  vite:config   },
  vite:config   root: '/home/projects/vitejs-vite-22uuzwxi',
  vite:config   base: '/',
  vite:config   decodedBase: '/',
  vite:config   rawBase: '/',
  vite:config   publicDir: '/home/projects/vitejs-vite-22uuzwxi/public',
  vite:config   cacheDir: '/home/projects/vitejs-vite-22uuzwxi/node_modules/.vite',
  vite:config   command: 'serve',
  vite:config   mode: 'development',
  vite:config   isWorker: false,
  vite:config   mainConfig: null,
  vite:config   bundleChain: [],
  vite:config   isProduction: false,
  vite:config   css: {
  vite:config     transformer: 'postcss',
  vite:config     preprocessorMaxWorkers: 0,
  vite:config     devSourcemap: false
  vite:config   },
  vite:config   json: { namedExports: true, stringify: 'auto' },
  vite:config   builder: undefined,
  vite:config   preview: {
  vite:config     port: 4173,
  vite:config     strictPort: false,
  vite:config     host: undefined,
  vite:config     allowedHosts: [],
  vite:config     https: undefined,
  vite:config     open: false,
  vite:config     proxy: undefined,
  vite:config     cors: {
  vite:config       origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
  vite:config     },
  vite:config     headers: {}
  vite:config   },
  vite:config   envDir: '/home/projects/vitejs-vite-22uuzwxi',
  vite:config   env: { BASE_URL: '/', MODE: 'development', DEV: true, PROD: false },
  vite:config   assetsInclude: [Function: assetsInclude],
  vite:config   logger: {
  vite:config     hasWarned: false,
  vite:config     info: [Function: info],
  vite:config     warn: [Function: warn],
  vite:config     warnOnce: [Function: warnOnce],
  vite:config     error: [Function: error],
  vite:config     clearScreen: [Function: clearScreen],
  vite:config     hasErrorLogged: [Function: hasErrorLogged]
  vite:config   },
  vite:config   packageCache: Map(1) {
  vite:config     'fnpd_/home/projects/vitejs-vite-22uuzwxi' => {
  vite:config       dir: '/home/projects/vitejs-vite-22uuzwxi',
  vite:config       data: {
  vite:config         name: 'vite-react-typescript-starter',
  vite:config         private: true,
  vite:config         version: '0.0.0',
  vite:config         type: 'module',
  vite:config         scripts: {
  vite:config           dev: 'vite',
  vite:config           build: 'tsc -b && vite build',
  vite:config           lint: 'eslint .',
  vite:config           preview: 'vite preview'
  vite:config         },
  vite:config         dependencies: { react: '^19.1.0', 'react-dom': '^19.1.0' },
  vite:config         devDependencies: {
  vite:config           '@eslint/js': '^9.25.0',
  vite:config           '@types/react': '^19.1.2',
  vite:config           '@types/react-dom': '^19.1.2',
  vite:config           '@vitejs/plugin-react': '^4.4.1',
  vite:config           eslint: '^9.25.0',
  vite:config           'eslint-plugin-react-hooks': '^5.2.0',
  vite:config           'eslint-plugin-react-refresh': '^0.4.19',
  vite:config           globals: '^16.0.0',
  vite:config           typescript: '~5.8.3',
  vite:config           'typescript-eslint': '^8.30.1',
  vite:config           vite: '^6.3.5'
  vite:config         }
  vite:config       },
  vite:config       hasSideEffects: [Function: hasSideEffects],
  vite:config       setResolvedCache: [Function: setResolvedCache],
  vite:config       getResolvedCache: [Function: getResolvedCache]
  vite:config     },
  vite:config     set: [Function (anonymous)]
  vite:config   },
  vite:config   worker: { format: 'iife', plugins: '() => plugins', rollupOptions: {} },
  vite:config   appType: 'spa',
  vite:config   experimental: { importGlobRestoreExtension: false, hmrPartialAccept: false },
  vite:config   future: undefined,
  vite:config   ssr: {
  vite:config     target: 'node',
  vite:config     optimizeDeps: {
  vite:config       esbuildOptions: { preserveSymlinks: false },
  vite:config       include: [],
  vite:config       exclude: [],
  vite:config       needsInterop: [],
  vite:config       extensions: [],
  vite:config       holdUntilCrawlEnd: true,
  vite:config       force: false,
  vite:config       noDiscovery: true
  vite:config     },
  vite:config     external: [],
  vite:config     noExternal: [],
  vite:config     resolve: {
  vite:config       conditions: [ 'module', 'node', 'development|production' ],
  vite:config       externalConditions: [ 'node' ]
  vite:config     }
  vite:config   },
  vite:config   dev: {
  vite:config     warmup: [],
  vite:config     sourcemap: { js: true },
  vite:config     sourcemapIgnoreList: [Function: isInNodeModules$1],
  vite:config     preTransformRequests: false,
  vite:config     createEnvironment: [Function: defaultCreateDevEnvironment],
  vite:config     recoverable: false,
  vite:config     moduleRunnerTransform: false
  vite:config   },
  vite:config   webSocketToken: 'X3KZB80Y8MKu',
  vite:config   getSortedPlugins: [Function: getSortedPlugins],
  vite:config   getSortedPluginHooks: [Function: getSortedPluginHooks],
  vite:config   createResolver: [Function: createResolver],
  vite:config   fsDenyGlob: [Function: arrayMatcher],
  vite:config   safeModulePaths: Set(0) {},
  vite:config   additionalAllowedHosts: []
  vite:config } +8ms
  vite:deps (client) removing old cache dir /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps +0ms
  vite:resolve 0.80ms react -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/index.js +0ms
  vite:resolve 0.47ms react-dom -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react-dom/index.js +1ms
  vite:resolve 0.24ms react/jsx-dev-runtime -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/jsx-dev-runtime.js +0ms
  vite:resolve 0.30ms react/jsx-runtime -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/jsx-runtime.js +1ms
  vite:deps scanning for dependencies... +0ms

  VITE v6.3.5  ready in 1027 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h + enter to show help
  vite:deps Crawling dependencies using entries: 
  vite:deps   /home/projects/vitejs-vite-22uuzwxi/index.html +0ms
  vite:deps ✨ static imports crawl ended +55ms
  vite:resolve 0.37ms /src/main.tsx -> /home/projects/vitejs-vite-22uuzwxi/src/main.tsx +98ms
  vite:resolve 0.52ms react -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/index.js +20ms
  vite:resolve 0.48ms react-dom/client -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react-dom/client.js +11ms
  vite:resolve 0.50ms ./value-provider -> /home/projects/vitejs-vite-22uuzwxi/src/value-provider.tsx +9ms
  vite:resolve 0.59ms ./random-component -> /home/projects/vitejs-vite-22uuzwxi/src/random-component.tsx +11ms
  vite:resolve 0.30ms ./show-value -> /home/projects/vitejs-vite-22uuzwxi/src/show-value.tsx +9ms
  vite:resolve 0.40ms react/jsx-runtime -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/jsx-runtime.js +10ms
  vite:deps Scan completed in 216.11ms: 
  vite:deps   react -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/index.js
  vite:deps   react-dom/client -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react-dom/client.js
  vite:deps   react/jsx-runtime -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/jsx-runtime.js +204ms
  vite:deps creating package.json in /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps_temp_8aa3e3cb +243ms
  vite:resolve 0.62ms react -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react/index.js +188ms
  vite:resolve 0.74ms scheduler -> /home/projects/vitejs-vite-22uuzwxi/node_modules/scheduler/index.js +202ms
  vite:resolve 0.54ms react-dom -> /home/projects/vitejs-vite-22uuzwxi/node_modules/react-dom/index.js +19ms
  vite:html-fallback Rewriting GET / to /index.html +0ms
  vite:time 105.72ms /index.html +0ms
  vite:load 8.96ms [fs] /src/main.tsx +0ms
  vite:resolve 1.39ms /@vite/client -> /home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/client.mjs +358ms
  vite:load 221.14ms [fs] /@vite/client +235ms
  vite:resolve 0.51ms @vite/env -> /home/projects/vitejs-vite-22uuzwxi/node_modules/vite/dist/client/env.mjs +231ms
  vite:import-analysis 6.39ms [1 imports rewritten] node_modules/vite/dist/client/client.mjs +0ms
  vite:transform 11.19ms /@vite/client +0ms
  vite:time 264.39ms /@vite/client +286ms
  vite:load 0.37ms [plugin] /@react-refresh +88ms
  vite:import-analysis 0.67ms [0 imports rewritten] /@react-refresh +80ms
  vite:transform 2.45ms /@react-refresh +79ms
  vite:time 7.32ms /@react-refresh +55ms
  vite:deps Dependencies bundled in 1022.06ms +1s
  vite:load 99.53ms [fs] /node_modules/vite/dist/client/env.mjs +23ms
  vite:import-analysis 0.05ms [no imports] node_modules/vite/dist/client/env.mjs +20ms
  vite:transform 0.56ms /node_modules/vite/dist/client/env.mjs +20ms
  vite:time 2.21ms /node_modules/vite/dist/client/env.mjs +17ms
  vite:deps ✨ using post-scan optimizer result, the scanner found every used dependency +1s
  vite:deps creating _metadata.json in /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps_temp_8aa3e3cb +12ms
  vite:deps renaming /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps_temp_8aa3e3cb to /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps +2ms
  vite:deps ✨ dependencies optimized +5ms
  vite:resolve 0.79ms react/jsx-dev-runtime -> /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +122ms
  vite:resolve 0.86ms react -> /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/react.js?v=a5b02f59 +1ms
  vite:resolve 0.87ms react-dom/client -> /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/react-dom_client.js?v=b2142d24 +0ms
  vite:import-analysis /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 needs interop +21ms
  vite:import-analysis /node_modules/.vite/deps/react.js?v=a5b02f59 needs interop +15ms
  vite:import-analysis /node_modules/.vite/deps/react-dom_client.js?v=b2142d24 needs interop +0ms
  vite:optimize-deps load /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/react_jsx-dev-runtime.js +0ms
  vite:optimize-deps load /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/react.js +0ms
  vite:optimize-deps load /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/react-dom_client.js +0ms
  vite:import-analysis 17.43ms [6 imports rewritten] src/main.tsx +1ms
  vite:transform 381.89ms /src/main.tsx +39ms
  vite:time 367.27ms /src/main.tsx +38ms
  vite:load 11.03ms [fs] /src/value-provider.tsx +48ms
  vite:load 11.10ms [fs] /src/random-component.tsx +0ms
  vite:load 11.11ms [fs] /src/show-value.tsx +0ms
  vite:load 13.15ms [plugin] /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +2ms
  vite:load 13.25ms [plugin] /node_modules/.vite/deps/react.js?v=a5b02f59 +0ms
  vite:resolve 0.27ms ./chunk-UBDIXFPO.js -> /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/chunk-UBDIXFPO.js?v=6a6c8072 +55ms
  vite:optimize-deps load /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/chunk-UBDIXFPO.js +39ms
  vite:import-analysis 1.17ms [1 imports rewritten] node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +39ms
  vite:import-analysis 1.19ms [1 imports rewritten] node_modules/.vite/deps/react.js?v=a5b02f59 +0ms
  vite:transform 26.63ms /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +37ms
  vite:transform 27.36ms /node_modules/.vite/deps/react.js?v=a5b02f59 +1ms
  vite:load 42.46ms [plugin] /node_modules/.vite/deps/react-dom_client.js?v=b2142d24 +29ms
  vite:resolve 0.21ms ./chunk-KBNVMJOC.js -> /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/chunk-KBNVMJOC.js?v=6a6c8072 +19ms
  vite:optimize-deps load /home/projects/vitejs-vite-22uuzwxi/node_modules/.vite/deps/chunk-KBNVMJOC.js +20ms
  vite:import-analysis 13.46ms [2 imports rewritten] node_modules/.vite/deps/react-dom_client.js?v=b2142d24 +20ms
  vite:transform 17.21ms /node_modules/.vite/deps/react-dom_client.js?v=b2142d24 +19ms
  vite:cache [memory] /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +0ms
  vite:time 0.52ms /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +157ms
  vite:cache [memory] /@react-refresh +5ms
  vite:import-analysis /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 needs interop +105ms
  vite:import-analysis /node_modules/.vite/deps/react.js?v=a5b02f59 needs interop +0ms
  vite:cache [memory] /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +2ms
  vite:cache [memory] /node_modules/.vite/deps/react.js?v=a5b02f59 +1ms
  vite:hmr [self-accepts] src/value-provider.tsx +0ms
  vite:import-analysis 3.76ms [4 imports rewritten] src/value-provider.tsx +2ms
  vite:transform 156.97ms /src/value-provider.tsx +109ms
  vite:cache [memory] /node_modules/.vite/deps/react.js?v=a5b02f59 +3ms
  vite:time 0.84ms /node_modules/.vite/deps/react.js?v=a5b02f59 +10ms
  vite:cache [memory] /node_modules/.vite/deps/react-dom_client.js?v=b2142d24 +2ms
  vite:time 1.51ms /node_modules/.vite/deps/react-dom_client.js?v=b2142d24 +2ms
  vite:cache [memory] /src/value-provider.tsx +75ms
  vite:time 0.99ms /src/value-provider.tsx +76ms
  vite:load 210.06ms [plugin] /node_modules/.vite/deps/chunk-UBDIXFPO.js?v=6a6c8072 +207ms
  vite:import-analysis 1.01ms [no imports] node_modules/.vite/deps/chunk-UBDIXFPO.js?v=6a6c8072 +85ms
  vite:transform 2.26ms [skipped] /node_modules/.vite/deps/chunk-UBDIXFPO.js?v=6a6c8072 +84ms
  vite:cache [memory] /@react-refresh +15ms
  vite:cache [memory] /src/value-provider.tsx +1ms
  vite:hmr [self-accepts] src/show-value.tsx +96ms
  vite:import-analysis /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 needs interop +11ms
  vite:cache [memory] /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +1ms
  vite:hmr [self-accepts] src/random-component.tsx +1ms
  vite:import-analysis 5.33ms [2 imports rewritten] src/show-value.tsx +1ms
  vite:import-analysis 5.74ms [3 imports rewritten] src/random-component.tsx +1ms
  vite:transform 253.53ms /src/show-value.tsx +12ms
  vite:transform 254.24ms /src/random-component.tsx +1ms
  vite:time 16.97ms /src/show-value.tsx +18ms
  vite:time 18.60ms /src/random-component.tsx +2ms
  vite:load 209.70ms [plugin] /node_modules/.vite/deps/chunk-KBNVMJOC.js?v=6a6c8072 +19ms
  vite:cache [memory] /node_modules/.vite/deps/chunk-UBDIXFPO.js?v=6a6c8072 +8ms
  vite:import-analysis 1.88ms [1 imports rewritten] node_modules/.vite/deps/chunk-KBNVMJOC.js?v=6a6c8072 +7ms
  vite:transform 2.48ms /node_modules/.vite/deps/chunk-KBNVMJOC.js?v=6a6c8072 +6ms
  vite:cache [memory] /node_modules/.vite/deps/chunk-UBDIXFPO.js?v=6a6c8072 +5ms
  vite:time 3.48ms /node_modules/.vite/deps/chunk-UBDIXFPO.js?v=6a6c8072 +10ms
  vite:cache [memory] /node_modules/.vite/deps/chunk-KBNVMJOC.js?v=6a6c8072 +9ms
  vite:time 0.29ms /node_modules/.vite/deps/chunk-KBNVMJOC.js?v=6a6c8072 +8ms
The logs after changing the file:
  vite:hmr [file change] src/random-component.tsx +16s
  vite:hmr circular imports detected: /src/random-component.tsx -> /src/value-provider.tsx -> /src/random-component.tsx +2ms
17:01:38 [vite] (client) hmr update /src/random-component.tsx
  vite:hmr (ssr) [no modules matched] src/random-component.tsx +4ms
  vite:load 3.07ms [fs] /src/random-component.tsx +16s
  vite:cache [memory] /@react-refresh +16s
  vite:import-analysis /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 needs interop +16s
  vite:cache [memory-hmr] /src/value-provider.tsx +14ms
  vite:cache [memory] /node_modules/.vite/deps/react_jsx-dev-runtime.js?v=a5b02f59 +0ms
  vite:cache [memory] /@react-refresh +0ms
  vite:cache [memory] /node_modules/.vite/deps/react.js?v=a5b02f59 +1ms
  vite:hmr [self-accepts] src/random-component.tsx +72ms
  vite:import-analysis 16.33ms [3 imports rewritten] src/random-component.tsx +12ms
  vite:transform 63.78ms /src/random-component.tsx +16s
  vite:time 69.76ms /src/random-component.tsx +16s
  vite:cache [memory] /src/value-provider.tsx +11ms
  vite:time 0.60ms /src/value-provider.tsx +6ms

Validations

@hi-ogawa
Copy link
Collaborator

hi-ogawa commented May 9, 2025

It looks like this is due to HMR. "Easier-to-say" suggestion is to avoid cyclic import, but this might be technically a bug.

When modifying random-component.tsx, it will (soft) invalidate importers and client will run new module random-component.tsx?t=xxx, but due to cyclic import it will also run value-provider.tsx?t=xxx but not show-value.tsx?t=xxx, thus ShowValue is accessing an old context, which is not rendered anymore (I think).

Probably more well-defined behavior would be to have full-reload at the point value-provider.tsx?t=xxx is run during HMR, but current behavior might be saving some other cyclic imports scenario where HMR can work in general, so this choice might be trade-off.

@ArnaudBarre
Copy link
Member

Your doing two things that are know to break HMR in Vite: circular references and not following https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#consistent-components-exports

If you fix one or the other it should work. I've created a lint rule proveded in the default template that can help with following consistent exports. For React context, this requires having two files: one for context + hook, and one for the provider.

Also for top level singleton context for which initial value is known ahead of time, zustand is a good replacement of React context for me with less boilerplate

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants