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.
Removed executors
Section titled “Removed executors”| Plugin | Removed executors |
|---|---|
@nx/cypress | cypress |
@nx/detox | build, test |
@nx/eslint | lint |
@nx/expo | build, export, install, prebuild, run, serve, start, submit |
@nx/jest | jest |
@nx/next | build, server |
@nx/playwright | playwright |
@nx/react-native | build-android, build-ios, bundle, pod-install, run-android, run-ios, start, upgrade |
@nx/rollup | rollup |
@nx/rspack | rspack, dev-server |
@nx/storybook | storybook, build |
@nx/vite | build, dev-server, preview-server |
@nx/vitest | test |
@nx/webpack | webpack, 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.
Removed programmatic exports
Section titled “Removed programmatic exports”Code that imported an executor function directly needs to call the tool instead.
| Package | Removed exports |
|---|---|
@nx/playwright | playwrightExecutor |
@nx/rollup | rollupExecutor, createRollupOptions |
@nx/vite/executors | viteBuildExecutor, viteDevServerExecutor, vitePreviewServerExecutor |
@nx/vitest/executors | vitestExecutor |
@nx/webpack | webpackExecutor, WebpackExecutorEvent |
The executor option types, such as ViteBuildExecutorOptions and PlaywrightExecutorSchema, are still exported.
Changed generator APIs
Section titled “Changed generator APIs”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:
// Beforeawait getViteE2EWebServerInfo(tree, 'my-app', configFilePath, true, 4200);// Afterawait getViteE2EWebServerInfo(tree, 'my-app', configFilePath, 4200);Migrate
Section titled “Migrate”Run the standard migration. Each affected plugin ships a remove-deprecated-executors migration that converts your projects.
nx migrate latestnx migrate --run-migrationsThe 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.
Migrate a single plugin
Section titled “Migrate a single plugin”To convert one plugin ahead of the upgrade, run its generator directly:
nx g @nx/vite:convert-to-inferredPass --project to convert a single project instead of the whole workspace.
After migrating
Section titled “After migrating”Verify that the project graph still loads and that your tasks still run:
nx show projectsnx run-many -t build test lintFor the details of what convert-to-inferred changes and the options it cannot migrate, see Convert to inferred and Troubleshoot convert-to-inferred.