@@ -98,6 +98,7 @@ export class App {
98
98
// Environment variables injected by garfish for linkage with child applications
99
99
private globalEnvVariables : Record < string , any > ;
100
100
private deferNodeMap = new Map ( ) ;
101
+ private asyncNodeMap = new Map ( ) ;
101
102
private resolveAsyncProvider : ( ) => void | undefined ;
102
103
private asyncProvider ?:
103
104
| interfaces . Provider
@@ -476,18 +477,42 @@ export class App {
476
477
let noEntry = false ;
477
478
const targetUrl = jsManager . url || this . appInfo . entry ;
478
479
480
+ const mockOriginScript = document . createElement ( 'script' ) ;
481
+
479
482
if ( type === 'defer' ) {
480
483
const node = this . deferNodeMap . get ( jsManager ) ;
481
484
if ( node ) {
482
485
noEntry = toBoolean (
483
486
this . entryManager . findAttributeValue ( node , 'no-entry' ) ,
484
487
) ;
488
+
489
+ node . attributes . forEach ( ( attribute ) => {
490
+ if ( attribute . key ) {
491
+ mockOriginScript . setAttribute (
492
+ attribute . key ,
493
+ attribute . value || '' ,
494
+ ) ;
495
+ }
496
+ } ) ;
485
497
}
486
498
// Try to read the childApp global configuration
487
499
if ( ! noEntry ) {
488
500
noEntry = toBoolean ( this . isNoEntryScript ( targetUrl ) ) ;
489
501
}
490
502
}
503
+
504
+ const node = this . asyncNodeMap . get ( jsManager ) ;
505
+ if ( node ) {
506
+ node . attributes . forEach ( ( attribute ) => {
507
+ if ( attribute . key ) {
508
+ mockOriginScript . setAttribute (
509
+ attribute . key ,
510
+ attribute . value || '' ,
511
+ ) ;
512
+ }
513
+ } ) ;
514
+ }
515
+
491
516
this . execScript ( jsManager . scriptCode , { } , targetUrl , {
492
517
noEntry,
493
518
defer : type === 'defer' ,
@@ -703,36 +728,40 @@ export class App {
703
728
}
704
729
705
730
const jsManager = resources . js . find ( ( manager ) => {
706
- return ! manager . async ? manager . isSameOrigin ( node ) : false ;
731
+ if ( manager . async ) {
732
+ this . asyncNodeMap . set ( manager , node ) ;
733
+ return false ;
734
+ }
735
+ if ( manager . defer ) {
736
+ this . deferNodeMap . set ( manager , node ) ;
737
+ return false ;
738
+ }
739
+ return manager . isSameOrigin ( node ) ;
707
740
} ) ;
708
741
709
742
if ( jsManager ) {
710
- if ( jsManager . defer ) {
711
- this . deferNodeMap . set ( jsManager , node ) ;
712
- } else {
713
- const { url, scriptCode } = jsManager ;
714
- const mockOriginScript = document . createElement ( 'script' ) ;
715
- node . attributes . forEach ( ( attribute ) => {
716
- if ( attribute . key ) {
717
- mockOriginScript . setAttribute (
718
- attribute . key ,
719
- attribute . value || '' ,
720
- ) ;
721
- }
722
- } ) ;
743
+ const { url, scriptCode } = jsManager ;
744
+ const mockOriginScript = document . createElement ( 'script' ) ;
745
+ node . attributes . forEach ( ( attribute ) => {
746
+ if ( attribute . key ) {
747
+ mockOriginScript . setAttribute (
748
+ attribute . key ,
749
+ attribute . value || '' ,
750
+ ) ;
751
+ }
752
+ } ) ;
723
753
724
- const targetUrl = url || this . appInfo . entry ;
725
- this . execScript ( scriptCode , { } , targetUrl , {
726
- isModule,
727
- async : false ,
728
- defer : false ,
729
- isInline : jsManager . isInlineScript ( ) ,
730
- noEntry :
731
- toBoolean ( entryManager . findAttributeValue ( node , 'no-entry' ) ) ||
732
- toBoolean ( this . isNoEntryScript ( targetUrl ) ) ,
733
- originScript : mockOriginScript ,
734
- } ) ;
735
- }
754
+ const targetUrl = url || this . appInfo . entry ;
755
+ this . execScript ( scriptCode , { } , targetUrl , {
756
+ isModule,
757
+ async : false ,
758
+ defer : false ,
759
+ isInline : jsManager . isInlineScript ( ) ,
760
+ noEntry :
761
+ toBoolean ( entryManager . findAttributeValue ( node , 'no-entry' ) ) ||
762
+ toBoolean ( this . isNoEntryScript ( targetUrl ) ) ,
763
+ originScript : mockOriginScript ,
764
+ } ) ;
736
765
} else if ( __DEV__ ) {
737
766
const async = entryManager . findAttributeValue ( node , 'async' ) ;
738
767
if ( typeof async === 'undefined' || async === 'false' ) {
0 commit comments