diff --git a/justfile b/justfile index 568db64a24d54e..d4ae9ad619939c 100644 --- a/justfile +++ b/justfile @@ -1,2 +1,13 @@ build-vite: pnpm --filter vite run build-bundle + +test-serve: + pnpm run test-serve + +test-build: + pnpm run test-build + +test: test-serve test-build + +fmt: + pnpm --filter vite run format diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 01c70ba46a7130..bb85d898fa4383 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -494,6 +494,14 @@ export interface ExperimentalOptions { * @default false */ skipSsrTransform?: boolean + + /** + * Enable builtin plugin that written by rust, which is faster than js plugin. + * + * @experimental + * @default true + */ + enableNativePlugin?: boolean } export interface LegacyOptions { @@ -1243,6 +1251,7 @@ export async function resolveConfig( experimental: { importGlobRestoreExtension: false, hmrPartialAccept: false, + enableNativePlugin: false, ...config.experimental, }, future: config.future, diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts index 24032d3046ff8a..f4bc90978e943e 100644 --- a/packages/vite/src/node/plugins/index.ts +++ b/packages/vite/src/node/plugins/index.ts @@ -1,5 +1,15 @@ import aliasPlugin, { type ResolverFunction } from '@rollup/plugin-alias' import type { ObjectHook } from 'rolldown' +import { + aliasPlugin as nativeAliasPlugin, + dynamicImportVarsPlugin as nativeDynamicImportVarsPlugin, + importGlobPlugin as nativeImportGlobPlugin, + jsonPlugin as nativeJsonPlugin, + modulePreloadPolyfillPlugin as nativeModulePreloadPolyfillPlugin, + transformPlugin as nativeTransformPlugin, + wasmFallbackPlugin as nativeWasmFallbackPlugin, + wasmHelperPlugin as nativeWasmHelperPlugin, +} from 'rolldown/experimental' import type { PluginHookUtils, ResolvedConfig } from '../config' import { isDepOptimizationDisabled } from '../optimizer' import type { HookHandler, Plugin, PluginWithRequiredHook } from '../plugin' @@ -42,21 +52,35 @@ export async function resolvePlugins( Object.values(config.environments).some( (environment) => !isDepOptimizationDisabled(environment.dev.optimizeDeps), ) + const enableNativePlugin = config.experimental.enableNativePlugin return [ depOptimizationEnabled ? optimizedDepsPlugin() : null, isBuild ? metadataPlugin() : null, !isWorker ? watchPackageDataPlugin(config.packageCache) : null, preAliasPlugin(config), - aliasPlugin({ - entries: config.resolve.alias, - customResolver: viteAliasCustomResolver, - }), + enableNativePlugin + ? nativeAliasPlugin({ + entries: config.resolve.alias.map((item) => { + return { + find: item.find, + replacement: item.replacement, + } + }), + }) + : aliasPlugin({ + entries: config.resolve.alias, + customResolver: viteAliasCustomResolver, + }), ...prePlugins, modulePreload !== false && modulePreload.polyfill - ? modulePreloadPolyfillPlugin(config) + ? enableNativePlugin + ? nativeModulePreloadPolyfillPlugin({ + skip: Boolean(config.command !== 'build' || config.build.ssr), + }) + : modulePreloadPolyfillPlugin(config) : null, resolvePlugin( { @@ -73,29 +97,46 @@ export async function resolvePlugins( ), htmlInlineProxyPlugin(config), cssPlugin(config), - config.esbuild !== false ? esbuildPlugin(config) : null, - jsonPlugin( - { - namedExports: true, - ...config.json, - }, - isBuild, - ), - wasmHelperPlugin(), + config.esbuild !== false + ? enableNativePlugin + ? nativeTransformPlugin() + : esbuildPlugin(config) + : null, + enableNativePlugin + ? nativeJsonPlugin({ + stringify: config.json?.stringify, + isBuild, + }) + : jsonPlugin( + { + namedExports: true, + ...config.json, + }, + isBuild, + ), + enableNativePlugin ? nativeWasmHelperPlugin() : wasmHelperPlugin(), webWorkerPlugin(config), assetPlugin(config), ...normalPlugins, - wasmFallbackPlugin(), + enableNativePlugin ? nativeWasmFallbackPlugin() : wasmFallbackPlugin(), + // TODO: support nativedefinePlugin definePlugin(config), cssPostPlugin(config), isBuild && buildHtmlPlugin(config), workerImportMetaUrlPlugin(config), assetImportMetaUrlPlugin(config), ...buildPlugins.pre, - dynamicImportVarsPlugin(config), - importGlobPlugin(config), + enableNativePlugin + ? nativeDynamicImportVarsPlugin() + : dynamicImportVarsPlugin(config), + enableNativePlugin + ? nativeImportGlobPlugin({ + root: config.root, + restoreQueryExtension: config.experimental.importGlobRestoreExtension, + }) + : importGlobPlugin(config), ...postPlugins,