Angular Universal медленный рендеринг по сравнению с Nunjucks - PullRequest
0 голосов
/ 31 января 2019

Я добавил Angular Universal в свое приложение Angular 6, это большой выигрыш по сравнению со стандартным Angular, но время рендеринга составляет около 250 мс для страницы из 70 элементов, тогда как в аналогичном интерфейсе, построенном с помощью Nunjucks, оно составляет около 40 мс(1 вызов API - около 35).

В чем причина такого медленного рендеринга?Может ли это быть улучшено в будущем?Основная проблема, которую я вижу, заключается в том, что приложение Angular создается при каждом запросе, но это не единственное, потому что существует большая разница между короткими и длинными страницами.

Я обслуживаю приложение, используя nginx + passenger

Вот мой server.ts

// These are important and needed before anything else
import 'zone.js/dist/zone-node';
import 'reflect-metadata';

import { renderModuleFactory } from '@angular/platform-server';
import { enableProdMode } from '@angular/core';

import * as cookieParser from 'cookie-parser';
import * as express from 'express';
import { join } from 'path';
import { readFileSync } from 'fs';

// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();
const compression = require('compression');
// Express server
const app = express();
app.use(compression());
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist');

// Our index.html we'll use as our template
const template = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toString();

// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main');

const { provideModuleMap } = require('@nguniversal/module-map-ngfactory-loader');

app.use(cookieParser('XXXXX'));

app.engine('html', (_, options, callback) => {
  renderModuleFactory(AppServerModuleNgFactory, {
    // Our index.html
    document: template,
    url: options.req.url,
    // DI so that we can get lazy-loading to work differently (since we need it to just instantly render it)
    extraProviders: [
      provideModuleMap(LAZY_MODULE_MAP),
      {
        provide: 'REQUEST',
        useValue: options.req
      },
      {
        provide: 'RESPONSE',
        useValue: options.req.res
      }
    ]
  }).then(html => {
    callback(null, html);
  });
});

app.set('view engine', 'html');
app.set('views', join(DIST_FOLDER, 'browser'));

// Server static files from /browser
app.get('*.*', express.static(join(DIST_FOLDER, 'browser')));

// All regular routes use the Universal engine
app.get('*', (req, res) => {
  res.render(join(DIST_FOLDER, 'browser', 'index.html'), { req });
});

// Start up the Node server
app.listen(PORT, () => {
  console.log(`Node server listening on http://localhost:${PORT}`);
});

Любые идеи будут оценены.

...