Skip to content

Commit d678e52

Browse files
sapphi-redunderfinIWANABETHATGUY
committed
feat: use OXC for transform
Co-authored-by: underfin <[email protected]> Co-authored-by: IWANABETHATGUY <[email protected]>
1 parent 6681f0a commit d678e52

File tree

15 files changed

+740
-17
lines changed

15 files changed

+740
-17
lines changed

packages/vite/index.cjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const asyncFunctions = [
1515
'createServer',
1616
'preview',
1717
'transformWithEsbuild',
18+
'transformWithOxc',
1819
'resolveConfig',
1920
'optimizeDeps',
2021
'formatPostcssSourceMap',

packages/vite/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
},
8686
"//": "READ CONTRIBUTING.md to understand what to put under deps vs. devDeps!",
8787
"dependencies": {
88+
"@oxc-project/runtime": "^0.53.0",
8889
"esbuild": "^0.25.0",
8990
"postcss": "^8.5.3",
9091
"rolldown": "1.0.0-beta.3-commit.62fba31"

packages/vite/rollup.dts.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ const identifierReplacements: Record<string, Record<string, string>> = {
5454
TransformPluginContext$1: 'rolldown.TransformPluginContext',
5555
TransformResult$1: 'rolldown.TransformResult',
5656
},
57+
'rolldown/experimental': {
58+
TransformOptions$2: 'rolldown_experimental_TransformOptions',
59+
TransformResult$3: 'rolldown_experimental_TransformResult',
60+
},
5761
esbuild: {
5862
TransformResult$2: 'esbuild_TransformResult',
5963
TransformOptions$1: 'esbuild_TransformOptions',

packages/vite/src/node/__tests__/plugins/import.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ describe('transformCjsImport', () => {
7575
),
7676
).toBe(
7777
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
78-
`const react = ((m) => m?.__esModule ? m : { ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, default: m })(__vite__cjsImport0_react)`,
78+
'const react = ((m) => m?.__esModule ? m : {\n' +
79+
'\t...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {},\n' +
80+
'\tdefault: m\n' +
81+
'})(__vite__cjsImport0_react)',
7982
)
8083
})
8184

packages/vite/src/node/build.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import {
5555
mergeWithDefaults,
5656
normalizePath,
5757
partialEncodeURIPath,
58+
unique,
5859
} from './utils'
5960
import { perEnvironmentPlugin, resolveEnvironmentPlugins } from './plugin'
6061
import { manifestPlugin } from './plugins/manifest'
@@ -84,6 +85,7 @@ import {
8485
createFilterForTransform,
8586
createIdFilter,
8687
} from './plugins/pluginFilter'
88+
import { buildOxcPlugin } from './plugins/oxc'
8789

8890
export interface BuildEnvironmentOptions {
8991
/**
@@ -434,6 +436,11 @@ export function resolveBuildEnvironmentOptions(
434436
if (merged.target === 'modules') {
435437
merged.target = ESBUILD_MODULES_TARGET
436438
}
439+
// dedupe target
440+
if (Array.isArray(merged.target)) {
441+
// esbuild allowed duplicate targets but oxc does not
442+
merged.target = unique(merged.target)
443+
}
437444

438445
// normalize false string into actual false
439446
if ((merged.minify as string) === 'false') {
@@ -487,7 +494,8 @@ export async function resolveBuildPlugins(config: ResolvedConfig): Promise<{
487494
],
488495
post: [
489496
buildImportAnalysisPlugin(config),
490-
buildEsbuildPlugin(),
497+
buildOxcPlugin(),
498+
...(config.build.minify === 'esbuild' ? [buildEsbuildPlugin()] : []),
491499
terserPlugin(config),
492500
...(!config.isWorker
493501
? [manifestPlugin(), ssrManifestPlugin(), buildReporterPlugin(config)]

packages/vite/src/node/config.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ import { createIdResolver } from './idResolver'
103103
import { runnerImport } from './ssr/runnerImport'
104104
import { getAdditionalAllowedHosts } from './server/middlewares/hostCheck'
105105
import { convertEsbuildPluginToRolldownPlugin } from './optimizer/pluginConverter'
106+
import { type OxcOptions, convertEsbuildConfigToOxcConfig } from './plugins/oxc'
106107

107108
const debug = createDebugger('vite:config', { depth: 10 })
108109
const promisifiedRealpath = promisify(fs.realpath)
@@ -354,6 +355,11 @@ export interface UserConfig extends DefaultEnvironmentOptions {
354355
* Or set to `false` to disable esbuild.
355356
*/
356357
esbuild?: ESBuildOptions | false
358+
/**
359+
* Transform options to pass to esbuild.
360+
* Or set to `false` to disable OXC.
361+
*/
362+
oxc?: OxcOptions | false
357363
/**
358364
* Specify additional picomatch patterns to be treated as static assets.
359365
*/
@@ -596,6 +602,7 @@ export interface ResolvedConfig
596602
css: ResolvedCSSOptions
597603
json: Required<JsonOptions>
598604
esbuild: ESBuildOptions | false
605+
oxc: OxcOptions | false
599606
server: ResolvedServerOptions
600607
dev: ResolvedDevEnvironmentOptions
601608
/** @experimental */
@@ -1553,6 +1560,17 @@ export async function resolveConfig(
15531560

15541561
const preview = resolvePreviewOptions(config.preview, server)
15551562

1563+
let oxc: OxcOptions | false | undefined = config.oxc
1564+
if (config.esbuild) {
1565+
if (config.oxc) {
1566+
logger.warn(
1567+
`Found esbuild and oxc options, will use oxc and ignore esbuild at transformer.`,
1568+
)
1569+
} else {
1570+
oxc = convertEsbuildConfigToOxcConfig(config.esbuild, logger)
1571+
}
1572+
}
1573+
15561574
resolved = {
15571575
configFile: configFile ? normalizePath(configFile) : undefined,
15581576
configFileDependencies: configFileDependencies.map((name) =>
@@ -1574,13 +1592,27 @@ export async function resolveConfig(
15741592
plugins: userPlugins, // placeholder to be replaced
15751593
css: resolveCSSOptions(config.css),
15761594
json: mergeWithDefaults(configDefaults.json, config.json ?? {}),
1595+
// preserve esbuild for buildEsbuildPlugin
15771596
esbuild:
15781597
config.esbuild === false
15791598
? false
15801599
: {
15811600
jsxDev: !isProduction,
15821601
...config.esbuild,
15831602
},
1603+
oxc:
1604+
oxc === false
1605+
? false
1606+
: {
1607+
...oxc,
1608+
jsx:
1609+
typeof oxc?.jsx === 'string'
1610+
? oxc.jsx
1611+
: {
1612+
development: oxc?.jsx?.development ?? !isProduction,
1613+
...oxc?.jsx,
1614+
},
1615+
},
15841616
server,
15851617
builder,
15861618
preview,

packages/vite/src/node/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export { createIdResolver } from './idResolver'
1919

2020
export { formatPostcssSourceMap, preprocessCSS } from './plugins/css'
2121
export { transformWithEsbuild } from './plugins/esbuild'
22+
export { transformWithOxc } from './plugins/oxc'
2223
export { buildErrorMessage } from './server/middlewares/error'
2324

2425
export {
@@ -139,6 +140,7 @@ export type {
139140
export type { JsonOptions } from './plugins/json'
140141
export type { TransformOptions as EsbuildTransformOptions } from 'esbuild'
141142
export type { ESBuildOptions, ESBuildTransformResult } from './plugins/esbuild'
143+
export type { OxcOptions } from './plugins/oxc'
142144
export type { Manifest, ManifestChunk } from './plugins/manifest'
143145
export type { ResolveOptions, InternalResolveOptions } from './plugins/resolve'
144146
export type { SplitVendorChunkCache } from './plugins/splitVendorChunk'

packages/vite/src/node/optimizer/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ import {
2828
tryStatSync,
2929
unique,
3030
} from '../utils'
31-
import { transformWithEsbuild } from '../plugins/esbuild'
3231
import { METADATA_FILENAME } from '../constants'
3332
import { isWindows } from '../../shared/utils'
3433
import type { Environment } from '../environment'
34+
import { transformWithOxc } from '../plugins/oxc'
3535
import { ScanEnvironment, scanImports } from './scan'
3636
import { createOptimizeDepsIncludeResolver, expandGlobIds } from './resolve'
3737
import {
@@ -1126,10 +1126,10 @@ export async function extractExportsData(
11261126
if (lang !== 'jsx' && lang !== 'tsx' && lang !== 'ts') {
11271127
throw new Error(`Unable to parse : ${filePath}.`)
11281128
}
1129-
const transformed = await transformWithEsbuild(
1129+
const transformed = await transformWithOxc(
11301130
entryContent,
11311131
filePath,
1132-
{ loader: lang },
1132+
{ lang },
11331133
undefined,
11341134
environment.config,
11351135
)

packages/vite/src/node/plugins/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { watchPackageDataPlugin } from '../packages'
66
import { jsonPlugin } from './json'
77
import { resolvePlugin } from './resolve'
88
import { optimizedDepsPlugin } from './optimizedDeps'
9-
import { esbuildPlugin } from './esbuild'
109
import { importAnalysisPlugin } from './importAnalysis'
1110
import { cssAnalysisPlugin, cssPlugin, cssPostPlugin } from './css'
1211
import { assetPlugin } from './asset'
@@ -27,6 +26,7 @@ import {
2726
createFilterForTransform,
2827
createIdFilter,
2928
} from './pluginFilter'
29+
import { oxcPlugin } from './oxc'
3030

3131
export async function resolvePlugins(
3232
config: ResolvedConfig,
@@ -67,7 +67,7 @@ export async function resolvePlugins(
6767
}),
6868
htmlInlineProxyPlugin(config),
6969
cssPlugin(config),
70-
config.esbuild !== false ? esbuildPlugin(config) : null,
70+
config.oxc !== false ? oxcPlugin(config) : null,
7171
jsonPlugin(config.json, isBuild),
7272
wasmHelperPlugin(),
7373
webWorkerPlugin(config),

0 commit comments

Comments
 (0)