@@ -28,6 +28,13 @@ class JsonpMainTemplatePlugin {
2828 }
2929 return false ;
3030 } ;
31+ const needEntryChunkPrefetch = chunk => {
32+ const preloadMaps = chunk . getChildIdsByOrders ( ) ;
33+ for ( const preloadGroup of Object . keys ( preloadMaps ) ) {
34+ if ( preloadMaps [ preloadGroup ] . length > 0 ) return true ;
35+ }
36+ return false ;
37+ } ;
3138 // TODO refactor this
3239 if ( ! mainTemplate . hooks . jsonpScript ) {
3340 mainTemplate . hooks . jsonpScript = new SyncWaterfallHook ( [
@@ -106,6 +113,38 @@ class JsonpMainTemplatePlugin {
106113 contentHashType : "javascript"
107114 } ) ;
108115 } ;
116+
117+ const linkPreload = mainTemplate => {
118+ const crossOriginLoading = mainTemplate . outputOptions . crossOriginLoading ;
119+ const jsonpScriptType = mainTemplate . outputOptions . jsonpScriptType ;
120+ return Template . asString ( [
121+ "var link = document.createElement('link');" ,
122+ jsonpScriptType
123+ ? `link.type = ${ JSON . stringify ( jsonpScriptType ) } ;`
124+ : "" ,
125+ "link.charset = 'utf-8';" ,
126+ crossOriginLoading
127+ ? `link.crossOrigin = ${ JSON . stringify ( crossOriginLoading ) } ;`
128+ : "" ,
129+ `if (${ mainTemplate . requireFn } .nc) {` ,
130+ Template . indent (
131+ `link.setAttribute("nonce", ${ mainTemplate . requireFn } .nc);`
132+ ) ,
133+ "}" ,
134+ 'link.rel = "preload";' ,
135+ 'link.as = "script";' ,
136+ "link.href = jsonpScriptSrc(chunkId);"
137+ ] ) ;
138+ } ;
139+
140+ const linkPrefetch = ( ) => {
141+ return Template . asString ( [
142+ "var link = document.createElement('link');" ,
143+ 'link.rel = "prefetch";' ,
144+ "link.href = jsonpScriptSrc(chunkId);"
145+ ] ) ;
146+ } ;
147+
109148 mainTemplate . hooks . localVars . tap (
110149 "JsonpMainTemplatePlugin" ,
111150 ( source , chunk , hash ) => {
@@ -140,6 +179,33 @@ class JsonpMainTemplatePlugin {
140179 "}"
141180 ) ;
142181 }
182+ if ( needEntryChunkPrefetch ( chunk ) ) {
183+ let preloadPrefetchChildren = chunk . getChildIdsByOrders ( ) ;
184+ extraCode . push (
185+ "" ,
186+ "// preload or prefetch split chunks from entry chunk" ,
187+ "(function prefetchOrPreloadFromEntry() {" ,
188+ preloadPrefetchChildren . preload
189+ ? Template . indent ( [
190+ `${ JSON . stringify (
191+ preloadPrefetchChildren . preload
192+ ) } .map(chunkId => {`,
193+ Template . indent ( [ linkPreload ( mainTemplate ) ] ) ,
194+ `});`
195+ ] )
196+ : "" ,
197+ preloadPrefetchChildren . prefetch
198+ ? Template . indent ( [
199+ `${ JSON . stringify (
200+ preloadPrefetchChildren . prefetch || [ ]
201+ ) } .map(chunkId => {`,
202+ Template . indent ( [ linkPrefetch ( ) ] ) ,
203+ `});`
204+ ] )
205+ : "" ,
206+ "})();"
207+ ) ;
208+ }
143209 if ( extraCode . length === 0 ) return source ;
144210 return Template . asString ( [ source , ...extraCode ] ) ;
145211 }
@@ -205,38 +271,13 @@ class JsonpMainTemplatePlugin {
205271 mainTemplate . hooks . linkPreload . tap (
206272 "JsonpMainTemplatePlugin" ,
207273 ( _ , chunk , hash ) => {
208- const crossOriginLoading =
209- mainTemplate . outputOptions . crossOriginLoading ;
210- const jsonpScriptType = mainTemplate . outputOptions . jsonpScriptType ;
211-
212- return Template . asString ( [
213- "var link = document.createElement('link');" ,
214- jsonpScriptType
215- ? `link.type = ${ JSON . stringify ( jsonpScriptType ) } ;`
216- : "" ,
217- "link.charset = 'utf-8';" ,
218- crossOriginLoading
219- ? `link.crossOrigin = ${ JSON . stringify ( crossOriginLoading ) } ;`
220- : "" ,
221- `if (${ mainTemplate . requireFn } .nc) {` ,
222- Template . indent (
223- `link.setAttribute("nonce", ${ mainTemplate . requireFn } .nc);`
224- ) ,
225- "}" ,
226- 'link.rel = "preload";' ,
227- 'link.as = "script";' ,
228- "link.href = jsonpScriptSrc(chunkId);"
229- ] ) ;
274+ return linkPreload ( mainTemplate ) ;
230275 }
231276 ) ;
232277 mainTemplate . hooks . linkPrefetch . tap (
233278 "JsonpMainTemplatePlugin" ,
234279 ( _ , chunk , hash ) => {
235- return Template . asString ( [
236- "var link = document.createElement('link');" ,
237- 'link.rel = "prefetch";' ,
238- "link.href = jsonpScriptSrc(chunkId);"
239- ] ) ;
280+ return linkPrefetch ( ) ;
240281 }
241282 ) ;
242283 mainTemplate . hooks . requireEnsure . tap (
0 commit comments