socialnetworknews-web

A open-source Paper.li clone
git clone git://archive.git.mtrnord.blog/SocialNetworkNews/socialnetworknews-web.git
Log | Files | Refs | README | LICENSE

commit 70fabf376de0fcbeb649c2822069753e4cf82413
parent 595253257d6fcaa5fafa61278692158e1b60b143
Author: MTRNord <mtrnord1@gmail.com>
Date:   Sat, 19 May 2018 17:28:40 +0200

Optimize server side rendering a bit

Diffstat:
Mangular.json | 10++++++++++
Mpackage.json | 1+
Mserver.ts | 51++++++++++++++++++++++-----------------------------
Msrc/app/app.server.module.ts | 5+++--
Mwebpack.server.config.js | 11+++++++++--
Myarn.lock | 6+++++-
6 files changed, 50 insertions(+), 34 deletions(-)

diff --git a/angular.json b/angular.json @@ -105,6 +105,16 @@ "outputPath": "dist/server", "main": "src/main.server.ts", "tsConfig": "src/tsconfig.server.json" + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + } } } } diff --git a/package.json b/package.json @@ -28,6 +28,7 @@ "@angular/router": "^6.0.2", "@angular/service-worker": "^6.0.2", "@angular/upgrade": "^6.0.0", + "@nguniversal/express-engine": "^6.0.0", "@nguniversal/module-map-ngfactory-loader": "^6.0.0", "angular-in-memory-web-api": "^0.6.0", "chart.js": "^2.7.2", diff --git a/server.ts b/server.ts @@ -1,13 +1,13 @@ -// 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 {enableProdMode} from '@angular/core'; +// Express Engine +import {ngExpressEngine} from '@nguniversal/express-engine'; +// Import module map for lazy loading +import {provideModuleMap} from '@nguniversal/module-map-ngfactory-loader'; import * as express from 'express'; -import { join } from 'path'; -import { readFileSync } from 'fs'; +import {join} from 'path'; // Faster server renders w/ Prod mode (dev mode never needed) enableProdMode(); @@ -18,40 +18,33 @@ const app = express(); 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.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) - ] - }).then(html => { - callback(null, html); - }); -}); +const {AppServerModuleNgFactory, LAZY_MODULE_MAP} = require('./dist/server/main'); + +// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine) +app.engine('html', ngExpressEngine({ + bootstrap: AppServerModuleNgFactory, + providers: [ + provideModuleMap(LAZY_MODULE_MAP) + ] +})); app.set('view engine', 'html'); app.set('views', join(DIST_FOLDER, 'browser')); +// Example Express Rest API endpoints +// app.get('/api/**', (req, res) => { }); // Server static files from /browser -app.get('*.*', express.static(join(DIST_FOLDER, 'browser'))); +app.get('*.*', express.static(join(DIST_FOLDER, 'browser'), { + maxAge: '1y' +})); // All regular routes use the Universal engine app.get('*', (req, res) => { - res.render(join(DIST_FOLDER, 'browser', 'index.html'), { req }); + res.render('index', { req }); }); // Start up the Node server app.listen(PORT, () => { - console.log(`Node server listening on http://localhost:${PORT}`); + console.log(`Node Express server listening on http://localhost:${PORT}`); }); diff --git a/src/app/app.server.module.ts b/src/app/app.server.module.ts @@ -1,5 +1,5 @@ import {NgModule} from '@angular/core'; -import {ServerModule} from '@angular/platform-server'; +import {ServerModule, ServerTransferStateModule} from '@angular/platform-server'; import {ModuleMapLoaderModule} from '@nguniversal/module-map-ngfactory-loader'; import {AppModule} from './app.module'; @@ -11,7 +11,8 @@ import {AppComponent} from './app.component'; // by the ServerModule from @angular/platform-server. AppModule, ServerModule, - ModuleMapLoaderModule // <-- *Important* to have lazy-loaded routes work + ModuleMapLoaderModule, + ServerTransferStateModule, ], // Since the bootstrapped component is not inherited from your // imported AppModule, it needs to be repeated here. diff --git a/webpack.server.config.js b/webpack.server.config.js @@ -5,6 +5,7 @@ module.exports = { entry: { server: './server.ts' }, resolve: { extensions: ['.js', '.ts'] }, target: 'node', + mode: "production", // this makes sure we include node_modules and other 3rd party libraries externals: [/(node_modules|main\..*\.js)/], output: { @@ -13,7 +14,13 @@ module.exports = { }, module: { rules: [ - { test: /\.ts$/, loader: 'ts-loader' } + { test: /\.ts$/, loader: 'ts-loader' }, + { + // Mark files inside `@angular/core` as using SystemJS style dynamic imports. + // Removing this will cause deprecation warnings to appear. + test: /[\/\\]@angular[\/\\]core[\/\\].+\.js$/, + parser: { system: true }, + }, ] }, plugins: [ @@ -30,4 +37,4 @@ module.exports = { {} ) ] -} +}; diff --git a/yarn.lock b/yarn.lock @@ -9,7 +9,7 @@ "@angular-devkit/core" "0.6.3" rxjs "^6.0.0" -"@angular-devkit/build-angular@~0.6.0": +"@angular-devkit/build-angular@~0.6.3": version "0.6.3" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.6.3.tgz#9b714f2f7fdd7422f990991c79444436d99898e3" dependencies: @@ -228,6 +228,10 @@ tree-kill "^1.0.0" webpack-sources "^1.1.0" +"@nguniversal/express-engine@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-6.0.0.tgz#f8bc7b5e940afb1ffdbdcb1bb22665d440ea0b0b" + "@nguniversal/module-map-ngfactory-loader@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-6.0.0.tgz#0dd26c3f1c26d17bb21b8dfc0da53d82b7f11028"