Skip to content

Nx 24 removes 35 executors that were deprecated in Nx 23. Each removed executor has an inferred equivalent provided by its plugin, so the task you ran before still runs after the migration, just without an executor entry in your project configuration.

Installing Nx 24 does not break a workspace that still references these executors. The project graph still loads, and nx migrate still runs. Tasks that use a removed executor fail until you complete the migration.

PluginRemoved executors
@nx/cypresscypress
@nx/detoxbuild, test
@nx/eslintlint
@nx/expobuild, export, install, prebuild, run, serve, start, submit
@nx/jestjest
@nx/nextbuild, server
@nx/playwrightplaywright
@nx/react-nativebuild-android, build-ios, bundle, pod-install, run-android, run-ios, start, upgrade
@nx/rolluprollup
@nx/rspackrspack, dev-server
@nx/storybookstorybook, build
@nx/vitebuild, dev-server, preview-server
@nx/vitesttest
@nx/webpackwebpack, dev-server

The old @nrwl-scoped aliases of these executors are removed as well.

Executors that have no inferred equivalent stay: @nx/expo:build-list, @nx/expo:sync-deps, @nx/expo:update, @nx/expo:ensure-symlink, @nx/react-native:storybook, @nx/react-native:sync-deps, @nx/react-native:ensure-symlink, @nx/webpack:ssr-dev-server, @nx/rspack:ssr-dev-server, @nx/playwright:merge-reports, and @nx/playwright:wait-for-webserver.

Code that imported an executor function directly needs to call the tool instead.

PackageRemoved exports
@nx/playwrightplaywrightExecutor
@nx/rolluprollupExecutor, createRollupOptions
@nx/vite/executorsviteBuildExecutor, viteDevServerExecutor, vitePreviewServerExecutor
@nx/vitest/executorsvitestExecutor
@nx/webpackwebpackExecutor, WebpackExecutorEvent

The executor option types, such as ViteBuildExecutorOptions and PlaywrightExecutorSchema, are still exported.

Generators no longer accept the addPlugin option. They always add their inference plugin, so remove addPlugin from code that calls them.

The @nx/react:setup-ssr generator is removed. It configured server builds on the removed @nx/webpack:webpack and @nx/rspack:rspack executors.

getViteE2EWebServerInfo and getReactRouterE2EWebServerInfo from @nx/vite, getWebpackE2EWebServerInfo from @nx/webpack, getRspackE2EWebServerInfo from @nx/rspack and getRsbuildE2EWebServerInfo from @nx/rsbuild no longer take the isPluginBeingAdded argument. The port override moves up to the fourth argument, and the Vite helpers take the CI port override fifth:

// Before
await getViteE2EWebServerInfo(tree, 'my-app', configFilePath, true, 4200);
// After
await getViteE2EWebServerInfo(tree, 'my-app', configFilePath, 4200);

Run the standard migration. Each affected plugin ships a remove-deprecated-executors migration that converts your projects.

Terminal window
nx migrate latest
nx migrate --run-migrations

The migration runs convert-to-inferred for every project that uses a removed executor. It moves each target's options into the tool's own configuration file, registers the plugin in nx.json, and preserves your target names and configurations.

Some options have no equivalent outside the executor. The migration reports those rather than dropping them silently, so read its output before committing.

To convert one plugin ahead of the upgrade, run its generator directly:

Terminal window
nx g @nx/vite:convert-to-inferred

Pass --project to convert a single project instead of the whole workspace.

Verify that the project graph still loads and that your tasks still run:

Terminal window
nx show projects
nx run-many -t build test lint

For the details of what convert-to-inferred changes and the options it cannot migrate, see Convert to inferred and Troubleshoot convert-to-inferred.