angular - ionic 与 SSR 实现

标签 angular express ionic-framework server-side-rendering

尝试将 js 函数添加到我的 ionic 项目中,但出现 self is not defined 错误。在尝试将 self 添加为 global ["self"] = win.self ||赢;我得到一个错误

ERROR TypeError: Cannot redefine property: constructor . Use the latest version of all required dependencies in the project.

服务器.ts

import "zone.js/dist/zone-node";

import { ngExpressEngine } from "@nguniversal/express-engine";
import * as express from "express";
import { join } from "path";
import { enableProdMode } from "@angular/core";
import { AppServerModule } from "./src/main.server";
import { APP_BASE_HREF } from "@angular/common";
import { existsSync } from "fs";

enableProdMode();
export function app(): express.Express {
  const server = express();
  const distFolder = join(process.cwd(), "dist/app/browser");
  const indexHtml = existsSync(join(distFolder, "index.original.html"))
    ? "index.original.html"
    : "index";
  const domino = require("domino");
  const win = domino.createWindow(indexHtml);
  // mock
  global["window"] = win;
  global["self"] = win.self;
  global["document"] = win.document;
  global["navigator"] = win.navigator;
  server.engine("html", ngExpressEngine({ bootstrap: AppServerModule }));

  server.set("view engine", "html");
  server.set("views", distFolder);

  server.get(
    "*.*",
    express.static(distFolder, {
      maxAge: "1y",
    })
  );

  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 || 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";

最佳答案

我遇到了同样的问题。将这些行添加到我的 server.ts 文件中,并在添加 global['self'] = win; 之后发生错误。没有它,将显示 self is undefined 错误。

const domino = require('domino');

const templateA = readFileSync(join(distFolder, indexTemplate)).toString();
const win = domino.createWindow(templateA);
(win as any).Object = Object;
(win as any).Math = Math;
global['self'] = win; //TODO: Is giving ERROR TypeError: Cannot redefine property: constructor at Function.defineProperty
global['window'] = win;
global['win'] = win;
global['branch'] = null;

关于angular - ionic 与 SSR 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63260694/

相关文章:

angular - 网页包 2 : Expected 'styles' to be an array of strings

javascript - 在模板 ANGULAR5 中显示数据(对象)的最佳方式

javascript - 如何检查查询字符串是否在 Express.js/Node.js 中有值?

javascript - 显示 POST 到页面的结果

ios - Ionic 4.2.1 模态内存泄漏

javascript - 如何在每个新条目中包含日期/时间戳?

angular - 使用异步管道在 Angular 模板中解析自定义 rxjs 主题

angular - 如何用switchMap取消http请求?

javascript - MongoDB 中的日期和时间错误

css - Ionic 3高度问题