Skip to content

Commit 393d1bc

Browse files
sapphi-redunderfinIWANABETHATGUY
committed
feat: use OXC for transform
Co-authored-by: underfin <2218301630@qq.com> Co-authored-by: IWANABETHATGUY <iwanabethatguy@qq.com>
1 parent e8cbd79 commit 393d1bc

File tree

14 files changed

+738
-15
lines changed

14 files changed

+738
-15
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.61.2",
8889
"esbuild": "^0.25.0",
8990
"picomatch": "^4.0.2",
9091
"postcss": "^8.5.3",

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 */
@@ -1581,6 +1588,17 @@ export async function resolveConfig(
15811588

15821589
const preview = resolvePreviewOptions(config.preview, server)
15831590

1591+
let oxc: OxcOptions | false | undefined = config.oxc
1592+
if (config.esbuild) {
1593+
if (config.oxc) {
1594+
logger.warn(
1595+
`Found esbuild and oxc options, will use oxc and ignore esbuild at transformer.`,
1596+
)
1597+
} else {
1598+
oxc = convertEsbuildConfigToOxcConfig(config.esbuild, logger)
1599+
}
1600+
}
1601+
15841602
resolved = {
15851603
configFile: configFile ? normalizePath(configFile) : undefined,
15861604
configFileDependencies: configFileDependencies.map((name) =>
@@ -1602,13 +1620,27 @@ export async function resolveConfig(
16021620
plugins: userPlugins, // placeholder to be replaced
16031621
css: resolveCSSOptions(config.css),
16041622
json: mergeWithDefaults(configDefaults.json, config.json ?? {}),
1623+
// preserve esbuild for buildEsbuildPlugin
16051624
esbuild:
16061625
config.esbuild === false
16071626
? false
16081627
: {
16091628
jsxDev: !isProduction,
16101629
...config.esbuild,
16111630
},
1631+
oxc:
1632+
oxc === false
1633+
? false
1634+
: {
1635+
...oxc,
1636+
jsx:
1637+
typeof oxc?.jsx === 'string'
1638+
? oxc.jsx
1639+
: {
1640+
development: oxc?.jsx?.development ?? !isProduction,
1641+
...oxc?.jsx,
1642+
},
1643+
},
16121644
server,
16131645
builder,
16141646
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 {
@@ -145,6 +146,7 @@ export type {
145146
export type { JsonOptions } from './plugins/json'
146147
export type { TransformOptions as EsbuildTransformOptions } from 'esbuild'
147148
export type { ESBuildOptions, ESBuildTransformResult } from './plugins/esbuild'
149+
export type { OxcOptions } from './plugins/oxc'
148150
export type { Manifest, ManifestChunk } from './plugins/manifest'
149151
export type { ResolveOptions, InternalResolveOptions } from './plugins/resolve'
150152
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)