{"id":3663,"date":"2021-04-30T17:48:13","date_gmt":"2021-04-30T17:48:13","guid":{"rendered":"https:\/\/ionicframework.com\/blog\/?p=3663"},"modified":"2021-04-30T17:48:23","modified_gmt":"2021-04-30T17:48:23","slug":"ionic-angular-monorepos-with-nx","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx","title":{"rendered":"Ionic Angular monorepos with NX"},"content":{"rendered":"<blockquote><p>\n  This is part two of a <a href=\"https:\/\/ionicframework.com\/blog\/understanding-monorepos\/\">new series on monorepos<\/a>. By the end of the series, you&#8217;ll have the tools you need to adopt monorepo setups in your organization.\n<\/p><\/blockquote>\n<p>Between sharing code, managing dependencies across projects, and more, monorepos can require a lot of investment to get right. Thankfully, there are many different tools out there that can streamline the process and get developers on the right path. There&#8217;s Lerna, Yarn workspaces, npm workspaces (with npm v7),  and the one we\u2019ll look at today, Nx.<\/p>\n<p>Let\u2019s look at setting up an Nx workspace and looking at a few packages that can help Ionic Angular developers manage complex app setups and ship their apps faster.<\/p>\n<p><!--more--><\/p>\n<h2>What is Nx?<\/h2>\n<p><a href=\"https:\/\/nx.dev\">Nx is described as &#8220;extensible dev tools for monorepos&#8221;<\/a> and is created by <a href=\"https:\/\/nrwl.io\">Nrwl<\/a>, a company founded by former Angular team members. The tooling has first-class support for Angular, React, Next.js, and more all within a single workspace. This includes generating both applications and libraries for all of these frameworks. The magic comes from the <a href=\"https:\/\/www.npmjs.com\/package\/nx\">Nx CLI<\/a>. The experience is very similar to the Angular CLI, but with support for far more technologies than just Angular.<\/p>\n<p>Most monorepo tools are designed to retrofit existing applications, but Nx has a different approach to offer the best monorepo experience possible. While it&#8217;s possible to port an existing application or monorepo to an Nx workspace, it&#8217;s best to let the Nx CLI generate the base workspace and application due to how the tooling architects multiple projects in the same repo.<\/p>\n<h3>Single Source of Truth<\/h3>\n<p>Nx strongly enforces the &#8220;single package philosophy&#8221;. This is when all projects in a monorepo workspace share the same version of all dependencies. When dependencies are mismatched across projects, you can run into errors and inconsistencies. Tools like Lerna and Yarn workspaces help with this, but it can still be confusing to developers because each project typically has its own <code>package.json<\/code>. Nx encourages users to add all dependencies to the workspace root <code>package.json<\/code> to easily keep track of dependency versions and upgrades. While this may seem like a departure from what you are used to, the Nx plugin architecture makes this easier to manage.<\/p>\n<h2>Extensible architecture<\/h2>\n<p>While frameworks help provide a structure for building applications, Nx realized that there is no \u201cone size fits all\u201d solution, especially with monorepos. To address this, Nx has its own plugin architecture to automate the configuration and tailor your experience to the tools you use. Nx plugins allow you to focus on getting to the code, not dealing with configuration. The default plugins help you generate Angular and React applications\/libraries in a single workspace, but there are also plugins for Storybook, Cypress, ESLint, and more.<\/p>\n<h2>Common Use Cases<\/h2>\n<p>Okay, so Nx sounds great, but you might be asking, \u201cHow does this benefit me and my Ionic apps?\u201d Some common situations where Nx can help are:<\/p>\n<p>If your organization develops multiple Ionic applications, then you may be implementing very similar components across these apps. Whether it&#8217;s the authentication interface or a similar layout for settings pages, you can benefit from sharing these components across applications. Nx makes it easy to develop shared libraries for React and Angular, and enables you to avoid copying and pasting code. This also unifies your user experiences.<\/p>\n<p>If your applications do not share many UI components, they still benefit from sharing types, interfaces, and other functions. Sharing code can not only improve the developer experience, it can also improve the reliability of applications and avoid bugs.<\/p>\n<p>Nx also supports extending configs for TypeScript, ESLint, Webpack, and more. By creating base configuration files that all applications and libraries extend from, you can enforce agreed-upon best practices across your entire organization. This combined with the advanced CLI tooling and plugins makes building applications at scale more maintainable and consistent.<\/p>\n<h2>Nxtend Plugins<\/h2>\n<p>Building upon the plugin architecture that Nx provides, <a href=\"https:\/\/nxtend.dev\">Nxtend<\/a> is a series of plugins that mostly focus on enabling <a href=\"https:\/\/ionicframework.com\">Ionic<\/a> and <a href=\"https:\/\/capacitorjs.com\">Capacitor<\/a> development in an Nx workspace. These plugins include <code>@nxtend\/ionic-react<\/code>, <code>@nxtend\/ionic-angular<\/code>, <code>@nxtend\/capacitor<\/code>, and more. The main functionality that these plugins provide is the generation of Ionic applications in an Nx workspace that fits the standards of other Nx applications.<\/p>\n<p>While the <a href=\"https:\/\/nxtend.dev\">official documentation<\/a> is the best place to learn how to use the Nxtend plugins, you can begin developing with them with Nx right away. First, you need to start with an Nx workspace. To generate a new workspace from your terminal or command line, execute:<\/p>\n<pre><code class=\"language-shell\">npx create-nx-workspace my-org --preset=empty\n<\/code><\/pre>\n<p>The Nx CLI allows you to generate a new workspace with a React or Angular app pre-configured, but since we are going to add the Nxtend plugins manually, we want to generate our workspace with the <code>--preset=empty<\/code> option.<\/p>\n<h3>Generating Applications<\/h3>\n<p>For this example, we will generate an Ionic Angular application that uses Capacitor. (Generating an Ionic Angular application is very similar, and more information on that can be found on the <a href=\"https:\/\/nxtend.dev\/docs\/ionic-angular\/getting-started\">official documentation<\/a>.)<\/p>\n<p>First, install the Nxtend Ionic Angular dependency to your workspace:<\/p>\n<pre><code class=\"language-shell\">npm install --save-dev @nxtend\/ionic-angular\n<\/code><\/pre>\n<p>From here, initialize the plugin:<\/p>\n<pre><code class=\"language-shell\">nx generate @nxtend\/ionic-angular:init\n<\/code><\/pre>\n<p>Finally, generate a new application:<\/p>\n<pre><code class=\"language-shell\">nx generate @nxtend\/ionic-angular:app my-app\n<\/code><\/pre>\n<p>The CLI will prompt you for the Ionic starter template you would like to use, and once the command is complete, you can begin serving your Ionic app:<\/p>\n<pre><code class=\"language-shell\">nx serve my-app\n<\/code><\/pre>\n<h3>Using Capacitor<\/h3>\n<p>Nxtend Ionic applications are generated with Capacitor support by default. However, before we can use Capacitor, we must build our application:<\/p>\n<pre><code class=\"language-shell\">nx build my-app\n<\/code><\/pre>\n<p>Next, we can add a Capacitor platform like iOS:<\/p>\n<pre><code class=\"language-shell\">nx run my-app:add:ios\n<\/code><\/pre>\n<p>And finally, we can open that app in Xcode:<\/p>\n<pre><code class=\"language-shell\">nx run my-app:open:ios\n<\/code><\/pre>\n<p><a href=\"https:\/\/nxtend.dev\/docs\/capacitor\/getting-started\">Capacitor can also be added to any existing web application in an Nx workspace. Learn more about this on the official documentation<\/a>.<\/p>\n<h3>Shared Libraries<\/h3>\n<p>The Nxtend Ionic Angular plugins are compatible with Nx Angular libraries, meaning that once a library is generated, you can begin creating components in that library and export them from the <code>index.ts<\/code>  to use them in your applications.<\/p>\n<p>To generate a new Angular library, execute:<\/p>\n<pre><code class=\"language-shell\">nx generate @nrwl\/angular:library my-lib\n<\/code><\/pre>\n<p>Next, we can generate a component in the new library:<\/p>\n<pre><code class=\"language-shell\">nx generate @nrwl\/angular:component MyComponent --project my-lib\n<\/code><\/pre>\n<p>Before we can use Ionic components in the new library, we must import the <code>IonicModule<\/code> and export the new component in <code>libs\/my-lib\/src\/lib\/my-lib.module.ts<\/code>:<\/p>\n<pre><code class=\"language-ts\">import { NgModule } from &#039;@angular\/core&#039;;\nimport { CommonModule } from &#039;@angular\/common&#039;;\nimport { MyComponentComponent } from &#039;.\/my-component\/my-component.component&#039;;\nimport { IonicModule } from &#039;@ionic\/angular&#039;;\n\n@NgModule({\n  imports: [CommonModule, IonicModule],\n  declarations: [MyComponentComponent],\n  exports: [MyComponentComponent],\n})\nexport class MyLibModule {}\n<\/code><\/pre>\n<p>Now, we can update the component we generated with Ionic:<\/p>\n<pre><code class=\"language-html\">&lt;ion-header [translucent]=&quot;true&quot;&gt;\n  &lt;ion-toolbar&gt;\n    &lt;ion-title&gt; Blank &lt;\/ion-title&gt;\n  &lt;\/ion-toolbar&gt;\n&lt;\/ion-header&gt;\n\n&lt;ion-content [fullscreen]=&quot;true&quot;&gt;\n  &lt;ion-header collapse=&quot;condense&quot;&gt;\n    &lt;ion-toolbar&gt;\n      &lt;ion-title size=&quot;large&quot;&gt;Blank&lt;\/ion-title&gt;\n    &lt;\/ion-toolbar&gt;\n  &lt;\/ion-header&gt;\n\n  &lt;div id=&quot;container&quot;&gt;\n    &lt;h1&gt;Welcome to my-app!&lt;\/h1&gt;\n    &lt;strong&gt;Ready to create an app?&lt;\/strong&gt;\n    &lt;p&gt;\n      Start with Ionic\n      &lt;a\n        target=&quot;_blank&quot;\n        rel=&quot;noopener noreferrer&quot;\n        href=&quot;https:\/\/ionicframework.com\/docs\/components&quot;\n        &gt;UI Components&lt;\/a\n      &gt;\n    &lt;\/p&gt;\n  &lt;\/div&gt;\n&lt;\/ion-content&gt;\n<\/code><\/pre>\n<p>And finally, import the module in your app:<\/p>\n<pre><code class=\"language-ts\">import { MyLibModule } from &#039;@my-org\/my-lib&#039;;\n<\/code><\/pre>\n<p>And that&#8217;s it! Using this strategy, you can share components, interfaces, utils, and more.<\/p>\n<h2>Wrapping Up<\/h2>\n<p>Nx is an excellent tool for workspaces, and the plugin architecture opens the door for applications and libraries to feel at home in a monorepo. Developing Ionic apps in an Nx workspace can offer many benefits, and the Nxtend suite of plugins is designed to make that a smooth process. Between generating apps, libs, managing dependencies, as well as the ability to share code across projects, Nx benefits projects both large and small.<\/p>\n<ul>\n<li><a href=\"https:\/\/nx.dev\">Nx Dev Tools<\/a><\/li>\n<li><a href=\"https:\/\/nxtend.dev\">Nxtend Plugins<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This is part two of a new series on monorepos. By the end of the series, you&#8217;ll have the tools you need to adopt monorepo setups in your organization. Between sharing code, managing dependencies across projects, and more, monorepos can require a lot of investment to get right. Thankfully, there are many different tools out [&hellip;]<\/p>\n","protected":false},"author":82,"featured_media":3664,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"1","publish_post_category":"27","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"504329","discourse_permalink":"https:\/\/forum.ionicframework.com\/t\/ionic-angular-monorepos-with-nx\/208915","wpdc_publishing_response":"","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[121,124],"tags":[60,206,209],"class_list":["post-3663","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","category-tutorials","tag-angular","tag-monorepos","tag-nx"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ionic Angular monorepos with NX - Ionic Blog<\/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:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ionic Angular monorepos with NX\" \/>\n<meta property=\"og:description\" content=\"This is part two of a new series on monorepos. By the end of the series, you&#8217;ll have the tools you need to adopt monorepo setups in your organization. Between sharing code, managing dependencies across projects, and more, monorepos can require a lot of investment to get right. Thankfully, there are many different tools out [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-30T17:48:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-04-30T17:48:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Devin Shoemaker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:site\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Devin Shoemaker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx\"},\"author\":{\"name\":\"Devin Shoemaker\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/b2d8c50581074df6ed7884974ec62cd0\"},\"headline\":\"Ionic Angular monorepos with NX\",\"datePublished\":\"2021-04-30T17:48:13+00:00\",\"dateModified\":\"2021-04-30T17:48:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx\"},\"wordCount\":1125,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png\",\"keywords\":[\"Angular\",\"Monorepos\",\"NX\"],\"articleSection\":[\"Engineering\",\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx\",\"url\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx\",\"name\":\"Ionic Angular monorepos with NX - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png\",\"datePublished\":\"2021-04-30T17:48:13+00:00\",\"dateModified\":\"2021-04-30T17:48:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png\",\"width\":1600,\"height\":880},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ionic Angular monorepos with NX\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ionic.io\/blog\/#website\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"name\":\"ionic.io\/blog\",\"description\":\"Build amazing native and progressive web apps with the web\",\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ionic.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ionic.io\/blog\/#organization\",\"name\":\"Ionic\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"width\":1920,\"height\":854,\"caption\":\"Ionic\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/ionicframework\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/b2d8c50581074df6ed7884974ec62cd0\",\"name\":\"Devin Shoemaker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/10dcef96efae9da4685672292903ac370773493528f2fc0fac99ab14c503e21e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/10dcef96efae9da4685672292903ac370773493528f2fc0fac99ab14c503e21e?s=96&d=mm&r=g\",\"caption\":\"Devin Shoemaker\"},\"url\":\"https:\/\/ionic.io\/blog\/author\/devin\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ionic Angular monorepos with NX - Ionic Blog","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:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx","og_locale":"en_US","og_type":"article","og_title":"Ionic Angular monorepos with NX","og_description":"This is part two of a new series on monorepos. By the end of the series, you&#8217;ll have the tools you need to adopt monorepo setups in your organization. Between sharing code, managing dependencies across projects, and more, monorepos can require a lot of investment to get right. Thankfully, there are many different tools out [&hellip;]","og_url":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx","og_site_name":"Ionic Blog","article_published_time":"2021-04-30T17:48:13+00:00","article_modified_time":"2021-04-30T17:48:23+00:00","og_image":[{"width":1600,"height":880,"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png","type":"image\/png"}],"author":"Devin Shoemaker","twitter_card":"summary_large_image","twitter_creator":"@ionicframework","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Devin Shoemaker","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx"},"author":{"name":"Devin Shoemaker","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/b2d8c50581074df6ed7884974ec62cd0"},"headline":"Ionic Angular monorepos with NX","datePublished":"2021-04-30T17:48:13+00:00","dateModified":"2021-04-30T17:48:23+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx"},"wordCount":1125,"commentCount":0,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png","keywords":["Angular","Monorepos","NX"],"articleSection":["Engineering","Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx","url":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx","name":"Ionic Angular monorepos with NX - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png","datePublished":"2021-04-30T17:48:13+00:00","dateModified":"2021-04-30T17:48:23+00:00","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png","width":1600,"height":880},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/ionic-angular-monorepos-with-nx#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"Ionic Angular monorepos with NX"}]},{"@type":"WebSite","@id":"https:\/\/ionic.io\/blog\/#website","url":"https:\/\/ionic.io\/blog\/","name":"ionic.io\/blog","description":"Build amazing native and progressive web apps with the web","publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ionic.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ionic.io\/blog\/#organization","name":"Ionic","url":"https:\/\/ionic.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","width":1920,"height":854,"caption":"Ionic"},"image":{"@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/ionicframework"]},{"@type":"Person","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/b2d8c50581074df6ed7884974ec62cd0","name":"Devin Shoemaker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/10dcef96efae9da4685672292903ac370773493528f2fc0fac99ab14c503e21e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/10dcef96efae9da4685672292903ac370773493528f2fc0fac99ab14c503e21e?s=96&d=mm&r=g","caption":"Devin Shoemaker"},"url":"https:\/\/ionic.io\/blog\/author\/devin"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/04\/nx-feature-image.png","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/3663","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/users\/82"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=3663"}],"version-history":[{"count":0,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/3663\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media\/3664"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=3663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=3663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=3663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}