Skip to content

Upgrading to 16+ breaks pre-rendering with SSR #3624

Open
@tmk1991

Description

@tmk1991

When moving from @angular/fire 7.6.1 to 16 or 17, the prerendering with SSR is failing.

The following works:
"@angular/common": "^17.3.12",
"@angular/fire": "^7.6.1",
"firebase": "^10.14.1"

The error during prerender with any @angular/fire 16 or 17 version is down below. I assume the issue is that it cannot load the modules the right way with the server for prerender but not sure why. I'm using
"target": "ES2022",
"module": "ES2022",
in my TS config.

Error
It gets to prerendering stage (so the project builds fine).

⠋ Prerendering 1 route(s) to /dist/retail/browser.../dist/retail/server/main.js:1

Then I get a ton of the compiled code

(()=>{var installedChunks,leafPrototypes,getProto,__webpack_modules__={778:(__unused_webpack_module,__webpack_exports__2,__webpack_require__2)=>{"use strict";__webpack_require__2.d(__webpack_exports__2,{P:()=>GalleryComponentsModule});var _shared_shared_module__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__2(65393),_angular_common__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__2(94556),_nebular_theme__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__2(67214),_shop_shop_components_shop_components_module__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__2(56241),_angular_core__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__2(42249);let GalleryComponentsModule=(()=>{class GalleryComponentsModule2{static{this.\u0275fac=function(t){return new(t||
.... (Continues for a LONG time)

Then I see this syntax error:

SyntaxError: Unexpected identifier '#target'
    at wrapSafe (node:internal/modules/cjs/loader:1281:20)
    at Module._compile (node:internal/modules/cjs/loader:1321:27)
    at Object..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Function._load (node:internal/modules/cjs/loader:1024:12)
    at Module.require (node:internal/modules/cjs/loader:1233:19)
    at require (node:internal/modules/helpers:179:18)
    at /Users/troykoss/workspace/russells/website/retail/node_modules/@angular-devkit/build-angular/src/builders/prerender/routes-extractor-worker.js:44:143
    at _ZoneDelegate.invoke (/Users/troykoss/workspace/russells/website/retail/node_modules/zone.js/bundles/zone.umd.js:416:32)
    at ZoneImpl.run (/Users/troykoss/workspace/russells/website/retail/node_modules/zone.js/bundles/zone.umd.js:147:47)

I'm not sure how to debug further. I can't seem to see what the difference in 16+ and 7.6.1 is that would cause this issue unless its something to do with commonjs to esm.

I was going to post on the SSR repo but since this issue spawns specifically around an angular/fire update, I thought it would be more appropriate here.

This is the server.ts:

import 'zone.js';

import { APP_BASE_HREF } from '@angular/common';
import { CommonEngine } from '@angular/ssr';
import * as express from 'express';
import { existsSync } from 'fs';
import { join } from 'path';
import { AppServerModule } from './src/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/retail/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(
    '*.*',
    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: AppServerModule,
        documentFilePath: indexHtml,
        url: `${protocol}://${headers.host}${originalUrl}`,
        publicPath: distFolder,
        providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }]
      })
      .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 AppServerModule;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions