import 'zone.js/dist/zone-node'; import { ngExpressEngine } from '@nguniversal/express-engine'; import * as express from 'express'; import { join } from 'path'; import { AppServerModule } from './src/main.server'; import { APP_BASE_HREF } from '@angular/common'; import { existsSync } from 'fs'; // Pour simuler le DOM côté serveur (utile pour les librairies qui accèdent à window/document) const domino = require('domino'); const fs = require('fs'); const path = require('path'); // Dossiers de build const distFolder = join(process.cwd(), 'dist/fatboar/browser'); const indexHtml = existsSync(join(distFolder, 'index.html')) ? 'index.html' : 'index'; const template = fs.readFileSync(join(distFolder, indexHtml)).toString(); // Simule le DOM pour SSR const win = domino.createWindow(template); global['window'] = win; global['document'] = win.document; global['navigator'] = win.navigator; global['CSS'] = null; // Certaines libs vérifient CSS export function app() { const server = express(); // Configure le moteur de rendu Angular Universal server.engine('html', ngExpressEngine({ bootstrap: AppServerModule, })); server.set('view engine', 'html'); server.set('views', distFolder); // Sert les fichiers statiques (assets, images, etc.) server.get('*.*', express.static(distFolder, { maxAge: '1y' })); // Sert sitemap.xml pour le SEO server.get('/sitemap.xml', (req, res) => { res.header('Content-Type', 'application/xml'); res.sendFile(join(distFolder, 'sitemap.xml')); }); // Sert robots.txt pour le SEO server.get('/robots.txt', (req, res) => { res.sendFile(join(distFolder, 'robots.txt')); }); // Sert toutes les autres routes via Angular Universal server.get('*', (req, res) => { res.render(indexHtml, { req, providers: [ { provide: APP_BASE_HREF, useValue: req.baseUrl }, // Fournit l'URL canonique pour les balises { provide: 'CANONICAL_URL', useValue: `https://fatboar.foodgame.fr${req.originalUrl}` } ] }); }); return server; } function run() { const port = process.env.PORT || 4000; const server = app(); server.listen(port, () => { console.log(`Node Express server listening on http://localhost:${port}`); }); } // Démarre le serveur si ce fichier est lancé directement 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 * from './src/main.server'; // import 'zone.js/dist/zone-node'; // import { ngExpressEngine } from '@nguniversal/express-engine'; // import * as express from 'express'; // import { join } from 'path'; // import { AppServerModule } from './src/main.server'; // import { APP_BASE_HREF } from '@angular/common'; // import { existsSync } from 'fs'; // const domino = require('domino'); // const fs = require('fs'); // const path = require('path'); // const distFolder = join(process.cwd(), 'dist/fatboar/browser'); // const indexHtml = existsSync(join(distFolder, 'index.html')) ? 'index.html' : 'index'; // const template = fs.readFileSync(join(distFolder, indexHtml)).toString(); // const win = domino.createWindow(template); // global['window'] = win; // global['document'] = win.document; // global['navigator'] = win.navigator; // global['CSS'] = null; // export function app() { // const server = express(); // server.engine('html', ngExpressEngine({ // bootstrap: AppServerModule, // })); // server.set('view engine', 'html'); // server.set('views', distFolder); // // Fichiers statiques // server.get('*.*', express.static(distFolder, { // maxAge: '1y' // })); // // Routes SEO (déplacées depuis Express) // server.get('/sitemap.xml', (req, res) => { // res.header('Content-Type', 'application/xml'); // res.sendFile(join(distFolder, 'sitemap.xml')); // }); // server.get('/robots.txt', (req, res) => { // res.sendFile(join(distFolder, 'robots.txt')); // }); // // Toutes les autres routes // server.get('*', (req, res) => { // res.render(indexHtml, { // req, // providers: [ // { provide: APP_BASE_HREF, useValue: req.baseUrl }, // { provide: 'CANONICAL_URL', useValue: `https://fatboar.foodgame.fr${req.originalUrl}` } // ] // }); // }); // return server; // } // function run() { // const port = process.env.PORT || 4000; // const server = app(); // server.listen(port, () => { // console.log(`Node Express server listening on http://localhost:${port}`); // }); // } // 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 * from './src/main.server';