diff --git a/crates/node_binding/binding.d.ts b/crates/node_binding/binding.d.ts index 7709e596b4bd..183f20daaf3a 100644 --- a/crates/node_binding/binding.d.ts +++ b/crates/node_binding/binding.d.ts @@ -726,6 +726,8 @@ export interface RawCacheOptions { export interface RawChunkOptionNameCtx { module: JsModule + chunks: Array + cacheGroupKey: string } export interface RawConsumeOptions { diff --git a/crates/rspack_binding_options/src/options/raw_split_chunks/raw_split_chunk_name.rs b/crates/rspack_binding_options/src/options/raw_split_chunks/raw_split_chunk_name.rs index a51f4a487395..1a017bf7c22a 100644 --- a/crates/rspack_binding_options/src/options/raw_split_chunks/raw_split_chunk_name.rs +++ b/crates/rspack_binding_options/src/options/raw_split_chunks/raw_split_chunk_name.rs @@ -2,7 +2,8 @@ use std::sync::Arc; use napi::bindgen_prelude::Either3; use napi_derive::napi; -use rspack_binding_values::{JsModule, ToJsModule}; +use rspack_binding_values::{JsChunk, JsModule, ToJsModule}; +use rspack_core::Chunk; use rspack_napi::threadsafe_function::ThreadsafeFunction; use rspack_plugin_split_chunks::{ChunkNameGetter, ChunkNameGetterFnCtx}; use tokio::runtime::Handle; @@ -18,6 +19,8 @@ pub(super) fn default_chunk_option_name() -> ChunkNameGetter { #[napi(object)] pub struct RawChunkOptionNameCtx { pub module: JsModule, + pub chunks: Vec, + pub cache_group_key: String, } impl<'a> From> for RawChunkOptionNameCtx { @@ -27,6 +30,12 @@ impl<'a> From> for RawChunkOptionNameCtx { .module .to_js_module() .expect("should convert js success"), + chunks: value + .chunks + .iter() + .map(|chunk: &&Chunk| JsChunk::from(chunk)) + .collect(), + cache_group_key: value.cache_group_key.to_string(), } } } diff --git a/crates/rspack_plugin_split_chunks/src/options/chunk_name.rs b/crates/rspack_plugin_split_chunks/src/options/chunk_name.rs index 2330bdf764a2..76d0ff99ec3f 100644 --- a/crates/rspack_plugin_split_chunks/src/options/chunk_name.rs +++ b/crates/rspack_plugin_split_chunks/src/options/chunk_name.rs @@ -1,10 +1,12 @@ use std::sync::Arc; -use rspack_core::Module; +use rspack_core::{Chunk, Module}; use rspack_error::Result; pub struct ChunkNameGetterFnCtx<'a> { pub module: &'a dyn Module, + pub chunks: &'a Vec<&'a Chunk>, + pub cache_group_key: &'a str, } type ChunkNameGetterFn = diff --git a/crates/rspack_plugin_split_chunks/src/plugin/module_group.rs b/crates/rspack_plugin_split_chunks/src/plugin/module_group.rs index c57e14bed1d0..926df2748302 100644 --- a/crates/rspack_plugin_split_chunks/src/plugin/module_group.rs +++ b/crates/rspack_plugin_split_chunks/src/plugin/module_group.rs @@ -253,7 +253,7 @@ impl SplitChunksPlugin { ChunkNameGetter::String(name) => Some(name.to_string()), ChunkNameGetter::Disabled => None, ChunkNameGetter::Fn(f) => { - let ctx = ChunkNameGetterFnCtx { module }; + let ctx = ChunkNameGetterFnCtx { module, chunks: &selected_chunks, cache_group_key: &cache_group.key }; f(ctx)? } }; diff --git a/packages/rspack-test-tools/tests/configCases/split-chunks/cache-group-name-add-chunks-cachegroupkey/index.js b/packages/rspack-test-tools/tests/configCases/split-chunks/cache-group-name-add-chunks-cachegroupkey/index.js new file mode 100644 index 000000000000..6c58a1324eba --- /dev/null +++ b/packages/rspack-test-tools/tests/configCases/split-chunks/cache-group-name-add-chunks-cachegroupkey/index.js @@ -0,0 +1,3 @@ +it("should run", () => { + process.env.NODE_ENV; +}); \ No newline at end of file diff --git a/packages/rspack-test-tools/tests/configCases/split-chunks/cache-group-name-add-chunks-cachegroupkey/webpack.config.js b/packages/rspack-test-tools/tests/configCases/split-chunks/cache-group-name-add-chunks-cachegroupkey/webpack.config.js new file mode 100644 index 000000000000..848972d897d6 --- /dev/null +++ b/packages/rspack-test-tools/tests/configCases/split-chunks/cache-group-name-add-chunks-cachegroupkey/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("@rspack/core").Configuration} */ +module.exports = { + entry: { + main: "./index" + }, + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + chunks: "all", + minSize: 0, + cacheGroups: { + foo: { + test: /\.js/, + name(module, chunks, cacheGroupKey) { + expect(chunks.length).toBeGreaterThan(0); + expect(cacheGroupKey).toBe("foo"); + } + } + } + } + } +}; diff --git a/packages/rspack/src/builtin-plugin/SplitChunksPlugin.ts b/packages/rspack/src/builtin-plugin/SplitChunksPlugin.ts index 96ff9abee8b2..250693a7a11c 100644 --- a/packages/rspack/src/builtin-plugin/SplitChunksPlugin.ts +++ b/packages/rspack/src/builtin-plugin/SplitChunksPlugin.ts @@ -40,6 +40,8 @@ function toRawSplitChunksOptions( function getName(name: any) { interface Context { module: JsModule; + chunks: JsChunk[]; + cacheGroupKey: string; } if (typeof name === "function") { @@ -48,7 +50,9 @@ function toRawSplitChunksOptions( return name(undefined); } else { return name( - Module.__from_binding(ctx.module, compiler._lastCompilation) + Module.__from_binding(ctx.module, compiler._lastCompilation), + getChunks(ctx.chunks), + ctx.cacheGroupKey ); } };