【问题标题】:Angular 9 - universal + express-engineAngular 9 - 通用 + 快速引擎
【发布时间】:2020-05-03 15:08:40
【问题描述】:

我在 Angular 8 上使用 Universal,一切正常,但我在使用新版本时遇到了一些问题

如果不使用 Angular 应用程序编译 server.ts,似乎不再可以使用 ngExpressEngine。你以前完全可以做到的。

我有一个用 js 为我的 express 服务器编写的庞大代码库,我无法使用我的 angular 应用程序编译它,就像用原理图设置的那样。从基本设置开始,您只需将所有内容编译在一起,然后 node ../dist/myapp/server/main.js 将启动您的“通用”服务器。

所以我希望我能做的是在没有 server.ts 的情况下构建我的服务器端 Angular 应用程序,然后在我需要时从我的主应用程序中通过 ngExpressEngine 使用该构建

================================================ ============================

编辑大卫的答案

require("zone.js/dist/zone-node");
const { ngExpressEngine } = require("@nguniversal/express-engine");
const express = require("express");
const app = express();
const { join } = require("path");
const { AppServerModule } = require("./dist/ttmodel/server/main");
const { existsSync } = require("fs");
const { APP_BASE_HREF } = require("@angular/common");

app.use(express.static(join(__dirname, "dist")));

const distFolder = join(process.cwd(), "dist/ttmodel/browser");
const indexHtml = existsSync(join(distFolder, "index.original.html"))
  ? "index.original.html"
  : "index";

app.engine(
  "html",
  ngExpressEngine({
    bootstrap: AppServerModule,
  })
);

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

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

app.get("*", (req, res) => {
  res.render(indexHtml, {
    req,
    providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
  });
});

app.listen(3000);

你的意思是这样的?我试过了,结果还是不行

Error: ENOENT: no such file or directory, open 'app.component.html'

在原始 server.ts 上,您直接从 './src/main.server' 导入 AppServerModule

我尝试使用@angular/platform-server 中的renderModulerenderModuleFactory,但我也无法使用。

【问题讨论】:

  • 你到底想达到什么目的?
  • 感谢您的回答,我试图改进我的问题

标签: angular angular-universal


【解决方案1】:

我可能是错的(我还没有测试过),但我认为你可以从编译的 Angular 服务器包中导入你自己的服务器中需要的任何内容。

如果您查看默认 server.ts 的底部,您可以看到这些行。

// 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';

因此,如果您只是使用 Angular 9 新方法编译 server.ts,那么您将以 main.js 文件结束。您可以将 requiremain.js 捆绑到您自己的代码中,然后您可以从中获取 AppServerModule 并在您自己的代码中使用它

const {AppServerModule} = require('./dist/server/main');

【讨论】:

  • 谢谢,我试过了,但不幸的是没有用,我更新了我的问题,向你展示我测试了什么
  • 是的,您的编辑是我的想法。我明天去试试
  • 谢谢,如果你能找到方法那就太棒了,我尝试了三天。该文档仅限于通用,但即使在官方@angular/platform-server 端也几乎没有。
  • 我只是快速尝试并得到与您不同的错误。现在没时间调查。这对你的场景有帮助吗? github.com/angular/universal/issues/1363
  • 嗯,谢谢你的尝试,是的,如果我有 AppServerModuleNgFactory 可以解决我的问题,但它不在服务器构建的导出中,问题不会出现在任何地方。我设法让它与专用于通用的服务器一起工作,但老实说,它太丑了。
猜你喜欢
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2019-11-06
相关资源
最近更新 更多