Angular 9 - универсальный + express -двигатель - PullRequest
0 голосов
/ 03 мая 2020

Я использовал универсальный на Angular 8, и все работало отлично, но у меня есть некоторые проблемы с новой версией

Кажется, что больше невозможно использовать ngExpressEngine без компиляции server.ts с angular приложение. Вы могли бы полностью сделать это раньше.

У меня есть огромная кодовая база, написанная на js для моего express сервера, и я не могу скомпилировать его с моим angular приложением, как это установлено с помощью схем. Из базовой установки c вы просто скомпилируете все вместе, а затем node ../dist/myapp/server/main.js, который запускает ваш "универсальный" сервер.

Так что я мог бы sh, что я мог сделать, - это построить свою серверную сторону angular приложение без server.ts, а затем использовать сборку, когда мне это нужно, с помощью 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'

на исходном сервере. Вы импортируете AppServerModule напрямую из './src/main.server'

Я пытался используйте renderModule и renderModuleFactory из @angular/platform-server, но я тоже не смог заставить его работать.

1 Ответ

1 голос
/ 05 мая 2020

Я могу ошибаться (и я не проверял это), но я думаю, что вы можете просто импортировать, куда вам нужно, на свой собственный сервер из скомпилированного 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';

Так что, если вы просто скомпилируете server.ts, используя angular 9 новый способ сделать это, вы закончите с main.js файл. Вы можете просто require, что main.js связать в свой собственный код, и вы можете извлечь AppServerModule из него и использовать его в своем собственном коде

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