From d7231eaef92d04fb01880b1ae15bacc649e5df66 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Tue, 10 Sep 2024 15:20:06 +0800 Subject: [PATCH] feat: add experimental.enableNativePlugin (#41) 2cf0eb2dca47d436f65df5fe81373183c675c3e6 fe71cbc5fb4c0766d024fe1df5b44c15121ee71b Co-authored-by: IWANABETHATGUY --- justfile | 11 ++++ packages/vite/src/node/config.ts | 9 ++++ packages/vite/src/node/plugins/index.ts | 67 +++++++++++++++++++++---- 3 files changed, 76 insertions(+), 11 deletions(-) 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 d84dfe96e3e878..368b33ef3bd04b 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -504,6 +504,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 { @@ -1401,6 +1409,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 32b7ecb3318cd4..de7c6a707c3fd5 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' @@ -41,21 +51,35 @@ export async function resolvePlugins( Object.values(config.environments).some( (environment) => !isDepOptimizationDisabled(environment.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({ root: config.root, @@ -68,23 +92,44 @@ export async function resolvePlugins( }), htmlInlineProxyPlugin(config), cssPlugin(config), - config.esbuild !== false ? esbuildPlugin(config) : null, - jsonPlugin(config.json, isBuild), - wasmHelperPlugin(), + config.esbuild !== false + ? enableNativePlugin + ? nativeTransformPlugin() + : esbuildPlugin(config) + : null, + enableNativePlugin + ? nativeJsonPlugin({ + // TODO: support `json.stringify: 'auto'` and `json.namedExports` + stringify: + !config.json?.stringify || config.json.stringify === 'auto' + ? false + : config.json?.stringify, + isBuild, + }) + : jsonPlugin(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,