www.carecom.de is an universal (isomorphic) React Single Page Application (SPA) using Redux, React-Router, TypeScript, Bootstrap and an ASP.NET Core backend.
It's based on the excellent Microsoft ASP.NET Core JavaScript Services project. Some extensions stem from the great community on Github other I've implemented on my own:
Multi-tenant support so I can easily reuse all this goodness for my customers Localization (client & server) Meta tags and titles Added Google Analytics component Added Google Ads component Added cookie warning component Added gross / net price switcher component Added basic authentication support Added modal dialog component Added contact form component Added code prettify component Added smooth scroll / scroll to hashtag component Sitemap.xml Transfer of "global state" between server and client Improved cookie handling Nested redux reducers ... Over time I will add to this blog entry detailing more aspects of the app design. Explaining the underlying technologies is out of scope for this post.
For now it's more of a stub for things to come.
I love it
Let's have a look at part of the main React Layout component (written using JSX; code in {} is TypeScript) for the site:
return <div className="layoutContainer">
<DocumentMeta {...getMeta()} />
<NavMenu userId={this.props.userId} isLoggedIn={this.props.isLoggedIn} onLogout={this.props.onLogout} />
{this.props.slider}
<main className='container mainLayoutContainer'>
{
breadCrumb &&
<div className='row hidden-xs hidden-sm'>
<div className='col-md-6 breadCrumb'>{breadCrumb}</div>
</div>
}
{
title &&
<div className='row'>
<header className={`col-md - ${(side ? 0 : 3) + (translations ? 6 : 9)} col-xs - ${ translations ? 9 : 12 } `}>
<h1>{title}</h1>
</header>
{
translations &&
<div className='col-xs-3 translations'>
<span className='glyphicon glyphicon-flag'></span> {translations}
</div>
}
</div>
}
<div className='row'>
<div className={`col- md - ${side ? 9 : 12 }`} role='main'>{ this.props.body }</div>
{
side &&
<aside className='col-md-3'>{ side }</aside>
}
</div>
</main>
<footer>
<BottomMenu />
<Footer />
</footer>
</div> DocumentMeta
(from React Document Meta ) ensures that info like title
, description
, meta
tags will be associated with the component using this Layout.getMeta()
is from a helper module that gets the meta info for the current route.
Breadcrumb, title & translations (links to other language versions of a route) will only be rendered if they are supplied by the current route.
export default (
<Route path='/' component={Layout}>
{ /* de */ }
<IndexRoute components={EnhHomeComp} />
<Route path="de">
<IndexRoute components={EnhHomeComp} />
<Route path='consulting'>
<IndexRoute components={{ body: Consulting, side: ConsultingQuotation }} />
<Route path='informatiker' components={{ body: ComputerScientist, side: SideHaraldMuehlhoff }} />
<Route path='referenzen' components={{ body: ConsultingReferences }} />
<Route path='remote-support' components={{ body: RemoteSupport, side: SideHaraldMuehlhoff }} />
</Route>
<Route path='distribution'>
<IndexRoute components={{ body: Distribution, side: DistributionQuotation }} />
<Route path='referenzen' components={{ body: DistributionReferences }} />
<Route path='selbstbedienung' components={{ body: SelfService }} />
</Route> E.g. not every Route
has a side
component. This has effects on the applied bootstrap styles (className={`col-md-${side ? 9 : 12}`}
).
We use cookies to optimize the website; for details see imprint . By continued use you agree with our cookie policy. Accepted
{
"initialRandom": 0.6657457278216645,
"random": 0.7608261697753789,
"path": "/en/blog/creation-of-carecomde",
"tenantName": "carecom",
"meta": {
"config": {
"trailer": " - CARECOM",
"author": "Harald Mühlhoff, 58300 Wetter, Deutschland",
"copyright": "CARECOM Harald Mühlhoff, 58300 Wetter, Deutschland",
"sitemapPrefix": "https://www.carecom.de",
"canonicalPrefix": "http://www.carecom.de",
"rootLocale": "de"
},
"/de": {
"title": "Willkommen!",
"description": "Seit 1991 bringen wir Software-Projekte voran, egal ob als Projektleiter oder produktiver Entwickler mit einem Blick für das Gesamtsystem. 2006 sind kreative Fotografie & Fotodesign hinzugekommen.",
"meta": {
"name": {
"robots": "INDEX,FOLLOW",
"verify-v1": "Vg61ls+LSZZdv1fAYWbgGRhLAYcXUyFIP+gI/34fICo=",
"google-site-verification": "iOXaWTG5HqWAigSN6CTGszlh6e9GurslyadxY4owsBw"
}
},
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-06-25",
"priority": "1"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/en": {
"title": "Welcome!",
"description": "We advance software projects, whether as project manager or productive developer with an eye on the total system. Since 2006 we also offer creative photography.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "1"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/de/consulting/informatiker": {
"title": "Der Informatiker",
"description": "Der Informatiker Harald Mühlhoff ... Übersicht über Qualifikationen & Projekte.",
"metameta": {
"transl": [
"/en/consulting/computerscientist"
],
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.5"
}
}
},
"/en/consulting/computerscientist": {
"title": "The Computer Scientist",
"description": "Information about the computer scientist Harald Mühlhoff.",
"metameta": {
"transl": [
"/de/consulting/informatiker"
],
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.5"
}
}
},
"/de/consulting": {
"title": "Consulting",
"description": "Die Beratungsleistungen von CARECOM Harald Mühlhoff im Überblick.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/en/consulting": {
"title": "Consulting",
"description": "CARECOM Consulting.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/de/consulting/referenzen": {
"title": "Referenzen",
"description": "Referenzen für CARECOM Consulting.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
}
}
},
"/de/consulting/remote-support": {
"title": "Fernwartung",
"description": "Fernunterstützung mittels Teamviewer durch CARECOM Dipl.-Inform. Harald Mühlhoff",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.5"
}
}
},
"/de/distribution": {
"title": "Distribution",
"description": "Seit Jahren bieten wir zuverlässiges Hosting für die Internet-Auftritte unserer Kunden.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/en/distribution": {
"title": "Distribution",
"description": "Reliable Webhosting",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/de/distribution/referenzen": {
"title": "Referenzen",
"description": "Referenzen Distribution & Hosting für CARECOM.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.5"
}
}
},
"/de/distribution/selbstbedienung": {
"title": "Selbstbedienung",
"description": "Einige Links, die Ihnen ein günstiges Angebot und uns moderate Prozente einbringen – natürlich ohne Extra-Kosten für Sie! Wir beraten Sie auch hier bei Bedarf gerne!",
"metameta": {
"sitemap": {
"changefreq": "daily",
"lastmod": "2017-02-15",
"priority": "0.75"
}
}
},
"/de/photography": {
"title": "Photography",
"description": "Möchten Sie sich oder Ihre Lieben mit einem einzigARTigen Shooting überraschen? Vielleicht haben Sie bereits eine besondere Bildidee?",
"meta": {
"name": {
"twitter:card": "summary_large_image",
"twitter:site": "@HaraldMuehlhoff",
"twitter:creator": "@HaraldMuehlhoff",
"twitter:title": "Photography - CARECOM",
"twitter:description": "Möchten Sie sich oder Ihre Lieben mit einem einzigARTigen Shooting überraschen? Vielleicht haben Sie bereits eine besondere Bildidee?",
"twitter:image": "http://www.carecom.de/images/photography/slides/dia-001.jpg",
"twitter:image:alt": "Bild einer jungen Frau im Kornfeld"
}
},
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-16",
"priority": "0.75"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/de/photography/communities": {
"title": "Communities",
"description": "Fotografische Communities",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
}
}
},
"/de/photography/coaching": {
"title": "Coaching in Fotografie und Bildbearbeitung",
"description": "Mein Coaching-Angebot richtet sich in erster Linie an Einzelpersonen oder auch Paare, die Freude an der Fotografie haben und in angenehmer Atmosphäre intensiv neues Wissen erlernen oder vorhandenes hinterfragen bzw. vertiefen wollen [...]",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-03-03",
"priority": "0.75"
}
}
},
"/en/photography": {
"title": "Photography",
"description": "Our offerings include creative shootings, photography & image editing workshops or coachings.",
"meta": {
"name": {
"twitter:card": "summary_large_image",
"twitter:site": "@HaraldMuehlhoff",
"twitter:creator": "@HaraldMuehlhoff",
"twitter:title": "Photography - CARECOM",
"twitter:description": "Our offerings include creative shootings, photography & image editing workshops or coachings.",
"twitter:image": "http://www.carecom.de/images/photography/slides/dia-001.jpg",
"twitter:image:alt": "Image of a young woman in a corn field"
}
},
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-16",
"priority": "0.75"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/en/photography/communities": {
"title": "Communities",
"description": "photographic communities",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
}
}
},
"/de/kontakt": {
"title": "Kontakt",
"description": "Kontakt zu CARECOM Dipl.-Inform. Harald Mühlhoff, Wetter, Deutschland",
"metameta": {
"transl": [
"/en/contact"
],
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
}
}
},
"/en/contact": {
"title": "Contact",
"description": "Contact CARECOM Dipl.-Inform. Harald Mühlhoff, Wetter (Ruhr), Germany",
"metameta": {
"transl": [
"/de/kontakt"
],
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
}
}
},
"/de/partner": {
"title": "Partner",
"description": "Das CARECOM Netzwerk.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.75"
}
}
},
"/de/blog": {
"title": "Blog",
"description": "CARECOM Blog",
"metameta": {
"sitemap": {
"changefreq": "daily",
"lastmod": "2017-06-25",
"priority": "0.75"
}
}
},
"/en/blog": {
"title": "Blog",
"description": "CARECOM Blog",
"metameta": {
"sitemap": {
"changefreq": "daily",
"lastmod": "2017-06-25",
"priority": "0.75"
}
}
},
"/de/getup": {
"title": "CARECOM GetUp!",
"description": "CARECOM GetUp!",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-16",
"priority": "0.5"
}
}
},
"/de/blog/berufsfelderkundung-bei-carecom-photography": {
"title": "Berufsfelderkundung bei CARECOM photography",
"description": "Am vergangenen Mittwoch hatte ich lieben Besuch von Carolin Stecher, die bei mir an einer Berufsfelderkundung Medien / Fotografie & Bildbearbeitung teilgenommen hat.",
"metameta": {
"sitemap": {
"changefreq": "monthly",
"lastmod": "2017-02-16",
"priority": "0.7"
},
"requirePath": "./components/Blog/Berufsfelderkundung"
}
},
"/de/blog/eigenes-outlook-addin-fur-wahl-ueber-mein-grandstream-gxp1450-ip-telefon": {
"title": "Eigenes Outlook Addin für Wahl über mein Grandstream GXP1450 IP-Telefon",
"metameta": {
"sitemap": {
"changefreq": "monthly",
"lastmod": "2017-03-03",
"priority": "0.7"
},
"requirePath": "./components/Blog/OutlookAddin"
}
},
"/de/blog/prof-system-und-netzwerk-ueberwachung-mit-paessler-ueberwachung-von-intel-matrix-raid": {
"title": "Prof. System- und Netzwerk-Überwachung mit PAESSLER / Überwachung von Intel Matrix RAID",
"description": "Seit Jahren setze ich für die Überwachung meiner Systeme und der von mir gehosteten Kundenanwendungen den PRTG Monitor von Paessler ein; die neueste Version unterstützt jetzt sogar 30 kostenlose Sensoren. Mittels des Ereignisprotokoll-Sensors lässt sich auch ein Intel Matrix RAID effektiv überwachen.",
"metameta": {
"sitemap": {
"changefreq": "monthly",
"lastmod": "2017-02-19",
"priority": "0.7"
},
"requirePath": "./components/Blog/PaesslerPRTG"
}
},
"/de/blog/was-wuerden-Sie-und-Ihr-Unternehmen-mit-Ihrer-eigenen-kreativen-und-verlaesslichen-IT-Abteilung-machen": {
"title": "Was würden Sie und Ihr Unternehmen mit Ihrer “eigenen” kreativen & verlässlichen “IT-Abteilung” machen?",
"description": "Was würden Sie und Ihr Unternehmen mit Ihrer “eigenen” kreativen & verlässlichen “IT-Abteilung” machen? Lassen Sie uns ins Gespräch kommen – dann laufen Ihre Geschäfte bald auch so gut wie Ihre erneuerte IT ;)",
"metameta": {
"sitemap": {
"changefreq": "monthly",
"lastmod": "2017-02-20",
"priority": "0.7"
},
"requirePath": "./components/Blog/CreativeIT"
}
},
"/de/blog/ccwebcore": {
"title": "Lebendige und rasend schnelle Websites mit CARECOM CCWebCore",
"description": "Mit dem CARECOM CCWebCore Framework erstellen wir für Sie lebendige und rasend schnelle Websites.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-03-15",
"priority": "1"
},
"requirePath": "./components/Blog/CCWebCore"
}
},
"/de/blog/migration-windows-server-2003-to-windows-server-2016-and-office-365": {
"title": "Migration von Windows Small Business Server 2003 nach Office 365 & Windows Server 2016",
"description": "Kurzer Erfahrungsbericht über die problemlose Ablösung von Windows SBS 2003 durch Office 365 und Windows Server 2016.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-09-28",
"priority": "1"
},
"blogPreviewUrl": "/tenants/carecom/images/blog/migration20032016/dia-preview.jpg",
"requirePath": "./components/Blog/Migration20032016"
}
},
"/en/blog/creation-of-carecomde": {
"title": "Creating www.carecom.de",
"description": "A little journey explaining part of the technology and programming behind the React, TypeScript, Redux, ASP.NET Core universal Single Page Application called carecom.de.",
"metameta": {
"sitemap": {
"changefreq": "monthly",
"lastmod": "2017-02-21",
"priority": "0.7"
},
"requirePath": "./components/Blog/CreationOfCarecomDe"
}
},
"/en/getup": {
"title": "CARECOM GetUp!",
"description": "CARECOM GetUp!",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-16",
"priority": "0.5"
}
}
},
"/de/carecom": {
"title": "Die Marke CARECOM",
"description": "Die Marke CARECOM.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.5"
}
}
},
"/en/carecom": {
"title": "The CARECOM trade mark",
"description": "The CARECOM trade mark.",
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.5"
}
}
},
"/de/impressum": {
"title": "Impressum / Datenschutzerklärung",
"description": "Impressum",
"metameta": {
"transl": [
"/en/imprint"
],
"sitemap": {
"changefreq": "weekly",
"lastmod": "2018-05-23",
"priority": "0.3"
},
"skipAsChild": true
}
},
"/en/imprint": {
"title": "Imprint",
"description": "Imprint",
"metameta": {
"transl": [
"/de/impressum"
],
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-02-15",
"priority": "0.3"
},
"skipAsChild": true
}
},
"/de/404": {
"title": "404",
"description": "404",
"meta": {
"name": {
"robots": "NOINDEX,NOFOLLOW"
}
},
"metameta": {
"sitemap": {
"changefreq": "monthly",
"lastmod": "2017-02-15",
"priority": "0.1"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/en/404": {
"title": "404",
"description": "404",
"meta": {
"name": {
"robots": "NOINDEX,NOFOLLOW"
}
},
"metameta": {
"sitemap": {
"changefreq": "monthly",
"lastmod": "2017-02-15",
"priority": "0.1"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
},
"/": {
"title": "Willkommen!",
"description": "Seit 1991 bringen wir Software-Projekte voran, egal ob als Projektleiter oder produktiver Entwickler mit einem Blick für das Gesamtsystem. 2006 sind kreative Fotografie & Fotodesign hinzugekommen.",
"meta": {
"name": {
"robots": "INDEX,FOLLOW",
"verify-v1": "Vg61ls+LSZZdv1fAYWbgGRhLAYcXUyFIP+gI/34fICo=",
"google-site-verification": "iOXaWTG5HqWAigSN6CTGszlh6e9GurslyadxY4owsBw"
}
},
"metameta": {
"sitemap": {
"changefreq": "weekly",
"lastmod": "2017-06-25",
"priority": "1"
},
"skipAsChild": true,
"skipInBreadCrumb": true
}
}
}
}