11import { EventHub } from './event'
22import { LoaderEvent } from '../types'
3+ import { $fetch , isRelativeURL } from '../utils/tools'
34
45
56export class Loader {
67
7- readonly baseEvent : LoaderEvent = { source : '' , type : 'none' , success : true , insertScripts : ( ) => { } }
88 hub : EventHub
9+ readonly baseEvent : LoaderEvent = { source : '' , type : 'none' , success : true , insertScripts : ( ) => { } }
10+
11+ static resourceReg ( str : string ) : RegExp {
12+ return {
13+ script : / \< s c r i p t \s + \S ? s r c \= \" ( [ ^ " ] * ) \" / g,
14+ } [ str ]
15+ }
16+
917 constructor ( hub : EventHub ) {
1018 this . hub = hub
1119 }
1220
1321 scripts ( urls : string [ ] ) : void {
14- const scriptEvent = Object . assign ( { } , this . baseEvent , { type : 'script' } )
22+ this . loadURL ( urls , 'script' )
23+ }
24+
25+ styles ( urls : string [ ] ) : void {
26+ this . loadURL ( urls , 'style' )
27+ }
28+
29+ pages ( urls : string [ ] ) : void {
1530 urls . forEach ( url => {
16- fetch ( url )
17- . then ( ( ) => {
18- this . hub . dispath ( 'back_load_completed' , Object . assign ( { } ,
19- scriptEvent , { source : url , insertScripts : this . makeInsertScripts ( url ) } ) )
31+ $fetch ( url , { mode : 'cors' } )
32+ . then ( html => {
33+ console . log ( html )
34+ this . scripts ( this . filterResources ( html , 'script' ) )
35+ } )
36+ . catch ( ( e ) => {
37+ console . log ( e )
2038 } )
21- . catch ( ( ) => {
22- this . hub . dispath ( 'back_load_completed' , Object . assign ( { } ,
23- scriptEvent , { source : url , success : false } ) )
39+ } )
40+ }
41+
42+ private filterResources ( source : string , type : string ) : string [ ] {
43+ const reg : RegExp = Loader . resourceReg ( type ) , arr : string [ ] = [ ]
44+ let result : string [ ] , num = 10
45+ while ( ( result = reg . exec ( source ) ) && num -- ) {
46+ if ( result [ 1 ] && ! isRelativeURL ( result [ 1 ] ) ) {
47+ arr . push ( result [ 1 ] )
48+ }
49+ }
50+ return arr
51+ }
52+
53+ private loadURL ( urls : string [ ] , type : string ) : void {
54+ urls . forEach ( url => {
55+ const scriptEvent = Object . assign ( { } , this . baseEvent , {
56+ type : type , source : url ,
2457 } )
58+ $fetch ( url )
59+ . then ( ( ) => this . emit ( scriptEvent ) )
60+ . catch ( ( ) => this . emit ( Object . assign ( { } , scriptEvent , { success : false } ) ) )
2561 } )
2662 }
2763
@@ -32,4 +68,12 @@ export class Loader {
3268 document . body . appendChild ( s )
3369 }
3470 }
71+
72+ private emit ( event : LoaderEvent ) : void {
73+ const next : LoaderEvent = Object . assign ( { } , event , event . type === 'script' ? {
74+ insertScripts : this . makeInsertScripts ( event . source ) ,
75+ } : { } )
76+ this . hub . dispath ( 'back_load_completed' , next )
77+ }
78+
3579}
0 commit comments