server.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import 'zone.js/dist/zone-node';
  2. import { ngExpressEngine } from '@nguniversal/express-engine';
  3. import * as express from 'express';
  4. import { join } from 'path';
  5. import { AppServerModule } from './src/main.server';
  6. import { APP_BASE_HREF } from '@angular/common';
  7. import { existsSync } from 'fs';
  8. // Pour simuler le DOM côté serveur (utile pour les librairies qui accèdent à window/document)
  9. const domino = require('domino');
  10. const fs = require('fs');
  11. const path = require('path');
  12. // Dossiers de build
  13. const distFolder = join(process.cwd(), 'dist/fatboar/browser');
  14. const indexHtml = existsSync(join(distFolder, 'index.html')) ? 'index.html' : 'index';
  15. const template = fs.readFileSync(join(distFolder, indexHtml)).toString();
  16. // Simule le DOM pour SSR
  17. const win = domino.createWindow(template);
  18. global['window'] = win;
  19. global['document'] = win.document;
  20. global['navigator'] = win.navigator;
  21. global['CSS'] = null; // Certaines libs vérifient CSS
  22. export function app() {
  23. const server = express();
  24. // Configure le moteur de rendu Angular Universal
  25. server.engine('html', ngExpressEngine({
  26. bootstrap: AppServerModule,
  27. }));
  28. server.set('view engine', 'html');
  29. server.set('views', distFolder);
  30. // Sert les fichiers statiques (assets, images, etc.)
  31. server.get('*.*', express.static(distFolder, {
  32. maxAge: '1y'
  33. }));
  34. // Sert sitemap.xml pour le SEO
  35. server.get('/sitemap.xml', (req, res) => {
  36. res.header('Content-Type', 'application/xml');
  37. res.sendFile(join(distFolder, 'sitemap.xml'));
  38. });
  39. // Sert robots.txt pour le SEO
  40. server.get('/robots.txt', (req, res) => {
  41. res.sendFile(join(distFolder, 'robots.txt'));
  42. });
  43. // Sert toutes les autres routes via Angular Universal
  44. server.get('*', (req, res) => {
  45. res.render(indexHtml, {
  46. req,
  47. providers: [
  48. { provide: APP_BASE_HREF, useValue: req.baseUrl },
  49. // Fournit l'URL canonique pour les balises <link rel="canonical">
  50. { provide: 'CANONICAL_URL', useValue: `https://angular-prod.foodgame.fr${req.originalUrl}` }
  51. ]
  52. });
  53. });
  54. return server;
  55. }
  56. function run() {
  57. const port = process.env.PORT || 4000;
  58. const server = app();
  59. server.listen(port, () => {
  60. console.log(`Node Express server listening on http://localhost:${port}`);
  61. });
  62. }
  63. // Démarre le serveur si ce fichier est lancé directement
  64. declare const __non_webpack_require__: NodeRequire;
  65. const mainModule = __non_webpack_require__.main;
  66. const moduleFilename = mainModule && mainModule.filename || '';
  67. if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
  68. run();
  69. }
  70. export * from './src/main.server';
  71. // import 'zone.js/dist/zone-node';
  72. // import { ngExpressEngine } from '@nguniversal/express-engine';
  73. // import * as express from 'express';
  74. // import { join } from 'path';
  75. // import { AppServerModule } from './src/main.server';
  76. // import { APP_BASE_HREF } from '@angular/common';
  77. // import { existsSync } from 'fs';
  78. // const domino = require('domino');
  79. // const fs = require('fs');
  80. // const path = require('path');
  81. // const distFolder = join(process.cwd(), 'dist/fatboar/browser');
  82. // const indexHtml = existsSync(join(distFolder, 'index.html')) ? 'index.html' : 'index';
  83. // const template = fs.readFileSync(join(distFolder, indexHtml)).toString();
  84. // const win = domino.createWindow(template);
  85. // global['window'] = win;
  86. // global['document'] = win.document;
  87. // global['navigator'] = win.navigator;
  88. // global['CSS'] = null;
  89. // export function app() {
  90. // const server = express();
  91. // server.engine('html', ngExpressEngine({
  92. // bootstrap: AppServerModule,
  93. // }));
  94. // server.set('view engine', 'html');
  95. // server.set('views', distFolder);
  96. // // Fichiers statiques
  97. // server.get('*.*', express.static(distFolder, {
  98. // maxAge: '1y'
  99. // }));
  100. // // Routes SEO (déplacées depuis Express)
  101. // server.get('/sitemap.xml', (req, res) => {
  102. // res.header('Content-Type', 'application/xml');
  103. // res.sendFile(join(distFolder, 'sitemap.xml'));
  104. // });
  105. // server.get('/robots.txt', (req, res) => {
  106. // res.sendFile(join(distFolder, 'robots.txt'));
  107. // });
  108. // // Toutes les autres routes
  109. // server.get('*', (req, res) => {
  110. // res.render(indexHtml, {
  111. // req,
  112. // providers: [
  113. // { provide: APP_BASE_HREF, useValue: req.baseUrl },
  114. // { provide: 'CANONICAL_URL', useValue: `https://angular-prod.foodgame.fr${req.originalUrl}` }
  115. // ]
  116. // });
  117. // });
  118. // return server;
  119. // }
  120. // function run() {
  121. // const port = process.env.PORT || 4000;
  122. // const server = app();
  123. // server.listen(port, () => {
  124. // console.log(`Node Express server listening on http://localhost:${port}`);
  125. // });
  126. // }
  127. // declare const __non_webpack_require__: NodeRequire;
  128. // const mainModule = __non_webpack_require__.main;
  129. // const moduleFilename = mainModule && mainModule.filename || '';
  130. // if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
  131. // run();
  132. // }
  133. // export * from './src/main.server';