feat(rspack,webpack): add rspack builder (#29142)

Co-authored-by: "yangjian.fe" <yangjian.fe@bytedance.com>
Co-authored-by: underfin <likui6666666@gmail.com>
This commit is contained in:
Daniel Roe 2024-10-09 15:57:54 +02:00
parent 0f210e3170
commit e207f7e993
No known key found for this signature in database
GPG Key ID: CBC814C393D93268
40 changed files with 647 additions and 150 deletions

View File

@ -191,7 +191,7 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest]
env: ["dev", "built"]
builder: ["vite", "webpack"]
builder: ["vite", "rspack", "webpack"]
context: ["async", "default"]
manifest: ["manifest-on", "manifest-off"]
version: ["v4", "v3"]
@ -200,12 +200,18 @@ jobs:
exclude:
- builder: "webpack"
payload: "js"
- builder: "rspack"
payload: "js"
- manifest: "manifest-off"
payload: "js"
- context: "default"
payload: "js"
- os: windows-latest
payload: "js"
- env: "dev"
builder: "rspack"
- manifest: "manifest-off"
builder: "rspack"
- env: "dev"
builder: "webpack"
- manifest: "manifest-off"

View File

@ -35,6 +35,7 @@
},
"resolutions": {
"@nuxt/kit": "workspace:*",
"@nuxt/rspack-builder": "workspace:*",
"@nuxt/schema": "workspace:*",
"@nuxt/ui-templates": "workspace:*",
"@nuxt/vite-builder": "workspace:*",
@ -58,6 +59,7 @@
"@eslint/js": "9.12.0",
"@nuxt/eslint-config": "0.5.7",
"@nuxt/kit": "workspace:*",
"@nuxt/rspack-builder": "workspace:*",
"@nuxt/test-utils": "3.14.3",
"@nuxt/webpack-builder": "workspace:*",
"@testing-library/vue": "8.1.0",

View File

@ -6,6 +6,7 @@ export default defineBuildConfig({
'src/index',
],
externals: [
'@rspack/core',
'@nuxt/schema',
'nitropack',
'webpack',

View File

@ -48,6 +48,7 @@
"untyped": "^1.5.1"
},
"devDependencies": {
"@rspack/core": "1.0.8",
"@types/hash-sum": "1.0.2",
"@types/lodash-es": "4.17.12",
"@types/semver": "7.5.8",

View File

@ -1,4 +1,5 @@
import type { Configuration as WebpackConfig, WebpackPluginInstance } from 'webpack'
import type { RspackPluginInstance } from '@rspack/core'
import type { UserConfig as ViteConfig, Plugin as VitePlugin } from 'vite'
import { useNuxt } from './context'
import { toArray } from './utils'
@ -36,16 +37,7 @@ export interface ExtendWebpackConfigOptions extends ExtendConfigOptions {}
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
export interface ExtendViteConfigOptions extends ExtendConfigOptions {}
/**
* Extend webpack config
*
* The fallback function might be called multiple times
* when applying to both client and server builds.
*/
export function extendWebpackConfig (
fn: ((config: WebpackConfig) => void),
options: ExtendWebpackConfigOptions = {},
) {
const extendWebpackCompatibleConfig = (builder: 'rspack' | 'webpack') => (fn: ((config: WebpackConfig) => void), options: ExtendWebpackConfigOptions = {}) => {
const nuxt = useNuxt()
if (options.dev === false && nuxt.options.dev) {
@ -55,7 +47,7 @@ export function extendWebpackConfig (
return
}
nuxt.hook('webpack:config', (configs: WebpackConfig[]) => {
nuxt.hook(`${builder}:config`, (configs) => {
if (options.server !== false) {
const config = configs.find(i => i.name === 'server')
if (config) {
@ -71,13 +63,25 @@ export function extendWebpackConfig (
})
}
/**
* Extend webpack config
*
* The fallback function might be called multiple times
* when applying to both client and server builds.
*/
export const extendWebpackConfig = extendWebpackCompatibleConfig('webpack')
/**
* Extend rspack config
*
* The fallback function might be called multiple times
* when applying to both client and server builds.
*/
export const extendRspackConfig = extendWebpackCompatibleConfig('rspack')
/**
* Extend Vite config
*/
export function extendViteConfig (
fn: ((config: ViteConfig) => void),
options: ExtendViteConfigOptions = {},
) {
export function extendViteConfig (fn: ((config: ViteConfig) => void), options: ExtendViteConfigOptions = {}) {
const nuxt = useNuxt()
if (options.dev === false && nuxt.options.dev) {
@ -114,6 +118,18 @@ export function addWebpackPlugin (pluginOrGetter: WebpackPluginInstance | Webpac
config.plugins[method](...toArray(plugin))
}, options)
}
/**
* Append rspack plugin to the config.
*/
export function addRspackPlugin (pluginOrGetter: RspackPluginInstance | RspackPluginInstance[] | (() => RspackPluginInstance | RspackPluginInstance[]), options?: ExtendWebpackConfigOptions) {
extendRspackConfig((config) => {
const method: 'push' | 'unshift' = options?.prepend ? 'unshift' : 'push'
const plugin = typeof pluginOrGetter === 'function' ? pluginOrGetter() : pluginOrGetter
config.plugins = config.plugins || []
config.plugins[method](...toArray(plugin))
}, options)
}
/**
* Append Vite plugin to the config.
@ -131,6 +147,7 @@ export function addVitePlugin (pluginOrGetter: VitePlugin | VitePlugin[] | (() =
interface AddBuildPluginFactory {
vite?: () => VitePlugin | VitePlugin[]
webpack?: () => WebpackPluginInstance | WebpackPluginInstance[]
rspack?: () => RspackPluginInstance | RspackPluginInstance[]
}
export function addBuildPlugin (pluginFactory: AddBuildPluginFactory, options?: ExtendConfigOptions) {
@ -141,4 +158,8 @@ export function addBuildPlugin (pluginFactory: AddBuildPluginFactory, options?:
if (pluginFactory.webpack) {
addWebpackPlugin(pluginFactory.webpack, options)
}
if (pluginFactory.rspack) {
addRspackPlugin(pluginFactory.rspack, options)
}
}

View File

@ -8,6 +8,7 @@ export function normalizeSemanticVersion (version: string) {
}
const builderMap = {
'@nuxt/rspack-builder': 'rspack',
'@nuxt/vite-builder': 'vite',
'@nuxt/webpack-builder': 'webpack',
}

View File

@ -13,7 +13,7 @@ export type { LoadNuxtOptions } from './loader/nuxt'
// Utils
export { addImports, addImportsDir, addImportsSources } from './imports'
export { updateRuntimeConfig, useRuntimeConfig } from './runtime-config'
export { addBuildPlugin, addVitePlugin, addWebpackPlugin, extendViteConfig, extendWebpackConfig } from './build'
export { addBuildPlugin, addVitePlugin, addRspackPlugin, addWebpackPlugin, extendViteConfig, extendRspackConfig, extendWebpackConfig } from './build'
export type { ExtendConfigOptions, ExtendViteConfigOptions, ExtendWebpackConfigOptions } from './build'
export { assertNuxtCompatibility, checkNuxtCompatibility, getNuxtVersion, hasNuxtCompatibility, isNuxtMajorVersion, normalizeSemanticVersion, isNuxt2, isNuxt3 } from './compatibility'
export { addComponent, addComponentsDir } from './components'

View File

@ -276,16 +276,18 @@ export default defineNuxtModule<ComponentsOptions>({
}
})
nuxt.hook('webpack:config', (configs) => {
configs.forEach((config) => {
const mode = config.name === 'client' ? 'client' : 'server'
config.plugins = config.plugins || []
for (const key of ['rspack:config', 'webpack:config'] as const) {
nuxt.hook(key, (configs) => {
configs.forEach((config) => {
const mode = config.name === 'client' ? 'client' : 'server'
config.plugins = config.plugins || []
if (mode !== 'server') {
writeFileSync(join(nuxt.options.buildDir, 'components-chunk.mjs'), 'export const paths = {}')
}
if (mode !== 'server') {
writeFileSync(join(nuxt.options.buildDir, 'components-chunk.mjs'), 'export const paths = {}')
}
})
})
})
}
}
},
})

View File

@ -338,7 +338,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
}
}
if (nuxt.options.builder === '@nuxt/webpack-builder' || nuxt.options.dev) {
if (nuxt.options.dev || nuxt.options.builder === '@nuxt/webpack-builder' || nuxt.options.builder === '@nuxt/rspack-builder') {
nitroConfig.virtual!['#build/dist/server/styles.mjs'] = 'export default {}'
// In case a non-normalized absolute path is called for on Windows
if (process.platform === 'win32') {
@ -449,18 +449,20 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
}
}
})
nuxt.hook('webpack:config', (configuration) => {
const clientConfig = configuration.find(config => config.name === 'client')
if (!clientConfig!.resolve) { clientConfig!.resolve!.alias = {} }
if (Array.isArray(clientConfig!.resolve!.alias)) {
clientConfig!.resolve!.alias.push({
name: 'vue',
alias: 'vue/dist/vue.esm-bundler',
})
} else {
clientConfig!.resolve!.alias!.vue = 'vue/dist/vue.esm-bundler'
}
})
for (const hook of ['webpack:config', 'rspack:config'] as const) {
nuxt.hook(hook, (configuration) => {
const clientConfig = configuration.find(config => config.name === 'client')
if (!clientConfig!.resolve) { clientConfig!.resolve!.alias = {} }
if (Array.isArray(clientConfig!.resolve!.alias)) {
clientConfig!.resolve!.alias.push({
name: 'vue',
alias: 'vue/dist/vue.esm-bundler',
})
} else {
clientConfig!.resolve!.alias!.vue = 'vue/dist/vue.esm-bundler'
}
})
}
}
// Setup handlers
@ -545,13 +547,15 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) {
// nuxt dev
if (nuxt.options.dev) {
nuxt.hook('webpack:compile', ({ name, compiler }) => {
if (name === 'server') {
const memfs = compiler.outputFileSystem as typeof import('node:fs')
nitro.options.virtual['#build/dist/server/server.mjs'] = () => memfs.readFileSync(join(nuxt.options.buildDir, 'dist/server/server.mjs'), 'utf-8')
}
})
nuxt.hook('webpack:compiled', () => { nuxt.server.reload() })
for (const builder of ['webpack', 'rspack'] as const) {
nuxt.hook(`${builder}:compile`, ({ name, compiler }) => {
if (name === 'server') {
const memfs = compiler.outputFileSystem as typeof import('node:fs')
nitro.options.virtual['#build/dist/server/server.mjs'] = () => memfs.readFileSync(join(nuxt.options.buildDir, 'dist/server/server.mjs'), 'utf-8')
}
})
nuxt.hook(`${builder}:compiled`, () => { nuxt.server.reload() })
}
nuxt.hook('vite:compiled', () => { nuxt.server.reload() })
nuxt.hook('server:devHandler', (h) => { devMiddlewareHandler.set(h) })

View File

@ -497,9 +497,11 @@ async function initNuxt (nuxt: Nuxt) {
const envMap = {
// defaults from `builder` based on package name
'@nuxt/rspack-builder': '@rspack/core/module',
'@nuxt/vite-builder': 'vite/client',
'@nuxt/webpack-builder': 'webpack/module',
// simpler overrides from `typescript.builder` for better DX
'rspack': '@rspack/core/module',
'vite': 'vite/client',
'webpack': 'webpack/module',
// default 'merged' builder environment for module authors

View File

@ -0,0 +1,18 @@
import { defineBuildConfig } from 'unbuild'
import config from '../webpack/build.config'
export default defineBuildConfig({
...config[0],
externals: [
'@rspack/core',
'#builder',
'@nuxt/schema',
],
entries: [
{
input: '../webpack/src/index',
name: 'index',
declaration: true,
},
],
})

View File

@ -0,0 +1,5 @@
import webpack from '@rspack/core'
export const builder = 'rspack'
export { webpack }
export const MiniCssExtractPlugin = webpack.CssExtractRspackPlugin

View File

@ -0,0 +1,94 @@
{
"name": "@nuxt/rspack-builder",
"version": "3.12.2",
"repository": {
"type": "git",
"url": "git+https://github.com/nuxt/nuxt.git",
"directory": "packages/rspack"
},
"description": "rspack bundler for Nuxt",
"homepage": "https://nuxt.com",
"license": "MIT",
"type": "module",
"types": "./dist/index.d.ts",
"imports": {
"#builder": "./builder.mjs"
},
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs"
},
"./dist/*": "./dist/*"
},
"files": [
"dist",
"builder.mjs"
],
"scripts": {
"prepack": "unbuild"
},
"dependencies": {
"@nuxt/friendly-errors-webpack-plugin": "^2.6.0",
"@nuxt/kit": "workspace:*",
"@rspack/core": "^1.0.8",
"autoprefixer": "^10.4.20",
"css-loader": "^7.1.2",
"css-minimizer-webpack-plugin": "^7.0.0",
"cssnano": "^7.0.6",
"defu": "^6.1.4",
"esbuild-loader": "^4.2.2",
"escape-string-regexp": "^5.0.0",
"estree-walker": "^3.0.3",
"file-loader": "^6.2.0",
"fork-ts-checker-webpack-plugin": "^9.0.2",
"globby": "^14.0.2",
"h3": "npm:h3-nightly@2.0.0-1718872656.6765a6e",
"hash-sum": "^2.0.0",
"jiti": "^2.3.3",
"knitwork": "^1.1.0",
"lodash-es": "4.17.21",
"magic-string": "^0.30.11",
"memfs": "^4.13.0",
"mlly": "^1.7.2",
"ohash": "^1.1.4",
"pathe": "^1.1.2",
"pify": "^6.1.0",
"postcss": "^8.4.47",
"postcss-import": "^16.1.0",
"postcss-import-resolver": "^2.0.0",
"postcss-loader": "^8.1.1",
"postcss-url": "^10.1.3",
"pug-plain-loader": "^1.1.0",
"std-env": "^3.7.0",
"time-fix-plugin": "^2.0.7",
"ufo": "^1.5.4",
"unenv": "^1.10.0",
"unplugin": "^1.14.1",
"url-loader": "^4.1.1",
"vue-bundle-renderer": "^2.1.1",
"vue-loader": "^17.4.2",
"webpack-bundle-analyzer": "^4.10.2",
"webpack-dev-middleware": "^7.4.2",
"webpack-hot-middleware": "^2.26.1",
"webpack-virtual-modules": "^0.6.2",
"webpackbar": "^6.0.1"
},
"devDependencies": {
"@nuxt/schema": "workspace:*",
"@types/hash-sum": "1.0.2",
"@types/lodash-es": "4.17.12",
"@types/pify": "5.0.4",
"@types/webpack-bundle-analyzer": "4.7.0",
"@types/webpack-hot-middleware": "2.25.9",
"rollup": "4.24.0",
"unbuild": "3.0.0-rc.11",
"vue": "3.5.11"
},
"peerDependencies": {
"vue": "^3.3.4"
},
"engines": {
"node": "^14.18.0 || >=16.10.0"
}
}

View File

@ -7,14 +7,15 @@ import { consola } from 'consola'
export default defineUntypedSchema({
/**
* The builder to use for bundling the Vue part of your application.
* @type {'vite' | 'webpack' | { bundle: (nuxt: typeof import('../src/types/nuxt').Nuxt) => Promise<void> }}
* @type {'vite' | 'webpack' | 'rspack' | { bundle: (nuxt: typeof import('../src/types/nuxt').Nuxt) => Promise<void> }}
*/
builder: {
$resolve: async (val: 'vite' | 'webpack' | { bundle: (nuxt: unknown) => Promise<void> } | undefined = 'vite', get) => {
$resolve: async (val: 'vite' | 'webpack' | 'rspack' | { bundle: (nuxt: unknown) => Promise<void> } | undefined = 'vite', get) => {
if (typeof val === 'object') {
return val
}
const map: Record<string, string> = {
rspack: '@nuxt/rspack-builder',
vite: '@nuxt/vite-builder',
webpack: '@nuxt/webpack-builder',
}

View File

@ -20,7 +20,7 @@ export default defineUntypedSchema({
* builder environment types (with `false`) to handle this fully yourself, or opt for a 'shared' option.
*
* The 'shared' option is advised for module authors, who will want to support multiple possible builders.
* @type {'vite' | 'webpack' | 'shared' | false | undefined}
* @type {'vite' | 'webpack' | 'rspack' | 'shared' | false | undefined}
*/
builder: {
$resolve: val => val ?? null,

View File

@ -34,7 +34,7 @@ export interface NuxtCompatibility {
* })
* ```
*/
builder?: Partial<Record<'vite' | 'webpack' | (string & {}), false | string>>
builder?: Partial<Record<'vite' | 'webpack' | 'rspack' | (string & {}), false | string>>
}
export interface NuxtCompatibilityIssue {

View File

@ -79,7 +79,7 @@ export interface NuxtBuilder {
// Normalized Nuxt options available as `nuxt.options.*`
export interface NuxtOptions extends Omit<ConfigSchema, 'builder' | 'webpack' | 'postcss'> {
sourcemap: Required<Exclude<ConfigSchema['sourcemap'], boolean>>
builder: '@nuxt/vite-builder' | '@nuxt/webpack-builder' | NuxtBuilder
builder: '@nuxt/vite-builder' | '@nuxt/webpack-builder' | '@nuxt/rspack-builder' | NuxtBuilder
postcss: Omit<ConfigSchema['postcss'], 'order'> & { order: Exclude<ConfigSchema['postcss']['order'], string> }
webpack: ConfigSchema['webpack'] & {
$client: ConfigSchema['webpack']

View File

@ -408,6 +408,55 @@ export interface NuxtHooks {
* @returns void
*/
'webpack:progress': (statesArray: any[]) => void
// rspack
/**
* Called before configuring the webpack compiler.
* @param webpackConfigs Configs objects to be pushed to the compiler
* @returns Promise
*/
'rspack:config': (webpackConfigs: Configuration[]) => HookResult
/**
* Allows to read the resolved webpack config
* @param webpackConfigs Configs objects to be pushed to the compiler
* @returns Promise
*/
'rspack:configResolved': (webpackConfigs: Readonly<Configuration>[]) => HookResult
/**
* Called right before compilation.
* @param options The options to be added
* @returns Promise
*/
'rspack:compile': (options: { name: string, compiler: Compiler }) => HookResult
/**
* Called after resources are loaded.
* @param options The compiler options
* @returns Promise
*/
'rspack:compiled': (options: { name: string, compiler: Compiler, stats: Stats }) => HookResult
/**
* Called on `change` on WebpackBar.
* @param shortPath the short path
* @returns void
*/
'rspack:change': (shortPath: string) => void
/**
* Called on `done` if has errors on WebpackBar.
* @returns void
*/
'rspack:error': () => void
/**
* Called on `allDone` on WebpackBar.
* @returns void
*/
'rspack:done': () => void
/**
* Called on `progress` on WebpackBar.
* @param statesArray The array containing the states on progress
* @returns void
*/
'rspack:progress': (statesArray: any[]) => void
}
export type NuxtHookName = keyof NuxtHooks

View File

@ -17,6 +17,7 @@ export default defineBuildConfig({
'vue',
],
externals: [
'#builder',
'@nuxt/schema',
],
})

8
packages/webpack/builder.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
declare module '#builder' {
import type Webpack from 'webpack'
import type MiniCssExtractPlugin from 'mini-css-extract-plugin'
export const webpack: typeof Webpack
export const MiniCssExtractPlugin: typeof MiniCssExtractPlugin
export const builder: 'webpack' | 'rspack'
}

View File

@ -0,0 +1,3 @@
export const builder = 'webpack'
export { default as webpack } from 'webpack'
export { default as MiniCssExtractPlugin } from 'mini-css-extract-plugin'

View File

@ -11,6 +11,9 @@
"license": "MIT",
"type": "module",
"types": "./dist/index.d.ts",
"imports": {
"#builder": "./builder.mjs"
},
"exports": {
".": {
"types": "./dist/index.d.ts",
@ -19,7 +22,8 @@
"./dist/*": "./dist/*"
},
"files": [
"dist"
"dist",
"builder.mjs"
],
"scripts": {
"prepack": "unbuild"
@ -70,6 +74,7 @@
},
"devDependencies": {
"@nuxt/schema": "workspace:*",
"@rspack/core": "1.0.8",
"@types/hash-sum": "1.0.2",
"@types/lodash-es": "4.17.12",
"@types/pify": "5.0.4",

View File

@ -1,6 +1,5 @@
import querystring from 'node:querystring'
import { resolve } from 'pathe'
import webpack from 'webpack'
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'
import { logger } from '@nuxt/kit'
import { joinURL } from 'ufo'
@ -10,6 +9,7 @@ import { env, nodeless } from 'unenv'
import type { WebpackConfigContext } from '../utils/config'
import { applyPresets } from '../utils/config'
import { nuxt } from '../presets/nuxt'
import { webpack } from '#builder'
export async function client (ctx: WebpackConfigContext) {
ctx.name = 'client'

View File

@ -1,11 +1,11 @@
import { isAbsolute } from 'pathe'
import webpack from 'webpack'
import ForkTSCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'
import { logger } from '@nuxt/kit'
import type { WebpackConfigContext } from '../utils/config'
import { applyPresets } from '../utils/config'
import { nuxt } from '../presets/nuxt'
import { node } from '../presets/node'
import { webpack } from '#builder'
const assetPattern = /\.(?:css|s[ca]ss|png|jpe?g|gif|svg|woff2?|eot|ttf|otf|webp|webm|mp4|ogv)(?:\?.*)?$/i

View File

@ -1,9 +1,10 @@
import type { Compiler } from 'webpack'
import webpack from 'webpack'
import { webpack } from '#builder'
const pluginName = 'ChunkErrorPlugin'
const script = `
export class ChunkErrorPlugin {
script = `
if (typeof ${webpack.RuntimeGlobals.require} !== "undefined") {
var _ensureChunk = ${webpack.RuntimeGlobals.ensureChunk};
${webpack.RuntimeGlobals.ensureChunk} = function (chunkId) {
@ -16,12 +17,11 @@ if (typeof ${webpack.RuntimeGlobals.require} !== "undefined") {
};
};`
export class ChunkErrorPlugin {
apply (compiler: Compiler) {
compiler.hooks.thisCompilation.tap(pluginName, compilation =>
compilation.mainTemplate.hooks.localVars.tap(
{ name: pluginName, stage: 1 },
source => source + script,
source => source + this.script,
),
)
}

View File

@ -7,7 +7,7 @@ import { mkdir, writeFile } from 'node:fs/promises'
import { normalizeWebpackManifest } from 'vue-bundle-renderer'
import { dirname } from 'pathe'
import hash from 'hash-sum'
import { hash } from 'ohash'
import type { Nuxt } from '@nuxt/schema'
import type { Compilation, Compiler } from 'webpack'

View File

@ -1,6 +1,6 @@
import type { Compilation, Compiler } from 'webpack'
import webpack from 'webpack'
import { extractQueryPartJS, isJS, validate } from './util'
import { webpack } from '#builder'
interface VueSSRServerPluginOptions {
filename: string

View File

@ -3,7 +3,6 @@ import { normalize, resolve } from 'pathe'
import TimeFixPlugin from 'time-fix-plugin'
import WebpackBar from 'webpackbar'
import type { Configuration } from 'webpack'
import webpack from 'webpack'
import { logger } from '@nuxt/kit'
// @ts-expect-error missing types
import FriendlyErrorsWebpackPlugin from '@nuxt/friendly-errors-webpack-plugin'
@ -16,6 +15,8 @@ import WarningIgnorePlugin from '../plugins/warning-ignore'
import type { WebpackConfigContext } from '../utils/config'
import { applyPresets, fileName } from '../utils/config'
import { builder, webpack } from '#builder'
export async function base (ctx: WebpackConfigContext) {
await applyPresets(ctx, [
baseAlias,
@ -53,14 +54,18 @@ function basePlugins (ctx: WebpackConfigContext) {
// Add timefix-plugin before other plugins
if (ctx.options.dev) {
ctx.config.plugins.push(new TimeFixPlugin())
if (ctx.nuxt.options.builder !== '@nuxt/rspack-builder') {
ctx.config.plugins.push(new TimeFixPlugin())
}
}
// User plugins
ctx.config.plugins.push(...(ctx.userConfig.plugins || []))
// Ignore empty warnings
ctx.config.plugins.push(new WarningIgnorePlugin(getWarningIgnoreFilter(ctx)))
if (ctx.nuxt.options.builder !== '@nuxt/rspack-builder') {
ctx.config.plugins.push(new WarningIgnorePlugin(getWarningIgnoreFilter(ctx)))
}
// Provide env via DefinePlugin
ctx.config.plugins.push(new webpack.DefinePlugin(getEnv(ctx)))
@ -93,21 +98,21 @@ function basePlugins (ctx: WebpackConfigContext) {
reporter: {
change: (_, { shortPath }) => {
if (!ctx.isServer) {
ctx.nuxt.callHook('webpack:change', shortPath)
ctx.nuxt.callHook(`${builder}:change`, shortPath)
}
},
done: ({ state }) => {
if (state.hasErrors) {
ctx.nuxt.callHook('webpack:error')
ctx.nuxt.callHook(`${builder}:error`)
} else {
logger.success(`${state.name} ${state.message}`)
}
},
allDone: () => {
ctx.nuxt.callHook('webpack:done')
ctx.nuxt.callHook(`${builder}:done`)
},
progress ({ statesArray }) {
ctx.nuxt.callHook('webpack:progress', statesArray)
ctx.nuxt.callHook(`${builder}:progress`, statesArray)
},
},
},
@ -150,7 +155,7 @@ function baseTranspile (ctx: WebpackConfigContext) {
/\.vue\.js/i, // include SFCs in node_modules
/consola\/src/,
/vue-demi/,
/(^|\/)nuxt\/(dist\/)?(app|[^/]+\/runtime)($|\/)/,
/(^|\/)nuxt\/(src\/|dist\/)?(app|[^/]+\/runtime)($|\/)/,
]
for (let pattern of ctx.options.build.transpile) {

View File

@ -1,9 +1,10 @@
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'
import type { WebpackConfigContext } from '../utils/config'
import { applyPresets, fileName } from '../utils/config'
import { getPostcssConfig } from '../utils/postcss'
import { MiniCssExtractPlugin } from '#builder'
export async function style (ctx: WebpackConfigContext) {
await applyPresets(ctx, [
loaders,

View File

@ -1,10 +1,11 @@
import { resolve } from 'pathe'
import VueLoaderPlugin from 'vue-loader/dist/pluginWebpack5.js'
import webpack from 'webpack'
import VueSSRClientPlugin from '../plugins/vue/client'
import VueSSRServerPlugin from '../plugins/vue/server'
import type { WebpackConfigContext } from '../utils/config'
import { webpack } from '#builder'
export function vue (ctx: WebpackConfigContext) {
// @ts-expect-error de-default vue-loader
ctx.config.plugins!.push(new (VueLoaderPlugin.default || VueLoaderPlugin)())
@ -30,7 +31,8 @@ export function vue (ctx: WebpackConfigContext) {
// https://github.com/vuejs/vue-next/tree/master/packages/vue#bundler-build-feature-flags
// TODO: Provide options to toggle
ctx.config.plugins!.push(new webpack.DefinePlugin({
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_DEVTOOLS__: 'false',
'__VUE_OPTIONS_API__': 'true',
'__VUE_PROD_DEVTOOLS__': 'false',
'__VUE_PROD_HYDRATION_MISMATCH_DETAILS__': ctx.nuxt.options.debug,
}))
}

View File

@ -1,5 +1,4 @@
import pify from 'pify'
import webpack from 'webpack'
import type { NodeMiddleware } from 'h3'
import { defineEventHandler, fromNodeMiddleware } from 'h3'
import type { MultiWatching } from 'webpack-dev-middleware'
@ -18,6 +17,8 @@ import { createMFS } from './utils/mfs'
import { client, server } from './configs'
import { applyPresets, createWebpackConfigContext, getWebpackConfig } from './utils/config'
import { builder, webpack } from '#builder'
// TODO: Support plugins
// const plugins: string[] = []
@ -29,7 +30,7 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => {
return getWebpackConfig(ctx)
}))
await nuxt.callHook('webpack:config', webpackConfigs)
await nuxt.callHook(`${builder}:config`, webpackConfigs)
// Initialize shared MFS for dev
const mfs = nuxt.options.dev ? createMFS() : null
@ -39,7 +40,7 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => {
sourcemap: !!nuxt.options.sourcemap[config.name as 'client' | 'server'],
}))
// Emit chunk errors if the user has opted in to `experimental.emitRouteChunkError`
if (config.name === 'client' && nuxt.options.experimental.emitRouteChunkError) {
if (config.name === 'client' && nuxt.options.experimental.emitRouteChunkError && nuxt.options.builder !== '@nuxt/rspack-builder') {
config.plugins!.push(new ChunkErrorPlugin())
}
config.plugins!.push(composableKeysPlugin.webpack({
@ -49,7 +50,7 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => {
}))
}
await nuxt.callHook('webpack:configResolved', webpackConfigs)
await nuxt.callHook(`${builder}:configResolved`, webpackConfigs)
// Configure compilers
const compilers = webpackConfigs.map((config) => {
@ -119,11 +120,11 @@ async function createDevMiddleware (compiler: Compiler) {
async function compile (compiler: Compiler) {
const nuxt = useNuxt()
await nuxt.callHook('webpack:compile', { name: compiler.options.name!, compiler })
await nuxt.callHook(`${builder}:compile`, { name: compiler.options.name!, compiler })
// Load renderer resources after build
compiler.hooks.done.tap('load-resources', async (stats) => {
await nuxt.callHook('webpack:compiled', { name: compiler.options.name!, compiler, stats })
await nuxt.callHook(`${builder}:compiled`, { name: compiler.options.name!, compiler, stats })
})
// --- Dev Build ---

View File

@ -10,6 +10,7 @@ overrides:
'@nuxt/ui-templates': workspace:*
'@nuxt/vite-builder': workspace:*
'@nuxt/webpack-builder': workspace:*
'@nuxt/rspack-builder': workspace:*
'@types/node': 20.16.11
'@vue/compiler-core': 3.5.11
'@vue/compiler-dom': 3.5.11
@ -38,6 +39,9 @@ importers:
'@nuxt/kit':
specifier: workspace:*
version: link:packages/kit
'@nuxt/rspack-builder':
specifier: workspace:*
version: link:packages/rspack
'@nuxt/test-utils':
specifier: 3.14.3
version: 3.14.3(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.11)(vue@3.5.11(typescript@5.6.3)))(@vue/test-utils@2.4.6)(h3@1.12.0)(happy-dom@15.7.4)(magicast@0.3.5)(nitropack@2.9.7(magicast@0.3.5)(webpack-sources@3.2.3))(playwright-core@1.48.0)(vite@5.4.8(@types/node@20.16.11)(sass@1.78.0)(terser@5.32.0))(vitest@2.1.2(@types/node@20.16.11)(happy-dom@15.7.4)(sass@1.78.0)(terser@5.32.0))(vue-router@4.4.5(vue@3.5.11(typescript@5.6.3)))(vue@3.5.11(typescript@5.6.3))(webpack-sources@3.2.3)
@ -240,6 +244,9 @@ importers:
specifier: ^1.5.1
version: 1.5.1
devDependencies:
'@rspack/core':
specifier: 1.0.8
version: 1.0.8
'@types/hash-sum':
specifier: 1.0.2
version: 1.0.2
@ -494,6 +501,169 @@ importers:
specifier: 2.1.2
version: 2.1.2(@types/node@20.16.11)(happy-dom@15.7.4)(sass@1.78.0)(terser@5.32.0)
packages/rspack:
dependencies:
'@nuxt/friendly-errors-webpack-plugin':
specifier: ^2.6.0
version: 2.6.0(webpack@5.95.0)
'@nuxt/kit':
specifier: workspace:*
version: link:../kit
'@rspack/core':
specifier: ^1.0.8
version: 1.0.8
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.47)
css-loader:
specifier: ^7.1.2
version: 7.1.2(@rspack/core@1.0.8)(webpack@5.95.0)
css-minimizer-webpack-plugin:
specifier: ^7.0.0
version: 7.0.0(webpack@5.95.0)
cssnano:
specifier: ^7.0.6
version: 7.0.6(postcss@8.4.47)
defu:
specifier: ^6.1.4
version: 6.1.4
esbuild-loader:
specifier: ^4.2.2
version: 4.2.2(webpack@5.95.0)
escape-string-regexp:
specifier: ^5.0.0
version: 5.0.0
estree-walker:
specifier: ^3.0.3
version: 3.0.3
file-loader:
specifier: ^6.2.0
version: 6.2.0(webpack@5.95.0)
fork-ts-checker-webpack-plugin:
specifier: ^9.0.2
version: 9.0.2(typescript@5.6.3)(webpack@5.95.0)
globby:
specifier: ^14.0.2
version: 14.0.2
h3:
specifier: npm:h3-nightly@2.0.0-1718872656.6765a6e
version: h3-nightly@2.0.0-1718872656.6765a6e
hash-sum:
specifier: ^2.0.0
version: 2.0.0
jiti:
specifier: 2.3.3
version: 2.3.3
knitwork:
specifier: ^1.1.0
version: 1.1.0
lodash-es:
specifier: 4.17.21
version: 4.17.21
magic-string:
specifier: ^0.30.11
version: 0.30.11
memfs:
specifier: ^4.13.0
version: 4.13.0
mlly:
specifier: ^1.7.2
version: 1.7.2
ohash:
specifier: 1.1.4
version: 1.1.4
pathe:
specifier: ^1.1.2
version: 1.1.2
pify:
specifier: ^6.1.0
version: 6.1.0
postcss:
specifier: 8.4.47
version: 8.4.47
postcss-import:
specifier: ^16.1.0
version: 16.1.0(postcss@8.4.47)
postcss-import-resolver:
specifier: ^2.0.0
version: 2.0.0
postcss-loader:
specifier: ^8.1.1
version: 8.1.1(@rspack/core@1.0.8)(postcss@8.4.47)(typescript@5.6.3)(webpack@5.95.0)
postcss-url:
specifier: ^10.1.3
version: 10.1.3(postcss@8.4.47)
pug-plain-loader:
specifier: ^1.1.0
version: 1.1.0(pug@3.0.3)
std-env:
specifier: ^3.7.0
version: 3.7.0
time-fix-plugin:
specifier: ^2.0.7
version: 2.0.7(webpack@5.95.0)
ufo:
specifier: 1.5.4
version: 1.5.4
unenv:
specifier: ^1.10.0
version: 1.10.0
unplugin:
specifier: ^1.14.1
version: 1.14.1(webpack-sources@3.2.3)
url-loader:
specifier: ^4.1.1
version: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0)
vue-bundle-renderer:
specifier: ^2.1.1
version: 2.1.1
vue-loader:
specifier: ^17.4.2
version: 17.4.2(@vue/compiler-sfc@3.5.11)(vue@3.5.11(typescript@5.6.3))(webpack@5.95.0)
webpack-bundle-analyzer:
specifier: ^4.10.2
version: 4.10.2
webpack-dev-middleware:
specifier: ^7.4.2
version: 7.4.2(webpack@5.95.0)
webpack-hot-middleware:
specifier: ^2.26.1
version: 2.26.1
webpack-virtual-modules:
specifier: ^0.6.2
version: 0.6.2
webpackbar:
specifier: ^6.0.1
version: 6.0.1(webpack@5.95.0)
devDependencies:
'@nuxt/schema':
specifier: workspace:*
version: link:../schema
'@types/hash-sum':
specifier: 1.0.2
version: 1.0.2
'@types/lodash-es':
specifier: 4.17.12
version: 4.17.12
'@types/pify':
specifier: 5.0.4
version: 5.0.4
'@types/webpack-bundle-analyzer':
specifier: 4.7.0
version: 4.7.0
'@types/webpack-hot-middleware':
specifier: 2.25.9
version: 2.25.9
rollup:
specifier: 4.24.0
version: 4.24.0
unbuild:
specifier: 3.0.0-rc.11
version: 3.0.0-rc.11(sass@1.78.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))
vue:
specifier: 3.5.11
version: 3.5.11(typescript@5.6.3)
packages/schema:
dependencies:
compatx:
@ -800,7 +970,7 @@ importers:
version: 10.4.20(postcss@8.4.47)
css-loader:
specifier: ^7.1.2
version: 7.1.2(webpack@5.95.0)
version: 7.1.2(@rspack/core@1.0.8)(webpack@5.95.0)
css-minimizer-webpack-plugin:
specifier: ^7.0.0
version: 7.0.0(webpack@5.95.0)
@ -869,7 +1039,7 @@ importers:
version: 2.0.0
postcss-loader:
specifier: ^8.1.1
version: 8.1.1(postcss@8.4.47)(typescript@5.6.3)(webpack@5.95.0)
version: 8.1.1(@rspack/core@1.0.8)(postcss@8.4.47)(typescript@5.6.3)(webpack@5.95.0)
postcss-url:
specifier: ^10.1.3
version: 10.1.3(postcss@8.4.47)
@ -919,6 +1089,9 @@ importers:
'@nuxt/schema':
specifier: workspace:*
version: link:../schema
'@rspack/core':
specifier: 1.0.8
version: 1.0.8
'@types/hash-sum':
specifier: 1.0.2
version: 1.0.2
@ -949,6 +1122,9 @@ importers:
test/fixtures/basic:
dependencies:
'@nuxt/rspack-builder':
specifier: workspace:*
version: link:../../../packages/rspack
'@nuxt/webpack-builder':
specifier: workspace:*
version: link:../../../packages/webpack
@ -2069,6 +2245,18 @@ packages:
resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
hasBin: true
'@module-federation/runtime-tools@0.5.1':
resolution: {integrity: sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==}
'@module-federation/runtime@0.5.1':
resolution: {integrity: sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==}
'@module-federation/sdk@0.5.1':
resolution: {integrity: sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==}
'@module-federation/webpack-bundler-runtime@0.5.1':
resolution: {integrity: sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==}
'@netlify/functions@2.8.1':
resolution: {integrity: sha512-+6wtYdoz0yE06dSa9XkP47tw5zm6g13QMeCwM3MmHx1vn8hzwFa51JtmfraprdkL7amvb7gaNM+OOhQU1h6T8A==}
engines: {node: '>=14.0.0'}
@ -2449,6 +2637,67 @@ packages:
cpu: [x64]
os: [win32]
'@rspack/binding-darwin-arm64@1.0.8':
resolution: {integrity: sha512-1l8/eg3HNz53DHQO3fy5O5QKdYh8hSMZaWGtm3NR5IfdrTm2TaLL9tuR8oL2iHHtd87LEvVKHXdjlcuLV5IPNQ==}
cpu: [arm64]
os: [darwin]
'@rspack/binding-darwin-x64@1.0.8':
resolution: {integrity: sha512-7BbG8gXVWjtqJegDpsObzM/B90Eig1piEtcahvPdvlC92uZz3/IwtKPpMaywGBrf5RSI3U0nQMSekwz0cO1SOw==}
cpu: [x64]
os: [darwin]
'@rspack/binding-linux-arm64-gnu@1.0.8':
resolution: {integrity: sha512-QnqCL0wmwYqT/IFx5q0aw7DsIOr8oYUa4+7JI8iiqRf3RuuRJExesVW9VuWr0jS2UvChKgmb8PvRtDy/0tshFw==}
cpu: [arm64]
os: [linux]
'@rspack/binding-linux-arm64-musl@1.0.8':
resolution: {integrity: sha512-Ns9TsE7zdUjimW5HURRW08BaMyAh16MDh97PPsGEMeRPx9plnRO9aXvuUG6t+0gy4KwlQdeq3BvUsbBpIo5Tow==}
cpu: [arm64]
os: [linux]
'@rspack/binding-linux-x64-gnu@1.0.8':
resolution: {integrity: sha512-lfqUuKCoyRN/gGeokhX/oNYqB6OpbtgQb57b0QuD8IaiH2a1ee0TtEVvRbyQNEDwht6lW4RTNg0RfMYu52LgXg==}
cpu: [x64]
os: [linux]
'@rspack/binding-linux-x64-musl@1.0.8':
resolution: {integrity: sha512-MgbHJWV5utVa1/U9skrXClydZ/eZw001++v4B6nb8myU6Ck1D02aMl9ESefb/sSA8TatLLxEXQ2VENG9stnPwQ==}
cpu: [x64]
os: [linux]
'@rspack/binding-win32-arm64-msvc@1.0.8':
resolution: {integrity: sha512-3NN5VisnSOzhgqX77O/7NvcjPUueg1oIdMKoc5vElJCEu5FEXPqDhwZmr1PpBovaXshAcgExF3j54+20pwdg5g==}
cpu: [arm64]
os: [win32]
'@rspack/binding-win32-ia32-msvc@1.0.8':
resolution: {integrity: sha512-17VQNC7PSygzsipSVoukDM/SOcVueVNsk9bZiB0Swl20BaqrlBts2Dvlmo+L+ZGsxOYI97WvA/zomMDv860usg==}
cpu: [ia32]
os: [win32]
'@rspack/binding-win32-x64-msvc@1.0.8':
resolution: {integrity: sha512-Vtjt74Soh09XUsV5Nw0YjZVSk/qtsjtPnzbSZluncSAVUs8l+X1ALcM6n1Jrt3TLTfcqf7a+VIsWOXAMqkCGUg==}
cpu: [x64]
os: [win32]
'@rspack/binding@1.0.8':
resolution: {integrity: sha512-abRirbrjobcllLAamyeiWxT6Rb0wELUnITynQdqRbSweWm2lvnhm9YBv4BcOjvJBzhJtvRJo5JBtbKXjDTarug==}
'@rspack/core@1.0.8':
resolution: {integrity: sha512-pbXwXYb4WQwb0l35P5v3l/NpDJXy1WiVE4IcQ/6LxZYU5NyZuqtsK0trR88xIVRZb9qU0JUeCdQq7Xa6Q+c3Xw==}
engines: {node: '>=16.0.0'}
peerDependencies:
'@swc/helpers': '>=0.5.1'
peerDependenciesMeta:
'@swc/helpers':
optional: true
'@rspack/lite-tapable@1.0.1':
resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==}
engines: {node: '>=16.0.0'}
'@shikijs/core@1.17.0':
resolution: {integrity: sha512-Mkk4Mp4bNnW1kytU8I7S5PK5teNSe0iKlfqxPss4sdwnlcU8a2N62Z3te2gVmZfU9t1HF6L3wyWuM43IvEeEsg==}
@ -2494,9 +2743,6 @@ packages:
'@shikijs/vitepress-twoslash@1.17.0':
resolution: {integrity: sha512-FcdZUtF1jL51fZfkITd1qEnmnVe/w8lnOGhEWptMqMNvMYzB8vxDv5y+E1zvE+rw0NbBuWtOmZea3WOah1nr6g==}
'@shikijs/vscode-textmate@9.2.2':
resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==}
'@shikijs/vscode-textmate@9.3.0':
resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
@ -2762,32 +3008,18 @@ packages:
'@ungap/structured-clone@1.2.0':
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
'@unhead/dom@1.11.6':
resolution: {integrity: sha512-FYU8Cu+XWcpbO4OvXdB6x7m6GTPcl6CW7igI8rNu6Kc0Ilxb+atxIvyFXdTGAyB7h/F0w3ex06ZVWJ65f3EW8A==}
'@unhead/dom@1.11.7':
resolution: {integrity: sha512-Nj2ulnbY5lvIcxqXwdO5YfdvLm8EYLjcaOje2b2aQnfyPAyOIVeR8iB79DDKk/uZZAPEwkdhSnUdEh9Ny0b3lw==}
'@unhead/schema@1.11.6':
resolution: {integrity: sha512-Ava5+kQERaZ2fi66phgR9KZQr9SsheN1YhhKM8fCP2A4Jb5lHUssVQ19P0+89V6RX9iUg/Q27WdEbznm75LzhQ==}
'@unhead/schema@1.11.7':
resolution: {integrity: sha512-j9uN7T63aUXrZ6yx2CfjVT7xZHjn0PZO7TPMaWqMFjneIH/NONKvDVCMEqDlXeqdSIERIYtk/xTHgCUMer5eyw==}
'@unhead/shared@1.11.6':
resolution: {integrity: sha512-aGrtzRCcFlVh9iru73fBS8FA1vpQskS190t5cCRRMpisOEunVv3ueqXN1F8CseQd0W4wyEr/ycDvdfKt+RPv5g==}
'@unhead/shared@1.11.7':
resolution: {integrity: sha512-5v3PmV1LMyikGyQi/URYS5ilH8dg1Iomtja7iFWke990O8RBDEzAdagJqcsUE/fw+o7cXRSOamyx5wCf5Q1TrA==}
'@unhead/ssr@1.11.7':
resolution: {integrity: sha512-qI1zNFY8fU5S9EhroxlXSA5Q/XKbWAKXrVVNG+6bIh/IRrMOMJrPk4d1GmphF4gmNri3ARqly+OWx4VVaj0scA==}
'@unhead/vue@1.11.6':
resolution: {integrity: sha512-CMuDJGTi4n4wKdOp6/JmB9roGshjTdoFKF34PEkXu4+g97BiVFiZ9LvgY44+UlWCUzQHcqEPRQIzm9iKEqcfKw==}
peerDependencies:
vue: 3.5.11
'@unhead/vue@1.11.7':
resolution: {integrity: sha512-SLr0eQfznVp63iKi47L4s5Yz+oiQjDA82VBP4jlXi7dM9fSIn1ul1aKvBqle/ZxI2cqY8zVGz60EjhjWeu754A==}
peerDependencies:
@ -7057,9 +7289,6 @@ packages:
unenv@1.10.0:
resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==}
unhead@1.11.6:
resolution: {integrity: sha512-TKTQGUzHKF925VZ4KZVbLfKFzTVTEWfPLaXKmkd/ptEY2FHEoJUF7xOpAWc3K7Jzy/ExS66TL7GnLLjtd4sISg==}
unhead@1.11.7:
resolution: {integrity: sha512-aA0+JBRryLhDKUq6L2JhMDLZEG/ElyyDASyC9wiwDl6nvvsj9hD26LgPWgmAsSd+9HtMGM2N1gU27CWEMo16CQ==}
@ -8451,6 +8680,22 @@ snapshots:
- encoding
- supports-color
'@module-federation/runtime-tools@0.5.1':
dependencies:
'@module-federation/runtime': 0.5.1
'@module-federation/webpack-bundler-runtime': 0.5.1
'@module-federation/runtime@0.5.1':
dependencies:
'@module-federation/sdk': 0.5.1
'@module-federation/sdk@0.5.1': {}
'@module-federation/webpack-bundler-runtime@0.5.1':
dependencies:
'@module-federation/runtime': 0.5.1
'@module-federation/sdk': 0.5.1
'@netlify/functions@2.8.1':
dependencies:
'@netlify/serverless-functions-api': 1.19.1
@ -8646,7 +8891,7 @@ snapshots:
'@types/stripe-v3': 3.1.33
'@types/vimeo__player': 2.18.3
'@types/youtube': 0.1.0
'@unhead/vue': 1.11.6(vue@3.5.11(typescript@5.6.3))
'@unhead/vue': 1.11.7(vue@3.5.11(typescript@5.6.3))
'@vueuse/core': 11.1.0(vue@3.5.11(typescript@5.6.3))
consola: 3.2.3
defu: 6.1.4
@ -9003,12 +9248,60 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.24.0':
optional: true
'@rspack/binding-darwin-arm64@1.0.8':
optional: true
'@rspack/binding-darwin-x64@1.0.8':
optional: true
'@rspack/binding-linux-arm64-gnu@1.0.8':
optional: true
'@rspack/binding-linux-arm64-musl@1.0.8':
optional: true
'@rspack/binding-linux-x64-gnu@1.0.8':
optional: true
'@rspack/binding-linux-x64-musl@1.0.8':
optional: true
'@rspack/binding-win32-arm64-msvc@1.0.8':
optional: true
'@rspack/binding-win32-ia32-msvc@1.0.8':
optional: true
'@rspack/binding-win32-x64-msvc@1.0.8':
optional: true
'@rspack/binding@1.0.8':
optionalDependencies:
'@rspack/binding-darwin-arm64': 1.0.8
'@rspack/binding-darwin-x64': 1.0.8
'@rspack/binding-linux-arm64-gnu': 1.0.8
'@rspack/binding-linux-arm64-musl': 1.0.8
'@rspack/binding-linux-x64-gnu': 1.0.8
'@rspack/binding-linux-x64-musl': 1.0.8
'@rspack/binding-win32-arm64-msvc': 1.0.8
'@rspack/binding-win32-ia32-msvc': 1.0.8
'@rspack/binding-win32-x64-msvc': 1.0.8
'@rspack/core@1.0.8':
dependencies:
'@module-federation/runtime-tools': 0.5.1
'@rspack/binding': 1.0.8
'@rspack/lite-tapable': 1.0.1
caniuse-lite: 1.0.30001667
'@rspack/lite-tapable@1.0.1': {}
'@shikijs/core@1.17.0':
dependencies:
'@shikijs/engine-javascript': 1.17.0
'@shikijs/engine-oniguruma': 1.17.0
'@shikijs/types': 1.17.0
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@types/hast': 3.0.4
hast-util-to-html: 9.0.3
@ -9017,7 +9310,7 @@ snapshots:
'@shikijs/engine-javascript': 1.20.0
'@shikijs/engine-oniguruma': 1.20.0
'@shikijs/types': 1.20.0
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@types/hast': 3.0.4
hast-util-to-html: 9.0.3
@ -9039,7 +9332,7 @@ snapshots:
'@shikijs/engine-javascript@1.20.0':
dependencies:
'@shikijs/types': 1.20.0
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
oniguruma-to-js: 0.4.3
'@shikijs/engine-javascript@1.22.0':
@ -9051,12 +9344,12 @@ snapshots:
'@shikijs/engine-oniguruma@1.17.0':
dependencies:
'@shikijs/types': 1.17.0
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@shikijs/engine-oniguruma@1.20.0':
dependencies:
'@shikijs/types': 1.20.0
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@shikijs/engine-oniguruma@1.22.0':
dependencies:
@ -9078,12 +9371,12 @@ snapshots:
'@shikijs/types@1.17.0':
dependencies:
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@types/hast': 3.0.4
'@shikijs/types@1.20.0':
dependencies:
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@types/hast': 3.0.4
'@shikijs/types@1.22.0':
@ -9107,8 +9400,6 @@ snapshots:
- supports-color
- typescript
'@shikijs/vscode-textmate@9.2.2': {}
'@shikijs/vscode-textmate@9.3.0': {}
'@sidvind/better-ajv-errors@3.0.1(ajv@8.17.1)':
@ -9435,30 +9726,16 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
'@unhead/dom@1.11.6':
dependencies:
'@unhead/schema': 1.11.6
'@unhead/shared': 1.11.6
'@unhead/dom@1.11.7':
dependencies:
'@unhead/schema': 1.11.7
'@unhead/shared': 1.11.7
'@unhead/schema@1.11.6':
dependencies:
hookable: 5.5.3
zhead: 2.2.4
'@unhead/schema@1.11.7':
dependencies:
hookable: 5.5.3
zhead: 2.2.4
'@unhead/shared@1.11.6':
dependencies:
'@unhead/schema': 1.11.6
'@unhead/shared@1.11.7':
dependencies:
'@unhead/schema': 1.11.7
@ -9468,15 +9745,6 @@ snapshots:
'@unhead/schema': 1.11.7
'@unhead/shared': 1.11.7
'@unhead/vue@1.11.6(vue@3.5.11(typescript@5.6.3))':
dependencies:
'@unhead/schema': 1.11.6
'@unhead/shared': 1.11.6
defu: 6.1.4
hookable: 5.5.3
unhead: 1.11.6
vue: 3.5.11(typescript@5.6.3)
'@unhead/vue@1.11.7(vue@3.5.11(typescript@5.6.3))':
dependencies:
'@unhead/schema': 1.11.7
@ -10772,7 +11040,7 @@ snapshots:
dependencies:
postcss: 8.4.47
css-loader@7.1.2(webpack@5.95.0):
css-loader@7.1.2(@rspack/core@1.0.8)(webpack@5.95.0):
dependencies:
icss-utils: 5.1.0(postcss@8.4.47)
postcss: 8.4.47
@ -10783,6 +11051,7 @@ snapshots:
postcss-value-parser: 4.2.0
semver: 7.6.3
optionalDependencies:
'@rspack/core': 1.0.8
webpack: 5.95.0
css-minimizer-webpack-plugin@7.0.0(webpack@5.95.0):
@ -13443,13 +13712,14 @@ snapshots:
read-cache: 1.0.0
resolve: 1.22.8
postcss-loader@8.1.1(postcss@8.4.47)(typescript@5.6.3)(webpack@5.95.0):
postcss-loader@8.1.1(@rspack/core@1.0.8)(postcss@8.4.47)(typescript@5.6.3)(webpack@5.95.0):
dependencies:
cosmiconfig: 9.0.0(typescript@5.6.3)
jiti: 1.21.6
postcss: 8.4.47
semver: 7.6.3
optionalDependencies:
'@rspack/core': 1.0.8
webpack: 5.95.0
transitivePeerDependencies:
- typescript
@ -14162,7 +14432,7 @@ snapshots:
dependencies:
'@shikijs/core': 1.17.0
'@shikijs/types': 1.17.0
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@types/hast': 3.0.4
shiki@1.20.0:
@ -14171,7 +14441,7 @@ snapshots:
'@shikijs/engine-javascript': 1.20.0
'@shikijs/engine-oniguruma': 1.20.0
'@shikijs/types': 1.20.0
'@shikijs/vscode-textmate': 9.2.2
'@shikijs/vscode-textmate': 9.3.0
'@types/hast': 3.0.4
side-channel@1.0.6:
@ -14618,13 +14888,6 @@ snapshots:
node-fetch-native: 1.6.4
pathe: 1.1.2
unhead@1.11.6:
dependencies:
'@unhead/dom': 1.11.6
'@unhead/schema': 1.11.6
'@unhead/shared': 1.11.6
hookable: 5.5.3
unhead@1.11.7:
dependencies:
'@unhead/dom': 1.11.7

View File

@ -12,7 +12,7 @@ import { expectNoClientErrors, expectWithPolling, gotoPath, isRenderingJson, par
import type { NuxtIslandResponse } from '#app'
const isWebpack = process.env.TEST_BUILDER === 'webpack'
const isWebpack = process.env.TEST_BUILDER === 'webpack' || process.env.TEST_BUILDER === 'rspack'
const isTestingAppManifest = process.env.TEST_MANIFEST !== 'manifest-off'
const isV4 = process.env.TEST_V4 === 'true'

View File

@ -11,7 +11,7 @@ export default defineNuxtConfig({
compatibilityVersion: process.env.TEST_V4 === 'true' ? 4 : 3,
},
buildDir: process.env.NITRO_BUILD_DIR,
builder: process.env.TEST_BUILDER as 'webpack' | 'vite' ?? 'vite',
builder: process.env.TEST_BUILDER as 'webpack' | 'rspack' | 'vite' ?? 'vite',
theme: './extends/bar',
extends: [
'./extends/node_modules/foo',

View File

@ -33,7 +33,7 @@ export default defineNuxtConfig({
},
},
buildDir: process.env.NITRO_BUILD_DIR,
builder: process.env.TEST_BUILDER as 'webpack' | 'vite' ?? 'vite',
builder: process.env.TEST_BUILDER as 'webpack' | 'rspack' | 'vite' ?? 'vite',
appId: 'nuxt-app-basic',
build: {
transpile: [

View File

@ -5,6 +5,7 @@
"build": "nuxi build"
},
"dependencies": {
"@nuxt/rspack-builder": "workspace:*",
"@nuxt/webpack-builder": "workspace:*",
"nuxt": "workspace:*"
},

View File

@ -8,5 +8,5 @@ export default defineNuxtConfig({
vue: {
runtimeCompiler: true,
},
builder: process.env.TEST_BUILDER as 'webpack' | 'vite' ?? 'vite',
builder: process.env.TEST_BUILDER as 'webpack' | 'rspack' | 'vite' ?? 'vite',
})

View File

@ -7,7 +7,7 @@ import { $fetch, fetch, setup } from '@nuxt/test-utils/e2e'
import { expectWithPolling, renderPage } from './utils'
const isWebpack = process.env.TEST_BUILDER === 'webpack'
const isWebpack = process.env.TEST_BUILDER === 'webpack' || process.env.TEST_BUILDER === 'rspack'
// TODO: fix HMR on Windows
if (process.env.TEST_ENV !== 'built' && !isWindows) {

View File

@ -4,7 +4,7 @@ import { $fetch, createPage, setup } from '@nuxt/test-utils/e2e'
import { isWindows } from 'std-env'
import { expectNoClientErrors } from './utils'
const isWebpack = process.env.TEST_BUILDER === 'webpack'
const isWebpack = process.env.TEST_BUILDER === 'webpack' || process.env.TEST_BUILDER === 'rspack'
await setup({
rootDir: fileURLToPath(new URL('./fixtures/runtime-compiler', import.meta.url)),

View File

@ -4,7 +4,7 @@ import { isWindows } from 'std-env'
import { setup } from '@nuxt/test-utils'
import { renderPage } from './utils'
const isWebpack = process.env.TEST_BUILDER === 'webpack'
const isWebpack = process.env.TEST_BUILDER === 'webpack' || process.env.TEST_BUILDER === 'rspack'
await setup({
rootDir: fileURLToPath(new URL('./fixtures/suspense', import.meta.url)),