withastro/astro · warning

More than one JSX renderer is enabled. This will lead to une

Error message

More than one JSX renderer is enabled. This will lead to unexpected behavior unless you set the `include` or `exclude` option. See https://docs.astro.build/en/guides/integrations-guide/solid-js/#combining-multiple-jsx-frameworks for more information.

What it means

The Solid integration performs the same astro:config:done cross-check as React/Preact: it scans config.integrations for known JSX renderers and warns when two or more are enabled while options.include/options.exclude were not passed to solid(). Without disjoint file scopes, Vite's JSX transform is ambiguous and components from one framework get compiled with another's runtime.

Source

Thrown at packages/integrations/solid/src/index.ts:124

				});

				addRenderer(getContainerRendererImpl());
				updateConfig({
					vite: getViteConfiguration(options, devtoolsPlugin, solidPackages.ssr.noExternal),
				});

				if (devtoolsPlugin) {
					injectScript('page', 'import "solid-devtools";');
				}
			},
			'astro:config:done': ({ logger, config }) => {
				const knownJsxRenderers = ['@astrojs/react', '@astrojs/preact', '@astrojs/solid-js'];
				const enabledKnownJsxRenderers = config.integrations.filter((renderer) =>
					knownJsxRenderers.includes(renderer.name),
				);

				if (enabledKnownJsxRenderers.length > 1 && !options.include && !options.exclude) {
					logger.warn(
						'More than one JSX renderer is enabled. This will lead to unexpected behavior unless you set the `include` or `exclude` option. See https://docs.astro.build/en/guides/integrations-guide/solid-js/#combining-multiple-jsx-frameworks for more information.',
					);
				}
			},
		},
	};
}

function configEnvironmentPlugin(solidNoExternal: string[]): Plugin {
	return {
		name: '@astrojs/solid:config-environment',
		configEnvironment(environmentName) {
			if (environmentName === 'client') {
				return {
					optimizeDeps: {
						include: ['@astrojs/solid-js/client.js'],
						exclude: ['@astrojs/solid-js/server.js'],
					},

View on GitHub (pinned to 52e6c34790)

Solutions

  1. Give each JSX integration disjoint globs, e.g. solid({ include: ['**/solid/**'] }) and react({ include: ['**/react/**'] }).
  2. Remove integrations for frameworks the project does not use.
  3. Restart dev/build to re-run the config hook and verify the warning is gone.

Example fix

// before
export default defineConfig({
  integrations: [solid(), react()],
});

// after
export default defineConfig({
  integrations: [
    solid({ include: ['**/solid/**'], exclude: ['**/react/**'] }),
    react({ include: ['**/react/**'], exclude: ['**/solid/**'] }),
  ],
});
Defensive patterns

Strategy: validation

Validate before calling

const jsxIntegrations = ['@astrojs/react', '@astrojs/preact', '@astrojs/solid-js'];
const enabled = config.integrations.filter((i) => jsxIntegrations.includes(i.name));
if (enabled.length > 1 && !(options.include || options.exclude)) {
  throw new Error('Multiple JSX renderers require include/exclude scopes on solid()');
}

Prevention

When it happens

Trigger: astro.config.mjs registers solid() alongside react() and/or preact(), and the solid() call passes no include/exclude option. enabledKnownJsxRenderers.length > 1 triggers the warning at config completion.

Common situations: Mixing a Solid component library into a React Astro site during incremental migration; templates that install multiple framework integrations for demos; forgetting that solid-js components need their own glob when React is also present.

Related errors


AI-assisted analysis of withastro/astro@52e6c34790 (2026-08-18). Data as JSON: /api/errors/0a7b861516874eea. Report an issue: GitHub.