diff --git a/src/index.ts b/src/index.ts index 7d55db1..7254abc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -87,6 +87,11 @@ class ReactRefreshRspackPlugin { or: [this.options.exclude!, [...runtimePaths]].filter(Boolean), }, resourceQuery: this.options.resourceQuery, + dependency: { + // `new URL("static/sdk.js", import.meta.url)` the sdk.js is an asset module + // we shoudn't inject react refresh for asset module + not: ['url'], + }, use: ReactRefreshRspackPlugin.loader, }); } diff --git a/test/fixtures/url/index.mjs b/test/fixtures/url/index.mjs new file mode 100644 index 0000000..4b629e5 --- /dev/null +++ b/test/fixtures/url/index.mjs @@ -0,0 +1,2 @@ +import 'foo'; +new URL('./sdk.js', import.meta.url); diff --git a/test/fixtures/url/sdk.js b/test/fixtures/url/sdk.js new file mode 100644 index 0000000..91fbb7f --- /dev/null +++ b/test/fixtures/url/sdk.js @@ -0,0 +1 @@ +'foo'; diff --git a/test/test.spec.ts b/test/test.spec.ts index effcf59..fcc8495 100644 --- a/test/test.spec.ts +++ b/test/test.spec.ts @@ -27,16 +27,20 @@ const compileWithReactRefresh = ( callback: CompilationCallback, ) => { let dist = path.join(fixturePath, 'dist'); + let cjsEntry = path.join(fixturePath, 'index.js'); + let mjsEntry = path.join(fixturePath, 'index.mjs'); + let entry = fs.existsSync(cjsEntry) ? cjsEntry : mjsEntry; rspack( { mode: 'development', context: fixturePath, entry: { - fixture: path.join(fixturePath, 'index.js'), + fixture: entry, }, output: { path: dist, uniqueName, + assetModuleFilename: '[name][ext]', }, plugins: [new ReactRefreshPlugin(refreshOptions)], optimization: { @@ -164,6 +168,22 @@ describe('react-refresh-rspack-plugin', () => { ); }); + it('should exclude url dependency when compiling', (done) => { + compileWithReactRefresh( + path.join(__dirname, 'fixtures/url'), + {}, + (_, stats) => { + const json = stats!.toJson({ all: false, outputPath: true }); + const asset = fs.readFileSync( + path.resolve(json.outputPath!, 'sdk.js'), + 'utf-8', + ); + expect(asset).not.toContain('function $RefreshReg$'); + done(); + }, + ); + }); + it('should allow custom inject loader when compiling', (done) => { expect(ReactRefreshPlugin.loader).toBe('builtin:react-refresh-loader'); compileWithReactRefresh(