From bf86beb5c5bbbc3f5df521fdbcf16beb5e97c2eb Mon Sep 17 00:00:00 2001 From: erdemcaygor Date: Tue, 8 Jul 2025 15:21:53 +0300 Subject: [PATCH] refactoring --- npm/ng-packs/apps/dev-app/src/server.ts | 21 ++--- .../apps/dev-app/src/server_legacy.ts | 78 +++++++++++++++++++ .../apps/dev-app/tsconfig.server.json | 1 + npm/ng-packs/package.json | 10 ++- 4 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 npm/ng-packs/apps/dev-app/src/server_legacy.ts diff --git a/npm/ng-packs/apps/dev-app/src/server.ts b/npm/ng-packs/apps/dev-app/src/server.ts index b5eb52e580..ae54c81f39 100644 --- a/npm/ng-packs/apps/dev-app/src/server.ts +++ b/npm/ng-packs/apps/dev-app/src/server.ts @@ -1,8 +1,5 @@ -import { environment } from './environments/environment'; -if (environment.production === false) { - process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; -} import 'zone.js/node'; + import { APP_BASE_HREF } from '@angular/common'; import { CommonEngine } from '@angular/ssr/node'; import express from 'express'; @@ -24,19 +21,19 @@ export function app(): express.Express { server.set('views', distFolder); // Example Express Rest API endpoints - // server.get('/api/**', (req, res) => { }); + // server.get('/api/{*splat}', (req, res) => { }); // Serve static files from /browser - server.get('/.well-known/*', (_, res) => res.sendStatus(404)); - server.get( - '*.*', + server.use( express.static(distFolder, { maxAge: '1y', + index: false, }), ); // All regular routes use the Angular engine - server.get('*', (req, res, next) => { + server.use((req, res, next) => { const { protocol, originalUrl, baseUrl, headers } = req; + commonEngine .render({ bootstrap, @@ -60,7 +57,11 @@ function run(): void { // Start up the Node server const server = app(); - server.listen(port, () => { + server.listen(port, error => { + if (error) { + throw error; + } + console.log(`Node Express server listening on http://localhost:${port}`); }); } diff --git a/npm/ng-packs/apps/dev-app/src/server_legacy.ts b/npm/ng-packs/apps/dev-app/src/server_legacy.ts new file mode 100644 index 0000000000..b5eb52e580 --- /dev/null +++ b/npm/ng-packs/apps/dev-app/src/server_legacy.ts @@ -0,0 +1,78 @@ +import { environment } from './environments/environment'; +if (environment.production === false) { + process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; +} +import 'zone.js/node'; +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr/node'; +import express from 'express'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import bootstrap from './main.server'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const distFolder = join(process.cwd(), 'dist/dev-app/browser'); + const indexHtml = existsSync(join(distFolder, 'index.original.html')) + ? join(distFolder, 'index.original.html') + : join(distFolder, 'index.html'); + + const commonEngine = new CommonEngine(); + + server.set('view engine', 'html'); + server.set('views', distFolder); + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + server.get('/.well-known/*', (_, res) => res.sendStatus(404)); + server.get( + '*.*', + express.static(distFolder, { + maxAge: '1y', + }), + ); + + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + commonEngine + .render({ + bootstrap, + documentFilePath: indexHtml, + url: `${protocol}://${headers.host}${originalUrl}`, + publicPath: distFolder, + providers: [ + { provide: APP_BASE_HREF, useValue: baseUrl }, + { provide: 'cookies', useValue: JSON.stringify(req.headers.cookie) }, + ], + }) + .then(html => res.send(html)) + .catch(err => next(err)); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +// Webpack will replace 'require' with '__webpack_require__' +// '__non_webpack_require__' is a proxy to Node 'require' +// The below code is to ensure that the server is run only when not requiring the bundle. +declare const __non_webpack_require__: NodeRequire; +const mainModule = __non_webpack_require__.main; +const moduleFilename = (mainModule && mainModule.filename) || ''; +if (moduleFilename === __filename || moduleFilename.includes('iisnode')) { + run(); +} + +export default bootstrap; diff --git a/npm/ng-packs/apps/dev-app/tsconfig.server.json b/npm/ng-packs/apps/dev-app/tsconfig.server.json index eee4cb963a..0e16840a42 100644 --- a/npm/ng-packs/apps/dev-app/tsconfig.server.json +++ b/npm/ng-packs/apps/dev-app/tsconfig.server.json @@ -11,6 +11,7 @@ }, "files": [ "src/main.server.ts", + "src/server.ts", "src/server.ts" ] } diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 5e09df3200..b1ee869524 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -68,10 +68,9 @@ "@angular/localize": "~20.0.0", "@angular/platform-browser": "~20.0.0", "@angular/platform-browser-dynamic": "~20.0.0", + "@angular/platform-server": "~20.0.0", "@angular/router": "~20.0.0", "@angular/ssr": "~20.0.0", - "@angular/platform-server": "~20.0.0", - "express": "~4.18.0", "@fortawesome/fontawesome-free": "^6.0.0", "@ng-bootstrap/ng-bootstrap": "~19.0.0", "@ngneat/spectator": "~19.6.2", @@ -92,7 +91,7 @@ "@swc/core": "~1.5.0", "@swc/helpers": "~0.5.0", "@swimlane/ngx-datatable": "~21.1.0", - "@types/express": "^4.17.17", + "@types/express": "~5.0.0", "@types/jest": "29.5.14", "@types/node": "^18.18.0", "@typescript-eslint/eslint-plugin": "7.16.0", @@ -109,6 +108,7 @@ "eslint": "^8.0.0", "eslint-config-prettier": "10.0.0", "eslint-plugin-cypress": "^2.10.3", + "express": "~4.18.0", "got": "^11.0.0", "jest": "^29.0.0", "jest-canvas-mock": "^2.0.0", @@ -144,5 +144,7 @@ "npx prettier --write --config .prettierrc " ] }, - "dependencies": {} + "dependencies": { + "express": "^5.1.0" + } }