{"id":2322,"date":"2019-06-30T13:23:29","date_gmt":"2019-06-30T11:23:29","guid":{"rendered":"https:\/\/www.angulararchitects.io\/?p=2322"},"modified":"2025-07-16T09:32:39","modified_gmt":"2025-07-16T07:32:39","slug":"sustainable-angular-architectures-2","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-2\/","title":{"rendered":"Implementing your Strategic Design with Angular and Nx"},"content":{"rendered":"<div class=\"wp-post-series-box series-ddd-with-angular-and-nx wp-post-series-box--expandable\">\n\t\t\t<input id=\"collapsible-series-ddd-with-angular-and-nx6a4197374bc1d\" class=\"wp-post-series-box__toggle_checkbox\" type=\"checkbox\">\n\t\n\t<label\n\t\tclass=\"wp-post-series-box__label\"\n\t\t\t\t\tfor=\"collapsible-series-ddd-with-angular-and-nx6a4197374bc1d\"\n\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\t\t<p class=\"wp-post-series-box__name wp-post-series-name\">\n\t\t\tThis is post 2 of 2 in the series <em>&ldquo;DDD with Angular and Nx&rdquo;<\/em>\t\t<\/p>\n\t\t\t<\/label>\n\n\t\t\t<div class=\"wp-post-series-box__posts\">\n\t\t\t<ol>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-1\/\">Sustainable Angular Architectures with Strategic Design (DDD)<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><span class=\"wp-post-series-box__current\">Implementing your Strategic Design with Angular and Nx<\/span><\/li>\n\t\t\t\t\t\t\t<\/ol>\n\t\t<\/div>\n\t<\/div>\n<div class=\"article\">\n<p>In the first part of this series, I've presented the idea of Strategic Design which allows to subdivide a software system into several self-contained (sub-)domains. In this part, I show how to implement those domains with Angular and an <a href=\"https:\/\/nx.dev\/\">Nx<\/a>-based monorepo.<\/p>\n<p>For this, I'm following some recommendations the Nx team recently wrote down in their free e-book about <a href=\"https:\/\/go.nrwl.io\/angular-enterprise-monorepo-patterns-new-book\">Monorepo Patterns<\/a>. Before this was available, I've used similar strategies but in order to help establishing a common vocabulary and common conventions in the community, I seek to use this official way.<\/p>\n<h2 id=\"implementation-with-nx\">Implementation with Nx<\/h2>\n<p>For the implementation of the defined architecture, a workspace based on Nx [Nx] is used. This is an extension for the Angular CLI, which among other things helps to break down a solution into different applications and libraries. Of course this is just one of several possible approaches. As an alternative, one could, for example, implement each domain as a completely separate solution. This would be called a micro-app approach.<\/p>\n<p>The solution shown here puts all applications into one <code>apps<\/code> folder, and all the reusable libraries are grouped by the respective domain name in the <code>libs<\/code> folder:<\/p>\n<p><img decoding=\"async\" style=\"max-width:300px\" src=\"\/wp-content\/uploads\/2019\/04\/2019-03-04-15-40-36.png\" alt=\"Folder structure of the used monorepo\"><\/p>\n<p>Because such a workspace consists of several applications and libraries that are managed in a common source code repository, there is also talk of a monorepo. This pattern is used extensively by Google and Facebook, among others, and has been the standard case for the development of .NET solutions in the Microsoft world for about 20 years.<\/p>\n<p>It allows the sharing of source code between the project participants in a particularly simple way and also prevents version conflicts by having only one central <code>node_modules<\/code> folder with dependencies. This ensures that e.g. each library uses the same Angular version.<\/p>\n<p>To install Nx you can use the following command:<\/p>\n<pre><code><div>npm install -g @nrwl\/schematics\n    <\/div><\/code><\/pre>\n<p>In order to create the CLI-based monorepo workspace, just leverage the <code>create-nx-workspace<\/code> command. Then, you can use <code>ng generate<\/code> to add applications and libraries:<\/p>\n<pre><code><div>create-nx-workspace e-proc\ncd e-proc\nng generate app ui\nng generate lib feature-request-product\n    <\/div><\/code><\/pre>\n<h2 id=\"categories-for-libraries\">Categories for Libraries<\/h2>\n<p>In their <a href=\"https:\/\/go.nrwl.io\/angular-enterprise-monorepo-patterns-new-book\">free e-book about Monorepo Patterns<\/a>, <a href=\"https:\/\/nrwl.io\/\">Nrwl<\/a> -- the company behind Nx -- use the following categories for libraries:<\/p>\n<ul>\n<li><strong>feature<\/strong>: Implements a use case using smart components<\/li>\n<li><strong>data-access<\/strong>: Implements data accesses, e.g. via HTTP or WebSockets<\/li>\n<li><strong>ui<\/strong>: Provides use case agnostic and thus reusable components (dumb components)<\/li>\n<li><strong>util<\/strong>: Provides helper functions<\/li>\n<\/ul>\n<p>In addition, I'm also using the following categories:<\/p>\n<ul>\n<li><strong>shell<\/strong>: For an application that contains multiple domains, a shell provides the entry point for a domain<\/li>\n<li><strong>api<\/strong>: Provides functionalities exposed for other domains<\/li>\n<li><strong>domain<\/strong>: Domain logic like calculating additional expanses (not shown here). Can be consolidated with a corresponding <code>data-access<\/code> library to simplify the design.<\/li>\n<\/ul>\n<p>To keep the overview, the categories are used as a prefix for the individual library folders. Thus, libraries of the same category are presented next to each other in a sorted overview.<\/p>\n<p>Each library also has a public API through which it publishes individual components. On the other hand, they hide all other components. These can be changed as desired:<\/p>\n<pre><code><div>export * from '.\/lib\/catalog-data-access.module';\nexport * from '.\/lib\/catalog-repository.service';\n    <\/div><\/code><\/pre>\n<h2 id=\"check-accesses-to-libraries\">Check accesses to libraries<\/h2>\n<p>To improve maintainability, it is important to minimize the dependencies between the individual libraries. The achievement of this goal can be checked graphically with Nx. For this, it provides the <code>dep-graph<\/code> npm script:<\/p>\n<pre><code><div>npm run dep-graph\n    <\/div><\/code><\/pre>\n<p>If we just concentrate on the <code>Catalog<\/code> domain in our case study, the result looks as follows:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/04\/2019-03-04-17-50-00.png\" style=\"max-width: 450px\" alt=\"Catalog Domain with public API\"><\/p>\n<p>In the case considered here, a few rules are used for the communication between libraries and these lead to a consistent layering. For example, each library may only access libraries from the same domain or shared libraries.<\/p>\n<p>Access to APIs such as <code>catalog-api<\/code> must be explicitly granted to individual domains.<br \/>\n    The categorization of libraries also has limitations: a <code>shell<\/code> only accesses <code>features<\/code> and a <code>feature<\/code> accesses <code>data-access<\/code> libraries. In addition, anyone can access <code>utils<\/code>.<\/p>\n<p>To enforce such restrictions, Nx comes with its own linting rules. As usual, they are configured within <code>tslint.json<\/code>:<\/p>\n<pre><code><div><span class=\"hljs-string\">&#34;nx-enforce-module-boundaries&#34;<\/span>: [\n      <span class=\"hljs-literal\">true<\/span>,\n      {\n        <span class=\"hljs-attr\">&#34;allow&#34;<\/span>: [],\n        <span class=\"hljs-attr\">&#34;depConstraints&#34;<\/span>: [\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;type:app&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;type:shell&#34;<\/span>] },\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;scope:catalog&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:catalog&#34;<\/span>, <span class=\"hljs-string\">&#34;scope:shared&#34;<\/span>] },\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;scope:shared&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:shared&#34;<\/span>] },\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;scope:ordering&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:ordering&#34;<\/span>, <span class=\"hljs-string\">&#34;scope:shared&#34;<\/span>] },\n\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;type:shell&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;type:feature&#34;<\/span>, <span class=\"hljs-string\">&#34;type:util&#34;<\/span>] },\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;type:feature&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;type:data-access&#34;<\/span>, <span class=\"hljs-string\">&#34;type:util&#34;<\/span>] },\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;type:api&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;type:data-access&#34;<\/span>, <span class=\"hljs-string\">&#34;type:util&#34;<\/span>] },\n          { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;type:util&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;type:util&#34;<\/span>] },<\/div><div><br><\/div><div>      { <span class=\"hljs-attr\">&#34;sourceTag&#34;<\/span>: <span class=\"hljs-string\">&#34;name:ordering-feature&#34;<\/span>, <span class=\"hljs-attr\">&#34;onlyDependOnLibsWithTags&#34;<\/span>: [<span class=\"hljs-string\">&#34;name:catalog-api<\/span><span class=\"hljs-string\">&#34;<\/span>] }\n        ]\n      }\n    ]\n    <\/div><\/code><\/pre>\n<p>According to a suggestion from the <a href=\"https:\/\/go.nrwl.io\/angular-enterprise-monorepo-patterns-new-book\">mentioned e-book about Monorepo Patterns<\/a>, the domains are named with the prefix <code>scope<\/code> and The library types are prefixed with <code>kind<\/code>. Prefixes of this type are only intended to increase readability and can be freely assigned.<\/p>\n<p>In addition, this example also shows the domain <span style=\"color: rgb(199, 37, 78); font-family: Menlo, Monaco, Consolas, &quot;Droid Sans Mono&quot;, &quot;Courier New&quot;, monospace, &quot;Droid Sans Fallback&quot;; white-space: nowrap; background-color: rgb(249, 242, 244);\">Ordering<\/span>&nbsp;which, according to the context mapping, has access to the <code>CatalogApi<\/code>. For this, the example uses a name prefix to make sure that only selected libraries are allowed to access the api.<\/p>\n<p>The mapping between the projects and the library types and domains shown here takes place in the file <code>nx.json<\/code>:<\/p>\n<pre><code><div><span class=\"hljs-string\">&#34;projects&#34;<\/span>: {\n      <span class=\"hljs-attr\">&#34;ui&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;type:app&#34;<\/span>]\n      },\n      <span class=\"hljs-attr\">&#34;ui-e2e&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;type:e2e&#34;<\/span>]\n      },\n      <span class=\"hljs-attr\">&#34;catalog-shell&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:catalog&#34;<\/span>, <span class=\"hljs-string\">&#34;type:shell&#34;<\/span>]\n      },\n      <span class=\"hljs-attr\">&#34;catalog-feature-request-product&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:catalog&#34;<\/span>, <span class=\"hljs-string\">&#34;type:feature&#34;<\/span>]\n      },\n      <span class=\"hljs-attr\">&#34;catalog-feature-browse-products&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:catalog&#34;<\/span>, <span class=\"hljs-string\">&#34;type:feature&#34;<\/span>]\n      },\n      <span class=\"hljs-attr\">&#34;catalog-api&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:catalog&#34;<\/span>, <span class=\"hljs-string\">&#34;type:api&#34;<\/span>, <span class=\"hljs-string\">&#34;name:catalog-api&#34;<\/span>]\n      },\n      <span class=\"hljs-attr\">&#34;catalog-data-access&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:catalog&#34;<\/span>, <span class=\"hljs-string\">&#34;type:data-access&#34;<\/span>]\n      },<\/div><div>  [...],<\/div><div>  \"ordering-feature\": {<\/div><div>    \"tags\": <span style=\"background-color: transparent; color: var(--vscode-editor-foreground); font-size: inherit;\">[<\/span><span class=\"hljs-string\" style=\"background-color: transparent; font-size: inherit;\">&#34;scope:ordering&#34;<\/span><span style=\"background-color: transparent; color: var(--vscode-editor-foreground); font-size: inherit;\">, <\/span><span class=\"hljs-string\" style=\"background-color: transparent; font-size: inherit;\">&#34;type:feature\", \"name:ordering-feature&#34;<\/span><span style=\"background-color: transparent; color: var(--vscode-editor-foreground); font-size: inherit;\">]<\/span><\/div><div>  },<\/div><div>  [...],\n      <span class=\"hljs-attr\">&#34;shared-util-auth&#34;<\/span>: {\n        <span class=\"hljs-attr\">&#34;tags&#34;<\/span>: [<span class=\"hljs-string\">&#34;scope:shared&#34;<\/span>, <span class=\"hljs-string\">&#34;type:util&#34;<\/span>]\n      }\n    }\n    <\/div><\/code><\/pre>\n<p>Alternatively, these tags can also be specified when setting up the applications and libraries.<\/p>\n<p>To test against these rules, just call <code>ng lint<\/code> on the command line. Development environments such as WebStorm \/ IntelliJ or Visual Studio Code show such violations while typing. In the latter case, a corresponding plugin must be installed.<\/p>\n<p>Don't expect that those rules always guarantee a beautiful dependency graph without overlappings as shown above. However, if you put each domain into a block diagram where each layer is only allowed to access layers beneath it, you can clearly see that you have got a clean and comprehensible architecture:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/04\/2019-03-04-23-42-30.png\" style=\"max-width: 450px\" alt=\"The result is a clean layered architecture\"><\/p>\n<p>Moreover, everyone clearly sees where specific parts of the application are supposed to be found and the introduced rules prevent cycles, at least if APIs can only be accessed by features of other domains.<\/p>\n<h2 id=\"conclusion-and-evaluation\">Conclusion and Evaluation<\/h2>\n<p>Strategic Design provides a proven way to break an application into self-contained domains. These domains are characterized by their own specialized vocabulary, which must be used rigorously by all stakeholders.<\/p>\n<p>The CLI extension Nx provides a very charming way to implement these domains with different domain-grouped libraries. To restrict access by other domains and to reduce dependencies, it allows setting access restrictions to individual libraries.<\/p>\n<p>Of course, it can be argued that an Angular client does not necessarily include domain logic. But the fact is that more and more logic can also be found on the client, especially with single page applications. Regardless, the outlined ideas of Strategic Design have proven to be extremely useful for getting a good cut.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p> with Strategic Design and Monorepos &#8211; Part 2: Implementation<\/p>\n","protected":false},"author":9,"featured_media":3003,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-2322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","post_series-ddd-with-angular-and-nx"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Implementing your Strategic Design with Angular and Nx - ANGULARarchitects<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implementing your Strategic Design with Angular and Nx - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"with Strategic Design and Monorepos - Part 2: Implementation\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-30T11:23:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-16T07:32:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"745\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Manfred Steyer, GDE\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@daniel\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manfred Steyer, GDE\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-2\/\"},\"author\":{\"name\":\"Manfred Steyer, GDE\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\"},\"headline\":\"Implementing your Strategic Design with Angular and Nx\",\"datePublished\":\"2019-06-30T11:23:29+00:00\",\"dateModified\":\"2025-07-16T07:32:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-2\/\"},\"wordCount\":991,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg\",\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-2\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/\",\"name\":\"Implementing your Strategic Design with Angular and Nx - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg\",\"datePublished\":\"2019-06-30T11:23:29+00:00\",\"dateModified\":\"2025-07-16T07:32:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg\",\"width\":1280,\"height\":745},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implementing your Strategic Design with Angular and Nx\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\",\"name\":\"Manfred Steyer, GDE\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"caption\":\"Manfred Steyer, GDE\"},\"sameAs\":[\"https:\/\/x.com\/daniel\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Implementing your Strategic Design with Angular and Nx - ANGULARarchitects","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/","og_locale":"en_US","og_type":"article","og_title":"Implementing your Strategic Design with Angular and Nx - ANGULARarchitects","og_description":"with Strategic Design and Monorepos - Part 2: Implementation","og_url":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/","og_site_name":"ANGULARarchitects","article_published_time":"2019-06-30T11:23:29+00:00","article_modified_time":"2025-07-16T07:32:39+00:00","og_image":[{"width":1280,"height":745,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg","type":"image\/jpeg"}],"author":"Manfred Steyer, GDE","twitter_card":"summary_large_image","twitter_creator":"@daniel","twitter_misc":{"Written by":"Manfred Steyer, GDE","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-2\/"},"author":{"name":"Manfred Steyer, GDE","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951"},"headline":"Implementing your Strategic Design with Angular and Nx","datePublished":"2019-06-30T11:23:29+00:00","dateModified":"2025-07-16T07:32:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-2\/"},"wordCount":991,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg","inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/sustainable-angular-architectures-2\/","url":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/","name":"Implementing your Strategic Design with Angular and Nx - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg","datePublished":"2019-06-30T11:23:29+00:00","dateModified":"2025-07-16T07:32:39+00:00","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2019\/04\/sustainable-angular-architectures-with-strategic-design-and-monorepos-part-2-implementation.jpg","width":1280,"height":745},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/sustainable-angular-architectures-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Implementing your Strategic Design with Angular and Nx"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951","name":"Manfred Steyer, GDE","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","caption":"Manfred Steyer, GDE"},"sameAs":["https:\/\/x.com\/daniel"]}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/2322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=2322"}],"version-history":[{"count":3,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/2322\/revisions"}],"predecessor-version":[{"id":23886,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/2322\/revisions\/23886"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/3003"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=2322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=2322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=2322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}