@@ -2,54 +2,6 @@ import MagicString from 'magic-string'
2
2
import { ResolvedConfig } from '..'
3
3
import { Plugin } from '../plugin'
4
4
5
- type NodeResolveFilename = (
6
- request : string ,
7
- parent : NodeModule ,
8
- isMain : boolean ,
9
- options ?: Record < string , any >
10
- ) => string
11
-
12
- export function dedupeRequire ( dedupe : string [ ] , module : NodeModule ) {
13
- const Module = require ( 'module' ) as { _resolveFilename : NodeResolveFilename }
14
- const resolveFilename = Module . _resolveFilename
15
- Module . _resolveFilename = getDedupeRequire ( resolveFilename ) ( dedupe , module )
16
- return ( ) => {
17
- Module . _resolveFilename = resolveFilename
18
- }
19
- }
20
-
21
- const getDedupeRequire = ( resolveFilename ?: NodeResolveFilename ) => {
22
- const dedupeRequireImpl = (
23
- dedupe : string [ ] ,
24
- module : NodeModule
25
- ) : NodeResolveFilename =>
26
- function ( request , parent , isMain , options ) {
27
- if ( request [ 0 ] !== '.' && request [ 0 ] !== '/' ) {
28
- const parts = request . split ( '/' )
29
- const pkgName =
30
- parts [ 0 ] [ 0 ] === '@' ? parts [ 0 ] + '/' + parts [ 1 ] : parts [ 0 ]
31
- if ( dedupe . includes ( pkgName ) ) {
32
- // Use this module as the parent.
33
- parent = module
34
- }
35
- }
36
- return resolveFilename ! ( request , parent , isMain , options )
37
- }
38
-
39
- if ( resolveFilename ) {
40
- return dedupeRequireImpl
41
- }
42
-
43
- return new Function (
44
- `dedupe` ,
45
- `var Module = require("module");
46
- var resolveFilename = Module._resolveFilename;
47
- Module._resolveFilename = ${ dedupeRequireImpl
48
- . toString ( )
49
- . replace ( / ^ .+ ? = > / , '' ) } ;`
50
- )
51
- }
52
-
53
5
export function ssrRequireHookPlugin ( config : ResolvedConfig ) : Plugin | null {
54
6
if ( config . command !== 'build' || ! config . resolve . dedupe ?. length ) {
55
7
return null
@@ -61,7 +13,7 @@ export function ssrRequireHookPlugin(config: ResolvedConfig): Plugin | null {
61
13
if ( moduleInfo ?. isEntry ) {
62
14
const s = new MagicString ( code )
63
15
s . prepend (
64
- `;(${ getDedupeRequire ( ) } )(${ JSON . stringify (
16
+ `;(${ dedupeRequire . toString ( ) } )(${ JSON . stringify (
65
17
config . resolve . dedupe
66
18
) } );\n`
67
19
)
@@ -75,3 +27,36 @@ export function ssrRequireHookPlugin(config: ResolvedConfig): Plugin | null {
75
27
}
76
28
}
77
29
}
30
+
31
+ type NodeResolveFilename = (
32
+ request : string ,
33
+ parent : NodeModule ,
34
+ isMain : boolean ,
35
+ options ?: Record < string , any >
36
+ ) => string
37
+
38
+ /** Respect the `resolve.dedupe` option in production SSR. */
39
+ function dedupeRequire ( dedupe : string [ ] ) {
40
+ const Module = require ( 'module' ) as { _resolveFilename : NodeResolveFilename }
41
+ const resolveFilename = Module . _resolveFilename
42
+ Module . _resolveFilename = function ( request , parent , isMain , options ) {
43
+ if ( request [ 0 ] !== '.' && request [ 0 ] !== '/' ) {
44
+ const parts = request . split ( '/' )
45
+ const pkgName = parts [ 0 ] [ 0 ] === '@' ? parts [ 0 ] + '/' + parts [ 1 ] : parts [ 0 ]
46
+ if ( dedupe . includes ( pkgName ) ) {
47
+ // Use this module as the parent.
48
+ parent = module
49
+ }
50
+ }
51
+ return resolveFilename ! ( request , parent , isMain , options )
52
+ }
53
+ }
54
+
55
+ export function hookNodeResolve ( resolver : NodeResolveFilename ) {
56
+ const Module = require ( 'module' ) as { _resolveFilename : NodeResolveFilename }
57
+ const resolveFilename = Module . _resolveFilename
58
+ Module . _resolveFilename = resolver
59
+ return ( ) => {
60
+ Module . _resolveFilename = resolveFilename
61
+ }
62
+ }
0 commit comments