javascript - Angular 16 SSR kastar TypeError: Höger sida av 'instanceof' är inte ett objekt
Jag försökte bara uppdatera min Angular-applikation från version 15 till 16. Allt fungerar med Angular. Den gör till och med en build för Angular Universal utan fel. Men när jag försöker köra med npm run serve:ssr ger det ett fel
TypeError: Höger sida av 'instanceof' är inte ett objekt
Inledningsvis trodde jag att det kunde vara något fel i min kod, men jag tog bort hela koden och behöll endast app-komponenten med en enkel rubrik. Det ger fortfarande samma fel.
server.ts
import { enableProdMode } from "@angular/core";
(global as any).WebSocket = require('ws');
(global as any).XMLHttpRequest = require('xhr2');
import 'zone.js/dist/zone-node';
const domino = require('domino');
const fs = require('fs');
const path = require('path');
import { ngExpressEngine } from '@nguniversal/express-engine';
import * as express from 'express';
import { join } from 'path';
import { existsSync } from 'fs';
const dotenv = require('dotenv');
dotenv.config();
const distFolder = join(process.cwd(), 'dist/project-name/browser');
const template = fs.readFileSync(path.join(distFolder, 'index.html')).toString();
const win = domino.createWindow(template.toString());
global['window'] = win;
global['document'] = win.document;
global['DOMTokenList'] = win.DOMTokenList;
global['Node'] = win.Node;
global['Text'] = win.Text;
global['HTMLElement'] = win.HTMLElement;
global['navigator'] = win.navigator;
global['getComputedStyle'] = win.getComputedStyle;
// (global as any).self = {fetch: require('node-fetch')};
// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();
import { AppServerModule } from './src/main.server';
import { APP_BASE_HREF } from '@angular/common';
// 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/project-name/browser');
const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine)
server.engine('html', ngExpressEngine({
bootstrap: AppServerModule
}));
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 Universal engine
server.get('*', (req, res) => {
res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] });
});
return server;
}
function run(): void {
const port = process.env.PORT || 8000;
// Start up the Node server
const server = app();
server.get('/env', (req, res) => {
res.json(process.env);
})
server.listen(port, () => {
console.log(`Node Express server listening on https://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 * from './src/main.server';
Finns det något jag missar?
Svar #1
Jag fick arbete på runt med hjälp av ett tillfälligt forkad tillägg för Domino
- Installera domino-ext.
npm install domino-ext. - Ersätt
dominomeddomino-extiserver.ts-filen.
const domino = require('domino');
Ersätt med
const domino = require('domino-ext');
Nu gör build och serve, det kommer att fungera bra efteråt.
Kredit
Svar #2
Jag är inte säker på om det är något i min konfiguration, men när jag använde:
import { createWindow } from 'domino-ext';
Jag fick det här felet:
/node_modules/domino-ext/lib/index.d.ts' är inte ett modul.
Att ändra modulnamnet från domino till domino-ext löste problemet:
declare module "domino-ext" {
function createDOMImplementation(): DOMImplementation;
function createDocument(html?: string, force?: boolean): Document;
function createWindow(html?: string, address?: string): Window;
}
