If you like this project please show your support with a GitHub star. Much appreciated!
Repository with Angular CLI and Angular Universal
Translations:
Resources:
- public chat https://t.me/angular_universal_ru
- https://ssr.angular.su/ - server-side rendering of the master
- https://csr.angular.su/ - client rendering master
- Angular 11
document is not definedandwindow is not defined- here- Angular Material2UI components - individual branch
- PrimengUI components - [individual branch] (https://github.com/Angular-RU/angular-universal-starter/tree/primeng)
- modules import depending on the platform (
MockServerBrowserModule) - execution of queries to api on the server
TransferHttp - work with cookies on the server
UniversalStorage - Uses ngx-meta for SEO (title, meta tags, and Open Graph tags for social sharing).
- uses ngx-translate to support internationalization (i18n)
- uses ORIGIN_URL - for absolute queries
- @angular/service-worker(
ng add @angular/pwa --project universal-demo)
yarnornpm installyarn startornpm run start- for client renderingyarn ssrornpm run ssr- for server-side renderingyarn build:universalornpm run build:universal- for assembly in releaseyarn serverornpm run server- to start the serveryarn build:prerenderornpm run build:prerender- to generate static bystatic.paths.ts- for watch with ssr -
npm run ssr:watch
To transfer ssr to your repository, you need the following files:
- .angular-cli.json
- server.ts
- prerender.ts
- webpack.config.js
- main.server.ts
- main.browser.ts
- shared/*
- forStorage/*
- environments/*
- app.browser.module.ts
- app.server.module.ts
Official example in English: https://github.com/angular/universal-starter Modules used for universal:
- https://github.com/angular/universal/tree/master/modules/aspnetcore-engine - web for .net core
- https://github.com/angular/universal/tree/master/modules/common - TransferHttpCacheModule for http request only server side and sync with TransferHttp for browser
- https://github.com/angular/universal/tree/master/modules/express-engine - Express Engine to run the rendering in node, in our application is used. Please note that the current version is not lower than 5.0.0-beta.5
- https://github.com/angular/universal/tree/master/modules/hapi-engine - Hapi Engine is an alternative engine for rendering. In the example is not used, in principle in the connection scheme does not differ from express-engine
- https://github.com/angular/universal/tree/master/modules/module-map-ngfactory-loader - the module search module for LazyLoading - the thing needed and used. Please note that the current version is not lower than 5.0.0-beta.5
- The module for TransferHttp uses
import {TransferState} from '@angular/platform-browser';and it is necessary to implement the request rest api on the server and the absence of the second request a second time. Seehome.component.ts(delay 3c)
this.http.get('https://reqres.in/api/users?delay=3').subscribe(result=>{this.result=result;});export const AppRoutes = RouterModule.forRoot(routes, { initialNavigation: 'enabled' });- so that there is no flashing of the page!to work with cookies, it is written
AppStorage, which with DI allows you to give different implementations for the server and the browser. Seeserver.storage.tsandbrowser.storage.tsfor implementations. Inserver.tsthere is
providers: [{provide: REQUEST,useValue: (req)},{provide: RESPONSE,useValue: (res)}]to work with REQUEST and RESPONSE via DI - this is necessary for implementing UniversalStorage when working with cookies.
webpack.config.jsis written exclusively for building server.ts file in server.js, since angular-cli has [bug](https: //github.com / angular/angular-cli/issues/7200) to work with 3d dependencies. - To solve some problems, use the following code inserver.tsSolving the problems of global variables, includingdocument is not definedandwindow is not defined
constdomino=require('domino');constfs=require('fs');constpath=require('path');consttemplate=fs.readFileSync(path.join(__dirname,'.','dist','index.html')).toString();constwin=domino.createWindow(template);constfiles=fs.readdirSync(`${process.cwd()}/dist-server`);// const styleFiles = files.filter(file => file.startsWith('styles'));// const hashStyle = styleFiles[0].split('.')[1];// const style = fs.readFileSync(path.join(__dirname, '.', 'dist-server', `styles.${hashStyle}.bundle.css`)).toString();global['window']=win;Object.defineProperty(win.document.body.style,'transform',{value: ()=>{return{enumerable: true,configurable: true};},});global['document']=win.document;global['CSS']=null;// global['XMLHttpRequest'] = require('xmlhttprequest').XMLHttpRequest;global['Prism']=null;global['navigator']=req['headers']['user-agent'];this allows you to remove some of the problems when working with undefined.
- https://github.com/ReactiveX/rxjs-tslint
ng update @angular/cliprebootis not working now