Skip to content

Commit abae9b9

Browse files
committed
[DURACOM-234] WIP fix SSR
1 parent 3cb000d commit abae9b9

14 files changed

Lines changed: 87 additions & 37 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/.angular/cache
2+
/.nx
23
/__build__
34
/__server_build__
45
/node_modules

angular.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,15 @@
109109
"serve": {
110110
"builder": "@angular-builders/custom-webpack:dev-server",
111111
"options": {
112-
"browserTarget": "dspace-angular:build",
112+
"buildTarget": "dspace-angular:build",
113113
"port": 4000
114114
},
115115
"configurations": {
116116
"development": {
117-
"browserTarget": "dspace-angular:build:development"
117+
"buildTarget": "dspace-angular:build:development"
118118
},
119119
"production": {
120-
"browserTarget": "dspace-angular:build:production"
120+
"buildTarget": "dspace-angular:build:production"
121121
}
122122
}
123123
},
@@ -219,21 +219,21 @@
219219
"serve-ssr": {
220220
"builder": "@angular-devkit/build-angular:ssr-dev-server",
221221
"options": {
222-
"browserTarget": "dspace-angular:build",
222+
"buildTarget": "dspace-angular:build",
223223
"serverTarget": "dspace-angular:server",
224224
"port": 4000
225225
},
226226
"configurations": {
227227
"production": {
228-
"browserTarget": "dspace-angular:build:production",
228+
"buildTarget": "dspace-angular:build:production",
229229
"serverTarget": "dspace-angular:server:production"
230230
}
231231
}
232232
},
233233
"prerender": {
234234
"builder": "@angular-devkit/build-angular:prerender",
235235
"options": {
236-
"browserTarget": "dspace-angular:build:production",
236+
"buildTarget": "dspace-angular:build:production",
237237
"serverTarget": "dspace-angular:server:production",
238238
"routes": [
239239
"/"

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@
200200
"sass-loader": "^12.6.0",
201201
"sass-resources-loader": "^2.2.5",
202202
"ts-node": "^8.10.2",
203-
"typescript": "~5.4.2",
203+
"typescript": "~5.3.3",
204204
"webpack": "5.76.1",
205205
"webpack-bundle-analyzer": "^4.8.0",
206206
"webpack-cli": "^4.2.0",
207207
"webpack-dev-server": "^4.13.3"
208208
}
209-
}
209+
}

server.ts

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ import { join } from 'path';
3939

4040
import { enableProdMode } from '@angular/core';
4141

42-
import { ngExpressEngine } from '@nguniversal/express-engine';
43-
import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens';
42+
4443

4544
import { environment } from './src/environments/environment';
4645
import { createProxyMiddleware } from 'http-proxy-middleware';
@@ -55,6 +54,11 @@ import { APP_CONFIG, AppConfig } from './src/config/app-config.interface';
5554
import { extendEnvironmentWithAppConfig } from './src/config/config.util';
5655
import { logStartupMessage } from './startup-message';
5756
import { TOKENITEM } from './src/app/core/auth/models/auth-token-info.model';
57+
import { CommonEngine } from '@angular/ssr';
58+
import { APP_BASE_HREF } from '@angular/common';
59+
import { REQUEST, RESPONSE } from './src/express.tokens';
60+
import { dirname, resolve } from 'node:path';
61+
import { fileURLToPath } from 'node:url';
5862

5963

6064
/*
@@ -88,6 +92,9 @@ export function app() {
8892
* Create a new express application
8993
*/
9094
const server = express();
95+
const serverDistFolder = dirname(fileURLToPath(import.meta.url));
96+
const browserDistFolder = resolve(serverDistFolder, '../browser');
97+
const commonEngine = new CommonEngine();
9198

9299
// Tell Express to trust X-FORWARDED-* headers from proxies
93100
// See https://expressjs.com/en/guide/behind-proxies.html
@@ -128,7 +135,7 @@ export function app() {
128135
server.use(json());
129136

130137
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
131-
server.engine('html', (_, options, callback) =>
138+
/* server.engine('html', (_, options, callback) =>
132139
ngExpressEngine({
133140
bootstrap,
134141
providers: [
@@ -146,7 +153,7 @@ export function app() {
146153
},
147154
],
148155
})(_, (options as any), callback),
149-
);
156+
);*/
150157

151158
server.engine('ejs', ejs.renderFile);
152159

@@ -227,7 +234,12 @@ export function app() {
227234
* copy of the page (see cacheCheck())
228235
*/
229236
router.get('*', cacheCheck, ngApp);
230-
237+
// All regular routes use the Angular engine
238+
// server.get('*', (req, res, next) => {
239+
// const { protocol, originalUrl, baseUrl, headers } = req;
240+
//
241+
//
242+
// });
231243
server.use(environment.ui.nameSpace, router);
232244

233245
return server;
@@ -236,10 +248,10 @@ export function app() {
236248
/*
237249
* The callback function to serve server side angular
238250
*/
239-
function ngApp(req, res) {
251+
function ngApp(req, res, next) {
240252
if (environment.universal.preboot) {
241253
// Render the page to user via SSR (server side rendering)
242-
serverSideRender(req, res);
254+
serverSideRender(req, res, next);
243255
} else {
244256
// If preboot is disabled, just serve the client
245257
console.log('Universal off, serving for direct client-side rendering (CSR)');
@@ -255,9 +267,37 @@ function ngApp(req, res) {
255267
* @param sendToUser if true (default), send the rendered content to the user.
256268
* If false, then only save this rendered content to the in-memory cache (to refresh cache).
257269
*/
258-
function serverSideRender(req, res, sendToUser: boolean = true) {
270+
function serverSideRender(req, res, next, sendToUser: boolean = true) {
271+
const { protocol, originalUrl, baseUrl, headers } = req;
272+
const commonEngine = new CommonEngine();
259273
// Render the page via SSR (server side rendering)
260-
res.render(indexHtml, {
274+
commonEngine
275+
.render({
276+
bootstrap,
277+
documentFilePath: indexHtml,
278+
url: `${protocol}://${headers.host}${originalUrl}`,
279+
publicPath: DIST_FOLDER,
280+
providers: [
281+
{ provide: APP_BASE_HREF, useValue: baseUrl },
282+
{
283+
provide: REQUEST,
284+
useValue: req,
285+
},
286+
{
287+
provide: RESPONSE,
288+
useValue: res,
289+
},
290+
{
291+
provide: APP_CONFIG,
292+
useValue: environment,
293+
},
294+
],
295+
})
296+
.then((html) => res.send(html))
297+
.catch((err) => next(err));
298+
299+
300+
/* res.render(indexHtml, {
261301
req,
262302
res,
263303
preboot: environment.universal.preboot,
@@ -290,7 +330,7 @@ function serverSideRender(req, res, sendToUser: boolean = true) {
290330
clientSideRender(req, res);
291331
}
292332
}
293-
});
333+
});*/
294334
}
295335

296336
/**
@@ -426,7 +466,7 @@ function checkCacheForRequest(cacheName: string, cache: LRU<string, any>, req, r
426466
// Update cached copy by rerendering server-side
427467
// NOTE: In this scenario the currently cached copy will be returned to the current user.
428468
// This re-render is peformed behind the scenes to update cached copy for next user.
429-
serverSideRender(req, res, false);
469+
serverSideRender(req, res, null, false);
430470
}
431471
} else {
432472
if (environment.cache.serverSide.debug) { console.log(`CACHE MISS FOR ${key} in ${cacheName} cache.`); }

src/app/core/auth/auth.service.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ import {
99
select,
1010
Store,
1111
} from '@ngrx/store';
12-
import {
13-
REQUEST,
14-
RESPONSE,
15-
} from '../../../express.tokens';
1612
import { TranslateService } from '@ngx-translate/core';
1713
import { CookieAttributes } from 'js-cookie';
1814
import {
@@ -28,6 +24,10 @@ import {
2824
} from 'rxjs/operators';
2925

3026
import { environment } from '../../../environments/environment';
27+
import {
28+
REQUEST,
29+
RESPONSE,
30+
} from '../../../express.tokens';
3131
import { AppState } from '../../app.reducer';
3232
import {
3333
hasNoValue,

src/app/core/forward-client-ip/forward-client-ip.interceptor.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import {
88
Inject,
99
Injectable,
1010
} from '@angular/core';
11-
import { REQUEST } from '../../../express.tokens';
1211
import { Observable } from 'rxjs';
1312

13+
import { REQUEST } from '../../../express.tokens';
14+
1415
@Injectable({ providedIn: 'root' })
1516
/**
1617
* Http Interceptor intercepting Http Requests, adding the client's IP to their X-Forwarded-For header

src/app/core/locale/server-locale.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
Inject,
44
Injectable,
55
} from '@angular/core';
6-
import { REQUEST } from '../../../express.tokens';
76
import { TranslateService } from '@ngx-translate/core';
87
import {
98
combineLatest,
@@ -16,6 +15,7 @@ import {
1615
take,
1716
} from 'rxjs/operators';
1817

18+
import { REQUEST } from '../../../express.tokens';
1919
import {
2020
hasValue,
2121
isEmpty,

src/app/core/services/cookie.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import {
22
Inject,
33
Injectable,
44
} from '@angular/core';
5-
import { REQUEST } from '../../../express.tokens';
65
import { CookieAttributes } from 'js-cookie';
76
import {
87
Observable,
98
Subject,
109
} from 'rxjs';
1110

11+
import { REQUEST } from '../../../express.tokens';
12+
1213
export interface ICookieService {
1314
readonly cookies$: Observable<{ readonly [key: string]: any }>;
1415

src/app/core/services/server-hard-redirect.service.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import {
22
Inject,
33
Injectable,
44
} from '@angular/core';
5-
import {
6-
REQUEST,
7-
RESPONSE,
8-
} from '../../../express.tokens';
95
import {
106
Request,
117
Response,
128
} from 'express';
139

10+
import {
11+
REQUEST,
12+
RESPONSE,
13+
} from '../../../express.tokens';
1414
import { HardRedirectService } from './hard-redirect.service';
1515

1616
/**

src/app/core/services/server.referrer.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import {
22
Inject,
33
Injectable,
44
} from '@angular/core';
5-
import { REQUEST } from '../../../express.tokens';
65
import {
76
Observable,
87
of as observableOf,
98
} from 'rxjs';
109

10+
import { REQUEST } from '../../../express.tokens';
1111
import { ReferrerService } from './referrer.service';
1212

1313
/**

0 commit comments

Comments
 (0)