@@ -31,12 +31,14 @@ interface Module {
31
31
interface Renderer {
32
32
renderPage : Function
33
33
renderHead : Function
34
+ renderScripts : Function
34
35
}
35
36
36
37
interface RenderResult {
37
38
url : RouterURL
38
39
status : number
39
40
head : string [ ]
41
+ scripts : Record < string , any > [ ]
40
42
body : string
41
43
data : Record < string , string > | null
42
44
}
@@ -52,7 +54,7 @@ export class Project {
52
54
#routing: Routing = new Routing ( )
53
55
#apiRouting: Routing = new Routing ( )
54
56
#fsWatchListeners: Array < EventEmitter > = [ ]
55
- #renderer: Renderer = { renderPage : ( ) => void 0 , renderHead : ( ) => void 0 }
57
+ #renderer: Renderer = { renderPage : ( ) => void 0 , renderHead : ( ) => void 0 , renderScripts : ( ) => void 0 }
56
58
#rendered: Map < string , Map < string , RenderResult > > = new Map ( )
57
59
#postcssPlugins: Record < string , AcceptedPlugin > = { }
58
60
@@ -76,7 +78,6 @@ export class Project {
76
78
plugins : [ ] ,
77
79
postcss : {
78
80
plugins : [
79
- 'postcss-flexbugs-fixes' ,
80
81
'autoprefixer'
81
82
]
82
83
}
@@ -238,14 +239,15 @@ export class Project {
238
239
239
240
const { baseUrl } = this . config
240
241
const mainModule = this . #modules. get ( '/main.js' ) !
241
- const { url, status, head, body, data } = await this . _renderPage ( loc )
242
+ const { url, status, head, scripts , body, data } = await this . _renderPage ( loc )
242
243
const html = createHtml ( {
243
244
lang : url . locale ,
244
245
head : head ,
245
246
scripts : [
246
247
data ? { type : 'application/json' , innerText : JSON . stringify ( data ) , id : 'ssr-data' } : '' ,
247
248
{ src : path . join ( baseUrl , `/_aleph/main.${ mainModule . hash . slice ( 0 , hashShort ) } .js` ) , type : 'module' } ,
248
249
{ src : path . join ( baseUrl , `/_aleph/-/deno.land/x/aleph/nomodule.js${ this . isDev ? '?dev' : '' } ` ) , nomodule : true } ,
250
+ ...scripts
249
251
] ,
250
252
body,
251
253
minify : ! this . isDev
@@ -339,7 +341,7 @@ export class Project {
339
341
340
342
// write 404 page
341
343
const { baseUrl } = this . config
342
- const { url, head, body, data } = await this . _render404Page ( )
344
+ const { url, head, scripts , body, data } = await this . _render404Page ( )
343
345
const mainModule = this . #modules. get ( '/main.js' ) !
344
346
const e404PageHtml = createHtml ( {
345
347
lang : url . locale ,
@@ -348,6 +350,7 @@ export class Project {
348
350
data ? { type : 'application/json' , innerText : JSON . stringify ( data ) , id : 'ssr-data' } : '' ,
349
351
{ src : path . join ( baseUrl , `/_aleph/main.${ mainModule . hash . slice ( 0 , hashShort ) } .js` ) , type : 'module' } ,
350
352
{ src : path . join ( baseUrl , `/_aleph/-/deno.land/x/aleph/nomodule.js${ this . isDev ? '?dev' : '' } ` ) , nomodule : true } ,
353
+ ...scripts
351
354
] ,
352
355
body,
353
356
minify : ! this . isDev
@@ -521,7 +524,7 @@ export class Project {
521
524
} else {
522
525
name = p . name
523
526
}
524
- const { default :
Plugin } = await import ( `https://esm.sh/${ name } [email protected] ` )
527
+ const { default :
Plugin } = await import ( `https://esm.sh/${ name } [email protected] &no-check ` )
525
528
this . #postcssPlugins[ name ] = Plugin
526
529
} )
527
530
}
@@ -598,8 +601,8 @@ export class Project {
598
601
await this . _compile ( 'https://deno.land/x/aleph/renderer.ts' , { forceTarget : 'es2020' } )
599
602
await this . _createMainModule ( )
600
603
601
- const { renderPage, renderHead } = await import ( 'file://' + this . #modules. get ( '//deno.land/x/aleph/renderer.js' ) ! . jsFile )
602
- this . #renderer = { renderPage, renderHead }
604
+ const { renderPage, renderHead, renderScripts } = await import ( 'file://' + this . #modules. get ( '//deno.land/x/aleph/renderer.js' ) ! . jsFile )
605
+ this . #renderer = { renderPage, renderHead, renderScripts }
603
606
604
607
log . info ( colors . bold ( 'Aleph.js' ) )
605
608
if ( '__file' in this . config ) {
@@ -885,10 +888,10 @@ export class Project {
885
888
break
886
889
}
887
890
}
888
- if ( / ^ h t t p s ? : \/ \/ [ 0 - 9 a - z \. \- ] + \/ r e a c t ( @ [ 0 - 9 a - z \. \- ] + ) ? \/ ? $ / i. test ( url ) ) {
891
+ if ( / ^ h t t p s ? : \/ \/ [ 0 - 9 a - z \. \- ] + \/ r e a c t ( @ [ 0 - 9 a - z \. \- ] + ) ? \/ ? $ / i. test ( dlUrl ) ) {
889
892
dlUrl = this . config . reactUrl
890
893
}
891
- if ( / ^ h t t p s ? : \/ \/ [ 0 - 9 a - z \. \- ] + \/ r e a c t \- d o m ( @ [ 0 - 9 a - z \. \- ] + ) ? ( \/ s e r v e r ) ? \/ ? $ / i. test ( url ) ) {
894
+ if ( / ^ h t t p s ? : \/ \/ [ 0 - 9 a - z \. \- ] + \/ r e a c t \- d o m ( @ [ 0 - 9 a - z \. \- ] + ) ? ( \/ s e r v e r ) ? \/ ? $ / i. test ( dlUrl ) ) {
892
895
dlUrl = this . config . reactDomUrl
893
896
if ( / \/ s e r v e r \/ ? $ / i. test ( url ) ) {
894
897
dlUrl += '/server'
@@ -966,7 +969,6 @@ export class Project {
966
969
let css : string = sourceContent
967
970
if ( mod . id . endsWith ( '.less' ) ) {
968
971
try {
969
- // todo: sourceMap
970
972
const output = await less . render ( sourceContent || '/* empty content */' )
971
973
css = output . css
972
974
} catch ( error ) {
@@ -983,7 +985,7 @@ export class Project {
983
985
} )
984
986
css = ( await postcss ( plugins ) . process ( css ) . async ( ) ) . content
985
987
if ( this . isDev ) {
986
- css = String ( css ) . trim ( )
988
+ css = css . trim ( )
987
989
} else {
988
990
const output = cleanCSS . minify ( css )
989
991
css = output . styles
@@ -995,7 +997,7 @@ export class Project {
995
997
) ) } ;`,
996
998
`applyCSS(${ JSON . stringify ( url ) } , ${ JSON . stringify ( this . isDev ? `\n${ css } \n` : css ) } );` ,
997
999
] . join ( this . isDev ? '\n' : '' )
998
- mod . jsSourceMap = ''
1000
+ mod . jsSourceMap = '' // todo: sourceMap
999
1001
mod . hash = getHash ( css )
1000
1002
} else if ( mod . loader === 'markdown' ) {
1001
1003
const { __content, ...props } = safeLoadFront ( sourceContent )
@@ -1250,7 +1252,7 @@ export class Project {
1250
1252
this . #rendered. set ( url . pagePath , new Map ( ) )
1251
1253
}
1252
1254
}
1253
- const ret : RenderResult = { url, status : url . pagePath === '' ? 404 : 200 , head : [ ] , body : '<main></main>' , data : null }
1255
+ const ret : RenderResult = { url, status : url . pagePath === '' ? 404 : 200 , head : [ ] , scripts : [ ] , body : '<main></main>' , data : null }
1254
1256
Object . assign ( window , {
1255
1257
location : {
1256
1258
protocol : 'http:' ,
@@ -1292,6 +1294,7 @@ export class Project {
1292
1294
...pageModuleTree . map ( ( { id } ) => this . _lookupAsyncDeps ( id ) . filter ( ( { url } ) => reStyleModuleExt . test ( url ) ) )
1293
1295
] . flat ( ) )
1294
1296
ret . head = head
1297
+ ret . scripts = await this . #renderer. renderScripts ( )
1295
1298
ret . body = `<main>${ html } </main>`
1296
1299
ret . data = data
1297
1300
this . #rendered. get ( url . pagePath ) ! . set ( key , ret )
@@ -1308,7 +1311,7 @@ export class Project {
1308
1311
}
1309
1312
1310
1313
private async _render404Page ( url : RouterURL = { locale : this . config . defaultLocale , pagePath : '' , pathname : '/' , params : { } , query : new URLSearchParams ( ) } ) {
1311
- const ret : RenderResult = { url, status : 404 , head : [ ] , body : '<main></main>' , data : null }
1314
+ const ret : RenderResult = { url, status : 404 , head : [ ] , scripts : [ ] , body : '<main></main>' , data : null }
1312
1315
try {
1313
1316
const e404Module = this . #modules. get ( '/404.js' )
1314
1317
const { default : E404 } = e404Module ? await import ( 'file://' + e404Module . jsFile ) : { } as any
@@ -1317,6 +1320,7 @@ export class Project {
1317
1320
e404Module ? this . _lookupAsyncDeps ( e404Module . id ) . filter ( ( { url } ) => reStyleModuleExt . test ( url ) ) : [ ]
1318
1321
] . flat ( ) )
1319
1322
ret . head = head
1323
+ ret . scripts = await this . #renderer. renderScripts ( )
1320
1324
ret . body = `<main>${ html } </main>`
1321
1325
ret . data = data
1322
1326
} catch ( err ) {
0 commit comments