{"id":13432076,"url":"https://github.com/TrilonIO/aspnetcore-angular-universal","last_synced_at":"2025-03-16T23:30:35.536Z","repository":{"id":54602137,"uuid":"68725774","full_name":"TrilonIO/aspnetcore-angular-universal","owner":"TrilonIO","description":"ASP.NET Core \u0026 Angular Universal advanced starter - PWA w/ server-side rendering for SEO, Bootstrap, i18n internationalization, TypeScript, unit testing, WebAPI REST setup, SignalR, Swagger docs, and more! By @TrilonIO","archived":false,"fork":false,"pushed_at":"2019-05-26T23:49:08.000Z","size":5757,"stargazers_count":1460,"open_issues_count":109,"forks_count":433,"subscribers_count":163,"default_branch":"master","last_synced_at":"2024-10-29T17:13:59.770Z","etag":null,"topics":["angular","angular2","angular4","angular5","angular6","aspnet","aspnetcore","dotnet-template","hmr","ngrx","ssr","trilon","universal"],"latest_commit_sha":null,"homepage":"https://www.trilon.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TrilonIO.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-20T15:25:10.000Z","updated_at":"2024-10-28T05:41:06.000Z","dependencies_parsed_at":"2022-08-13T21:00:57.610Z","dependency_job_id":null,"html_url":"https://github.com/TrilonIO/aspnetcore-angular-universal","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TrilonIO%2Faspnetcore-angular-universal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TrilonIO%2Faspnetcore-angular-universal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TrilonIO%2Faspnetcore-angular-universal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TrilonIO%2Faspnetcore-angular-universal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TrilonIO","download_url":"https://codeload.github.com/TrilonIO/aspnetcore-angular-universal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243949759,"owners_count":20373651,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","angular2","angular4","angular5","angular6","aspnet","aspnetcore","dotnet-template","hmr","ngrx","ssr","trilon","universal"],"created_at":"2024-07-31T02:01:08.381Z","updated_at":"2025-03-16T23:30:35.209Z","avatar_url":"https://github.com/TrilonIO.png","language":"TypeScript","readme":"# ASP.NET Core 2.1 \u0026 Angular 7(+) Advanced Starter - PWA \u0026 Server-side prerendering (for Angular SEO)! \n\n---\n\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://trilon.io\" target=\"_blank\"\u003e\n        \u003cimg width=\"500\" height=\"auto\" src=\"https://trilon.io/trilon-logo-clear.png\" alt=\"Trilon.io - Angular Universal, NestJS, JavaScript Application Consulting Development and Training\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\n\u003ch3 align=\"center\"\u003e Made with :heart: by \u003ca href=\"https://trilon.io\"\u003eTrilon.io\u003c/a\u003e\u003c/h3\u003e\n\n---\n\n### Harness the power of Angular 7+, ASP.NET Core 2.1, now with SEO !\n\nAngular SEO in action:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/angular2-seo.png\" alt=\"ASP.NET Core Angular7 SEO\" title=\"ASP.NET Core Angular7 SEO\"\u003e\n\u003c/p\u003e\n\n### Angular Universal Application Architecture\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./docs/architecture.png\" alt=\"ASP.NET Core 2.1 Angular 7+ Starter\" title=\"ASP.NET Core 2.1 Angular 7+ Starter\"\u003e\n\u003c/p\u003e\n\n### What is this repo? Live Demo here: http://aspnetcore-angular2-universal.azurewebsites.net\n\nThis repository is maintained by [Trilon.io](https://Trilon.io) and the [Angular](https://github.com/angular/angular) Universal team and is meant to be an advanced starter \nfor both ASP.NET Core 2.1 using Angular 7.0+, not only for the client-side, but to be rendered on the server for instant \napplication paints (Note: If you don't need SSR [read here](#faq) on how to disable it).\n\nThis is meant to be a Feature-Rich Starter application containing all of the latest technologies, best build systems available, and include many real-world examples and libraries needed in todays Single Page Applications (SPAs).\n\nThis utilizes all the latest standards, no gulp, no bower, no typings, no manually \"building\" anything. NPM, Webpack and .NET handle everything for you!\n\n### Join us on Gitter\n\n[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/aspnetcore-angular2-universal/)\n\n# Table of Contents\n\n* [Features](#features)\n* [Getting Started](#getting-started)\n* [Deployment](#deployment)\n* [Upcoming Features](#upcoming-features)\n* [Application Structure](#application-structure)\n* [Gotchas](#gotchas)\n* [FAQ](#faq---also-check-out-the-faq-issues-label-and-the-how-to-issues-label)\n* [Special Thanks](#special-thanks)\n* [License](#license)\n* [Trilon - Consulting \u0026 Training](#trilon---angular--aspnet---consulting--training--development)\n\n---\n\n# Features:\n\n\u003e These are just some of the features found in this starter!\n\n- ASP.NET 2.1 - VS2017 support now!\n  - Azure delpoyment straight from VS2017\n  - Built in docker support through VS2017\n  - RestAPI (WebAPI) integration\n  - SQL Database CRUD demo\n  - Swagger WebAPI documentation when running in development mode \n  - SignalR Chat demo! (Thanks to [@hakonamatata](https://github.com/hakonamatata))\n\n- **Angular 7.0.0** :\n  - PWA (Progressive Web App)\n  - (Minimal) Angular-CLI integration \n    - This is to be used mainly for Generating Components/Services/etc.\n    - Usage examples: \n      - `ng g c components/example-component`\n      - `ng g s shared/some-service`\n  - Featuring Server-side rendering (Platform-Server, aka: \"Universal\")\n\t  - Faster initial paints, SEO (Search-engine optimization w Title/Meta/Link tags), social media link-previews, etc\n  - i18n internationalization support (via/ ngx-translate)\n  - Baked in best-practices (follows Angular style guide)\n  - Bootstrap3 (with ngx-bootstrap) - (can be rendered on the server!)\n    - Can be easily replaced with bootstrap4 (3 is provided for browser support)\n    - Bootstrap using SCSS / SASS for easy theming / styling!\n\n- **Webpack build system (Webpack 4)**\n  - HMR : Hot Module Reloading/Replacement \n  - Production builds w/ AoT Compilation\n\n- **Testing frameworks**\n  - Unit testing with Jest (Going back to Karma soon)\n\n- **Productivity**\n  - Typescript 2\n  - Codelyzer (for Real-time static code analysis) \n    - VSCode \u0026 Atom provide real-time analysis out of the box.\n\n- **ASP.NET Core 2.1**\n  \n  - Integration with NodeJS to provide pre-rendering, as well as any other Node module asset you want to use.\n\n- **Azure**\n  - Microsoft Application Insights setup (for MVC \u0026 Web API routing)\n  - Client-side Angular Application Insights integration\n    - If you're using Azure simply install `npm i -S @markpieszak/ng-application-insights` as a dependencies.\n    - Note: Make sure only the Browser makes these calls ([usage info here](https://github.com/MarkPieszak/angular-application-insights/blob/master/README.md#usage))\n    - More information here: - https://github.com/MarkPieszak/angular-application-insights\n    ```typescript\n      // Add the Module to your imports \n      ApplicationInsightsModule.forRoot({\n        instrumentationKey: 'Your-Application-Insights-instrumentationKey'\n      })\n    ```\n- **Docker**\n  - Built in Visual Studio F5 Debugging support\n  - Uses the very light weight microsoft/dotnet image\n  - Currently limited to Linux image as there is a bug with running nodejs in a container on Windows. \n\n\n----\n\n----\n  \n# Getting Started?\n\n- **Make sure you have at least Node 8.11.1 or higher (w/ npm 5+) installed!**  \n- **This repository uses ASP.Net Core 2.1, which has a hard requirement on .NET Core Runtime 2.1 and .NET Core SDK 2.1. Please install these items from [here](https://blogs.msdn.microsoft.com/dotnet/2018/05/30/announcing-net-core-2-1/?WT.mc_id=blog-twitter-timheuer)**\n\n\n### Visual Studio 2017\n\nMake sure you have .NET Core 2.1 installed and/or VS2017 15.3.\nVS2017 will automatically install all the neccessary npm \u0026 .NET dependencies when you open the project.\n\nSimply push F5 to start debugging !\n\n**Docker-Support**: Change the startup project to docker-compose and press F5\n\n**Note**: If you get any errors after this such as `module not found: boot.server` (or similar), open up command line and run `npm run build:dev` to make sure all the assets have been properly built by Webpack.\n\n### Visual Studio Code\n\n\u003e Note: Make sure you have the C# extension \u0026 .NET Core Debugger installed.\n\nThe project comes with the configured Launch.json files to let you just push F5 to start the project.\n\n```bash\n# cd into the directory you cloned the project into\nnpm install \u0026\u0026 npm run build:dev \u0026\u0026 dotnet restore\n# or yarn install\n```\n\nIf you're running the project from command line with `dotnet run` make sure you set your environment variables to Development (otherwise things like HMR might not work).\n\n```bash\n# on Windows:\nset ASPNETCORE_ENVIRONMENT=Development\n# on Mac/Linux\nexport ASPNETCORE_ENVIRONMENT=Development \n```\n\n# Upcoming Features:\n\n- Clean API / structure / simplify application\n- Refactor to latest RxJs pipeable syntax\n- Attempt to integrate with Angular-CLI fully\n\n----\n\n----\n\n# Deployment\n\n### Dotnet publish\nUsing `dotnet publish`, when it's finished place the generated folder onto your server and use IIS to fire everything up.\n\n### Heroku \n\u003ca href=\"https://dashboard.heroku.com/new?template=https://github.com/MarkPieszak/aspnetcore-angular2-universal.git\"\u003e\n\u003cimg src=\"https://www.herokucdn.com/deploy/button.svg\" alt=\"Deploy on Heroku\"\u003e\n\u003c/a\u003e\n\n### Azure\n\n```bash\ngit remote add azure https://your-user-name@my-angular2-site.scm.azurewebsites.net:443/my-angular2-site.git\n                     // ^ get this from Azure (Web App Overview section - Git clone url)\n\ngit push --set-upstream azure master \n```\n\n# Application Structure:\n\n\u003e Note: This application has WebAPI (our REST API) setup inside the same project, but of course all of this \ncould be abstracted out into a completely separate project('s) ideally. .NET Core things are all done in the same project \nfor simplicity's sake.\n\n**Root level files** \n\nHere we have the *usual suspects* found at the root level.\n\n*Front-end oriented files:*\n\n- `package.json` - NPM project dependencies \u0026 scripts\n- `.tsconfig` - TypeScript configuration (here we setup PATHs as well)\n- `webpack` - configuration files (modular bundling + so much more)\n- `karma` - configuration files (unit testing)\n- `protractor` - config files (e2e testing)\n- `tslint` - TypeScript code linting rules\n\n### /ClientApp/ - Everything Angular \n\n\u003e Let's take a look at how this is structured so we can make some sense of it all!\n\nWith Angular Universal, we need to split our applicatoin logic **per platform** so [if we look inside this folder](./ClientApp), \nyou'll see the 2 root files, that branch the entire logic for browser \u0026 server respectively.\n\n- [**Boot.Browser.ts**](./ClientApp/boot.browser.ts) - \nThis file starts up the entire Angular application for the Client/browser platform. \n\nHere we setup a few things, client Angular bootstrapping.\n\nYou'll barely need to touch this file, but something to note, this is the file where you would import libraries that you **only** want \nbeing used in the Browser. (Just know that you'd have to provide a mock implementation for the Server when doing that).\n\n- [**Boot.Server.ts**](./ClientApp/boot.server.ts) - \nThis file is where Angular _platform-server_ *serializes* the Angular application itself on the .NET server \nwithin a very quick Node process, and renders it a string. This is what causes that initial fast paint \nof the entire application to the Browser, and helps us get all our _SEO_ goodness :sparkles:\n\n---\n\nNotice the folder structure here in `./ClientApp/` :\n\n```diff\n+ /ClientApp/\n\n+   /app/\n    App NgModule - our Root NgModule (you'll insert Components/etc here most often)\n    AppComponent / App Routes / global css styles\n\n    * Notice that we have 2 dividing NgModules:\n        app.module.browser \u0026 app.module.server\n    You'll almost always be using the common app.module, but these 2 are used to split up platform logic\n    for situations where you need to use Dependency Injection / etc, between platforms.\n\nNote: You could use whatever folder conventions you'd like, I prefer to split up things in terms of whether they are re-usable \n     \"components\" or routeable / page-like components that group together and organize entire sections.\n++ \u003e ++ \u003e /components/ \n          Here are all the regular Components that aren't \"Pages\" or container Components\n\n++ \u003e ++ \u003e /containers/\n          These are the routeable or \"Page / Container\" Components, sometimes known as \"Dumb\" Components\n\n++ \u003e ++ \u003e /shared/\n          Here we put all shared Services / Directives / Pipes etc\n```\n\nWhen adding new features/components/etc to your application you'll be commonly adding things to the Root **NgModule** (located \nin `/ClientApp/app/app.module.ts`), but why are there **two** other NgModules in this folder?\n\nThis is because we want to split our logic **per Platform**, but notice they both share the Common NgModule \nnamed `app.module.ts`. When adding most things to your application, this is the only \nplace you'll have to add in your new Component / Directive / Pipe / etc.  You'll only occassional need to manually \nadd in the Platform specific things to either `app.module.browser || app.module.server`.\n\nTo illustrate this point with an example, you can see how we're using Dependency Injection to inject a `StorageService` that is different \nfor the Browser \u0026 Server.\n\n```typescript\n// For the Browser (app.module.browser)\n{ provide: StorageService, useClass: BrowserStorage }\n\n// For the Server (app.module.server)\n{ provide: StorageService, useClass: ServerStorage }\n```\n\n\u003e Just remember, you'll usually only need to worry about `app.module.ts`, as that's where you'll be adding most \nof your applications new aspects!\n\n\n### /Server/ - Our REST API (WebApi) - MVC Controller\n\n\u003e As we pointed out, these are here for simplicities sake, and realistically you may want separate projects \nfor all your microservices / REST API projects / etc.\n\nWe're utilizing MVC within this application, but we only need \u0026 have ONE Controller, named `HomeController`. This is where our entire \nAngular application gets serialized into a String, sent to the Browser, along with all the assets it needs to then bootstrap on the client-side, and become a full-blown SPA afterwards.\n\n---\n\nThe short-version is that we invoke that Node process, passing in our Request object \u0026 invoke the `boot.server` file, and we get back a nice object that we pass into .NETs `ViewData` object, and sprinkle through out our `Views/Shared/_Layout.cshtml` and `/Views/Home/index.cshtml` files!\n\nA more detailed explanation can be found here: [ng-AspnetCore-Engine Readme](https://github.com/angular/universal/tree/master/modules/aspnetcore-engine)\n\n```csharp\n// Prerender / Serialize application\nvar prerenderResult = await Prerenderer.RenderToString(\n    /* all of our parameters / options / boot.server file / customData object goes here */\n);\n\nViewData[\"SpaHtml\"] = prerenderResult.Html;\nViewData[\"Title\"] = prerenderResult.Globals[\"title\"];\nViewData[\"Styles\"] = prerenderResult.Globals[\"styles\"];\nViewData[\"Meta\"] = prerenderResult.Globals[\"meta\"];\nViewData[\"Links\"] = prerenderResult.Globals[\"links\"];\n\nreturn View(); // let's render the MVC View\n```\n\nTake a look at the `_Layout.cshtml` file for example, notice how we let .NET handle and inject all our SEO magic (that we extracted from Angular itself) !\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003cbase href=\"/\" /\u003e\n        \u003c!-- Title will be the one you set in your Angular application --\u003e\n        \u003ctitle\u003e@ViewData[\"Title\"] - AspNET.Core Angular 7.0.0 (+) starter\u003c/title\u003e\n\n        \u003cmeta charset=\"utf-8\" /\u003e\n        \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /\u003e\n        @Html.Raw(ViewData[\"Meta\"]) \u003c!-- \u003cmeta /\u003e tags --\u003e\n        @Html.Raw(ViewData[\"Links\"]) \u003c!-- \u003clink /\u003e tags --\u003e\n        \n        \u003clink rel=\"stylesheet\" href=\"~/dist/vendor.css\" asp-append-version=\"true\" /\u003e\n\n        @Html.Raw(ViewData[\"Styles\"]) \u003c!-- \u003cstyle /\u003e tags --\u003e\n\n    \u003c/head\u003e\n    ... etc ...\n```\n\nOur `Views/Home/index.cshtml` simply renders the application and serves the bundled webpack files in it.\n\n```html\n@Html.Raw(ViewData[\"SpaHtml\"])\n\n\u003cscript src=\"~/dist/vendor.js\" asp-append-version=\"true\"\u003e\u003c/script\u003e\n@section scripts {\n    \u003cscript src=\"~/dist/main-client.js\" asp-append-version=\"true\"\u003e\u003c/script\u003e\n}\n```\n\n### What happens after the App gets server rendered?\n\nWell now, your Client-side Angular will take over, and you'll have a fully functioning SPA. (But we gained all these great SEO benefits of being server-rendered) !\n\n:sparkles:\n\n\n----\n\n----\n\n# \"Gotchas\"\n\n- This repository uses ASP.Net Core 2.1, which has a hard requirement on .NET Core Runtime 2.1 and .NET Core SDK 2.1. Please install these items from [here](https://blogs.msdn.microsoft.com/dotnet/2018/05/30/announcing-net-core-2-1/?WT.mc_id=blog-twitter-timheuer)\n\n\u003e When building components in Angular 7 there are a few things to keep in mind.\n\n - Make sure you provide Absolute URLs when calling any APIs. (The server can't understand relative paths, so `/api/whatever` will fail).\n \n - API calls will be ran during a server, and once again during the client render, so make sure you're using transfering data that's important to you so that you don't see a flicker.\n\n - **`window`**, **`document`**, **`navigator`**, and other browser types - _do not exist on the server_ - so using them, or any library that uses them (jQuery for example) will not work. You do have some options, if you truly need some of this functionality:\n    - If you need to use them, consider limiting them to only your client and wrapping them situationally. You can use the Object injected using the PLATFORM_ID token to check whether the current platform is browser or server. \n    \n    ```typescript\n     import { PLATFORM_ID } from '@angular/core';\n     import { isPlatformBrowser, isPlatformServer } from '@angular/common';\n     \n     constructor(@Inject(PLATFORM_ID) private platformId: Object) { ... }\n     \n     ngOnInit() {\n       if (isPlatformBrowser(this.platformId)) {\n          // Client only code.\n          ...\n       }\n       if (isPlatformServer(this.platformId)) {\n         // Server only code.\n         ...\n       }\n     }\n    ```\n    \n     - Try to *limit or* **avoid** using **`setTimeout`**. It will slow down the server-side rendering process. Make sure to remove them [`ngOnDestroy`](https://angular.io/docs/ts/latest/api/core/index/OnDestroy-class.html) in Components.\n   - Also for RxJs timeouts, make sure to _cancel_ their stream on success, for they can slow down rendering as well.\n - **Don't manipulate the nativeElement directly**. Use the _Renderer2_. We do this to ensure that in any environment we're able to change our view.\n```typescript\nconstructor(element: ElementRef, renderer: Renderer2) {\n  this.renderer.setStyle(element.nativeElement, 'font-size', 'x-large');\n}\n```\n - The application runs XHR requests on the server \u0026 once again on the Client-side (when the application bootstraps)\n    - Use a cache that's transferred from server to client (TODO: Point to the example)\n - Know the difference between attributes and properties in relation to the DOM.\n - Keep your directives stateless as much as possible. For stateful directives, you may need to provide an attribute that reflects the corresponding property with an initial string value such as url in img tag. For our native element the src attribute is reflected as the src property of the element type HTMLImageElement.\n - Error: `sass-loader` requires `node-sass` \u003e=4: Either in the docker container or localhost run \u003cb\u003enpm rebuild node-sass -f\u003c/b\u003e\n\n----\n\n----\n \n# FAQ - Also check out the [!FAQ Issues label!](https://github.com/MarkPieszak/aspnetcore-angular2-universal/issues?utf8=%E2%9C%93\u0026q=is%3Aissue%20label%3Afaq) and the [!HOW-TO Issues Label!](https://github.com/MarkPieszak/aspnetcore-angular2-universal/issues?q=is%3Aissue+label%3A%22HOW+TO+-+Guide%22)\n\n### How can I disable SSR (Server-side rendering)?\n\nSimply comment out the logic within HomeController, and replace `@Html.Raw(ViewData[\"SpaHtml\"])` with just your applications root \nAppComponent tag (\"app-root\" in our case): `\u003capp-root\u003e\u003c/app-root\u003e`.\n\n\u003e You could also remove any `isPlatformBrowser/etc` logic, and delete the boot.server, app.module.browser \u0026 app.module.server files, just make sure your `boot.browser` file points to `app.module`.\n\n### How do I have code run only in the Browser?\n\nCheck the [Gotchas](#gotchas) on how to use `isPlatformBrowser()`.\n\n### How do I Material2 with this repo?\n\n~~You'll either want to remove SSR for now, or wait as support should be coming to handle platform-server rendering.~~\nThis is now possible, with the recently updated Angular Material changes. We do not have a tutorial available for this yet.\n\n### How can I use jQuery and/or some jQuery plugins with this repo?\n\n\u003e Note: If at all possible, try to avoid using jQuery or libraries dependent on it, as there are \nbetter, more abstract ways of dealing with the DOM in Angular (5+) such as using the Renderer, etc.\n\nYes, of course but there are a few things you need to setup before doing this. First, make sure jQuery \nis included in webpack vendor file, and that you have a webpack Plugin setup for it. `new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery' })`\n\nNow, make sure any \"plugins\" etc that you have, are only included in your `boot.browser.ts` file. (ie: `import 'slick-carousel';`) \nIn a Component you want to use jQuery, make sure to import it near the top like so:\n\n```typescript\nimport * as $ from 'jquery';\n```\n\n**Always make sure to wrap anything jQuery oriented in Angular's `isPlatformBrowser()` conditional!**\n\n### How can I support IE9 through IE11?\n\nTo support IE9 through IE11 open the `polyfills.ts` file in the `polyfills` folder and uncomment out the 'import polyfills' as needed. ALSO - make sure that your `webpack.config` and `webpack.config.vendor` change option of `TerserPlugin` from `ecma: 6` to **`ecma: 5`**.\n\n----\n\n# Special Thanks\n\nMany thanks go out to Steve Sanderson ([@SteveSandersonMS](https://github.com/SteveSandersonMS)) from Microsoft and his amazing work on JavaScriptServices and integrating the world of Node with ASP.NET Core.\n\nAlso thank you to the many Contributors !\n- [@GRIMMR3AP3R](https://github.com/GRIMMR3AP3R)\n- [@Isaac2004](https://github.com/Isaac2004)\n- [@AbrarJahin](https://github.com/AbrarJahin)\n- [@LiverpoolOwen](https://github.com/LiverpoolOwen)\n- [@hakonamatata](https://github.com/hakonamatata)\n- [@markwhitfeld](https://github.com/markwhitfeld)\n- [@Ketrex](https://github.com/Ketrex)\n\n----\n \n# Found a Bug? Want to Contribute?\n\n[Check out our easier issues here](https://github.com/MarkPieszak/aspnetcore-angular2-universal/issues?utf8=%E2%9C%93\u0026q=is%3Aissue%20is%3Aopen%20label%3A%22PRs%20welcome!%22%20)\n\nNothing's ever perfect, but please let me know by creating an issue (make sure there isn't an existing one about it already), and we'll try and work out a fix for it! If you have any good ideas, or want to contribute, feel free to either make an Issue with the Proposal, or just make a PR from your Fork.\n\n----\n\n# License\n\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](/LICENSE) \n\nCopyright (c) 2016-2019 [Mark Pieszak](https://github.com/MarkPieszak)\n\n[![Twitter Follow](https://img.shields.io/twitter/follow/MarkPieszak.svg?style=social)](https://twitter.com/MarkPieszak)\n\n----\n\n# Trilon - Angular \u0026 ASP.NET - Consulting | Training | Development\n\nCheck out **[Trilon.io](https://Trilon.io)** for more info! Twitter [@Trilon_io](http://www.twitter.com/Trilon_io)\n\nContact us at \u003chello@trilon.io\u003e, and let's talk about your projects needs.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://trilon.io\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://trilon.io/trilon-logo-clear.png\" alt=\"Trilon.io - Angular Universal, NestJS, JavaScript Application Consulting Development and Training\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Follow Trilon online:\n\nTwitter: [@Trilon_io](http://twitter.com/Trilon_io)\n","funding_links":[],"categories":["Starter Kits","TypeScript","aspnet","angular"],"sub_categories":["Workflow"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTrilonIO%2Faspnetcore-angular-universal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FTrilonIO%2Faspnetcore-angular-universal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTrilonIO%2Faspnetcore-angular-universal/lists"}