<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edouard Bozon</title>
    <description>The latest articles on DEV Community by Edouard Bozon (@edbzn).</description>
    <link>https://dev.to/edbzn</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30484%2Fd62146c9-a30a-4b64-82e9-cab4aafb1890.jpg</url>
      <title>DEV Community: Edouard Bozon</title>
      <link>https://dev.to/edbzn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edbzn"/>
    <language>en</language>
    <item>
      <title>Nx 20: Exploring the new TS preset and TypeScript project references</title>
      <dc:creator>Edouard Bozon</dc:creator>
      <pubDate>Sat, 23 Nov 2024 10:57:51 +0000</pubDate>
      <link>https://dev.to/edbzn/nx-20-exploring-the-new-ts-preset-and-typescript-project-references-31hl</link>
      <guid>https://dev.to/edbzn/nx-20-exploring-the-new-ts-preset-and-typescript-project-references-31hl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: 📌&lt;/strong&gt; &lt;br&gt; Originally published on &lt;a href="https://edbzn.dev/nx-20-exploring-the-new-ts-preset-and-typescript-project-references/" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nx 20 introduces a new &lt;a href="https://nx.dev/nx-api/js/documents/typescript-project-references#create-a-new-nx-workspace-using-project-references" rel="noopener noreferrer"&gt;TS preset&lt;/a&gt;, allowing developers to generate workspaces that leverage TypeScript project references. Given the promising claims, the confusion in the community, and the lack of literature on it, I decided to explore the feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are project references?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/project-references.html" rel="noopener noreferrer"&gt;Project references&lt;/a&gt; were introduced in &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-3-0/#project-references" rel="noopener noreferrer"&gt;TypeScript 3.0&lt;/a&gt; back in 2018. This feature allows you to &lt;em&gt;split the code into smaller units and define explicit relationships between them&lt;/em&gt;. It ensures that only the changed units and their dependencies are recompiled, resulting in faster builds, improved code isolation, and a better IDE experience. This feature is well-suited for defining projects in a monorepo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: 📌&lt;/strong&gt; &lt;br&gt; Project references are theoretically a better alternative to globally defined path aliases in the root &lt;code&gt;tsconfig.base.json&lt;/code&gt; configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to leverage project references in Nx?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Generating a new workspace with project references
&lt;/h3&gt;

&lt;p&gt;Nx 20 provides a new &lt;code&gt;ts&lt;/code&gt; preset that leverages project references. Here's how to create a new workspace with this setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a workspace with the &lt;code&gt;ts&lt;/code&gt; preset:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-nx-workspace @org &lt;span class="nt"&gt;--preset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command creates a new workspace using the &lt;code&gt;ts&lt;/code&gt; preset, which configures the project to use TypeScript project references. For all available options, see the &lt;a href="https://nx.dev/nx-api/nx/documents/create-nx-workspace" rel="noopener noreferrer"&gt;&lt;code&gt;create-nx-workspace&lt;/code&gt; documentation&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate libraries with the &lt;code&gt;tsc&lt;/code&gt; bundler:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx g @nx/js:lib packages/my-lib &lt;span class="nt"&gt;--bundler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tsc
nx g @nx/js:lib packages/my-shared-lib &lt;span class="nt"&gt;--bundler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tsc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands the generator to create two libraries within the &lt;code&gt;packages&lt;/code&gt; directory. The &lt;code&gt;--bundler=tsc&lt;/code&gt; flag specifies using the TypeScript compiler (&lt;code&gt;tsc&lt;/code&gt;) for building these libraries.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Declare project dependencies:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;packages/my-lib/package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@org/my-shared-lib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, you explicitly declare dependencies in your &lt;code&gt;package.json&lt;/code&gt; files. This tells Nx which projects your library relies on. Nx uses this information to manage project references.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update TypeScript references:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While project references offer benefits, manually maintaining them in &lt;code&gt;tsconfig&lt;/code&gt; files can be cumbersome. Nx provides the &lt;code&gt;nx sync&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command automatically updates TypeScript references based on the project dependencies declared in &lt;code&gt;package.json&lt;/code&gt; files. It ensures your project references are always in sync.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5t304ibgnrqwkp3fvy0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5t304ibgnrqwkp3fvy0.png" alt="nx sync" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: 📌&lt;/strong&gt; &lt;br&gt; Nx uses the standard &lt;code&gt;"workspaces": ["packages/*"]&lt;/code&gt; property in the root &lt;code&gt;package.json&lt;/code&gt; to analyze dependencies and sync references.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Build the library:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With everything configured, you can build your library using the standard Nx command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nx build @org/my-lib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;build&lt;/code&gt; target leverages TypeScript project references to only recompile the necessary parts of your codebase, resulting in faster builds (&lt;a href="https://www.loom.com/share/7c3ad6a27a6b48d0b652cec248f51bbd" rel="noopener noreferrer"&gt;up to 3 times&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwk8y8vwhu9phiewd1nlc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwk8y8vwhu9phiewd1nlc.png" alt="Build output" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Demo repository
&lt;/h4&gt;

&lt;p&gt;📂 Here's a demo repository that shows all the differences between the traditional integrated repository generated using the &lt;strong&gt;apps&lt;/strong&gt; preset and the &lt;strong&gt;ts&lt;/strong&gt; preset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/edbzn/nx-preset-ts" rel="noopener noreferrer"&gt;edbzn/nx-preset-ts&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/edbzn/nx-preset-ts/compare/main...preset-apps?expand=1" rel="noopener noreferrer"&gt;edbzn/nx-preset-ts/compare&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migrating existing workspaces
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Migrating to TypeScript project references is, unfortunately, a challenging process.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The traditional path aliases approach used in integrated workspaces is incompatible with project references. Since these configurations cannot coexist, &lt;strong&gt;migration requires a complete refactoring&lt;/strong&gt;, leaving no option for incremental updates.&lt;/p&gt;

&lt;p&gt;Additionally, most Nx plugins (Angular, React, Vue, Node) are not yet compatible with project references. Migration is thus feasible only for small, package-based, framework-agnostic monorepos—a minority of real-world scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're still determined to proceed, a manual approach is necessary:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a new workspace:&lt;/strong&gt; Start with a new workspace configured using the &lt;code&gt;ts&lt;/code&gt; preset (see the previous section).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate libraries:&lt;/strong&gt; Generate a few libraries to establish the desired structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare and apply configurations:&lt;/strong&gt; Compare the new workspace's setup with your existing one, applying necessary changes in one single refactoring.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning: ⚠️&lt;/strong&gt; &lt;br&gt;  This process involves a big bang approach that is uncertain, risky, and time-consuming.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Clarifying confusing points
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nx incremental builds vs. TypeScript incremental builds
&lt;/h3&gt;

&lt;p&gt;While both Nx and TypeScript offer incremental build capabilities, it's important to distinguish between them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript incremental builds&lt;/strong&gt;: Focuses on the fine-grained level of individual files and modules. It leverages project references to identify dependencies and recompile only the affected parts of your codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nx incremental builds&lt;/strong&gt;: Takes a broader perspective, considering the entire monorepo. Nx analyzes the project graph to determine which parts of the codebase are impacted by a change, optimizing the build process at the project level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both Nx and TypeScript incrementally recompile only the necessary parts of your code. However, &lt;em&gt;Nx operates at a higher level&lt;/em&gt;, offering more features like remote caching (&lt;a href="https://nx.dev/ci/features/remote-cache" rel="noopener noreferrer"&gt;Nx Replay&lt;/a&gt;), distributed tasks execution (&lt;a href="https://nx.dev/ci/features/distribute-task-execution#distribute-task-execution-nx-agents" rel="noopener noreferrer"&gt;Nx Agents&lt;/a&gt;), and first-class integration with your CI provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Package-based repos, integrated repos, and the &lt;code&gt;ts&lt;/code&gt; preset
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: 📌&lt;/strong&gt; &lt;br&gt; As of Nx 20, the distinction between integrated and package-based repositories is less relevant. Nx features can be enabled independently, offering flexibility in configuring your monorepo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package-based repos:&lt;/strong&gt; Traditional approach for monorepos where each package is an independent project with its own &lt;code&gt;package.json&lt;/code&gt; and nested &lt;code&gt;node_modules&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrated repositories:&lt;/strong&gt; Nx's original approach, where dependencies are shared between projects at the root level in &lt;code&gt;tsconfig.base.json&lt;/code&gt; using path aliases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ts&lt;/code&gt; preset:&lt;/strong&gt; This new approach leverages TypeScript's project references along with individual &lt;code&gt;package.json&lt;/code&gt; to declare dependencies between projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;ts&lt;/code&gt; preset aims to become the standard approach for new Nx projects, eventually replacing the integrated setup. &lt;strong&gt;While it offers significant advantages, it's still in its early stages&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview of the &lt;code&gt;ts&lt;/code&gt; preset and TypeScript project references
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Faster builds and type-checking&lt;/strong&gt; 
Only changed projects and their dependencies are recompiled, not the entire repository. This is particularly beneficial for large monorepos.&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Improved IDE experience&lt;/strong&gt; 
TypeScript's Language Server Protocol (LSP) benefits from faster type-checking and autocomplete, along with more accurate Go-To-Definition via &lt;a href="https://www.typescriptlang.org/tsconfig/#declarationMap" rel="noopener noreferrer"&gt;&lt;code&gt;declarationMap&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Enforced project boundaries&lt;/strong&gt; 
Imports from arbitrary projects are disallowed unless explicitly referenced, ensuring stricter code organization.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Current limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🛑 &lt;strong&gt;No migration path for existing workspaces&lt;/strong&gt; 
Existing Nx workspaces using path aliases cannot be easily migrated to project references. This requires starting with a new workspace.&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Manual dependency configuration&lt;/strong&gt; 
Dependencies between projects must be explicitly declared in &lt;code&gt;package.json&lt;/code&gt; files for Nx to sync references correctly.&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Complex setup with overhead&lt;/strong&gt; 
This setup is not the default in Nx and is considerably more complex than configuring path aliases.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Lack of framework support&lt;/strong&gt; 
Most plugins, including Angular, React, Vue, and Node, aren't supported at the moment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ecosystem support
&lt;/h3&gt;

&lt;p&gt;The table summarizes ecosystem support for TypeScript project references.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Webpack&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/TypeStrong/ts-loader/blob/main/REFERENCES.md" rel="noopener noreferrer"&gt;ts-loader&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🟢 Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rspack&lt;/td&gt;
&lt;td&gt;&lt;a href="https://rspack.dev/config/resolve.html#resolvetsconfigreferences" rel="noopener noreferrer"&gt;Rspack Documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🟢 Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollup&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ezolenko/rollup-plugin-typescript2" rel="noopener noreferrer"&gt;rollup-plugin-typescript2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🟢 Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue&lt;/td&gt;
&lt;td&gt;&lt;a href="https://vuejs.org/guide/typescript/overview#configuring-tsconfig-json" rel="noopener noreferrer"&gt;Vue Documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🟢 Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ESBuild&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/evanw/esbuild/issues/1250" rel="noopener noreferrer"&gt;GitHub Issue&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🔴 No support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWC&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/swc-project/swc/discussions/2156" rel="noopener noreferrer"&gt;GitHub Discussion&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🔴 No support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/angular/angular/issues/37276" rel="noopener noreferrer"&gt;GitHub Issue&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🔴 No support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A promising future for large TypeScript monorepos
&lt;/h2&gt;

&lt;p&gt;Nx 20's introduction of the &lt;code&gt;ts&lt;/code&gt; preset and TypeScript project references marking a promising step toward scalable and efficient TypeScript code management. By leveraging these features, you can achieve faster build times, improve DX, and enhance code organization.&lt;/p&gt;

&lt;p&gt;While the &lt;code&gt;ts&lt;/code&gt; preset offers numerous benefits, &lt;strong&gt;it's essential to consider the current limitations&lt;/strong&gt;. The lack of migration paths for existing workspaces, limited framework support, and the configuration overhead limit the adoption for most projects.&lt;/p&gt;

&lt;p&gt;However, the potential for future improvements make it a promising approach for large-scale monorepos. As the Nx team works on supporting TypeScript better (&lt;a href="https://github.com/nrwl/nx/discussions/28731" rel="noopener noreferrer"&gt;see Nx 2025 roadmap&lt;/a&gt;), we can expect progress in this area.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/project-references.html" rel="noopener noreferrer"&gt;TypeScript Docs - Project References&lt;/a&gt;&lt;/strong&gt; by TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nx.dev/blog/announcing-nx-20#typescript-project-references-for-monorepos" rel="noopener noreferrer"&gt;Nx Docs - Configure TypeScript Project References in an Nx Workspace&lt;/a&gt;&lt;/strong&gt; by Nx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nx.dev/blog/announcing-nx-20#typescript-project-references-for-monorepos" rel="noopener noreferrer"&gt;Announcing Nx 20 - TypeScript Project References For Monorepos&lt;/a&gt;&lt;/strong&gt; by Nx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.loom.com/share/7c3ad6a27a6b48d0b652cec248f51bbd" rel="noopener noreferrer"&gt;Benchmarking TS Project Reference Changes 📊&lt;/a&gt;&lt;/strong&gt; by Jack Hsu&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://shopify.engineering/migrating-large-typescript-codebases-project-references" rel="noopener noreferrer"&gt;Migrating Large TypeScript Codebases To Project References&lt;/a&gt;&lt;/strong&gt; by Shopify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://blog.logrocket.com/boost-your-productivity-with-typescript-project-references/" rel="noopener noreferrer"&gt;Boost your productivity with TypeScript project references&lt;/a&gt;&lt;/strong&gt; by LogRocket&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/ixahmedxi/typescript-monorepo-demo" rel="noopener noreferrer"&gt;ixahmedxi/typescript-monorepo-demo&lt;/a&gt;&lt;/strong&gt; by Ahmed Elsakaan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RRsttfhg1sA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>nx</category>
      <category>typescript</category>
      <category>monorepo</category>
    </item>
  </channel>
</rss>
