docs(core): nx 20 changelog (#28270)

- Add a changelog for Nx 20.0.0
- Demo the composite graph view in `Explore Your Workspace`
This commit is contained in:
Isaac Mann 2024-10-03 16:57:27 -04:00 committed by GitHub
parent 414f5c011d
commit d131b0b677
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 153 additions and 6 deletions

18
docs/changelog/20_0_0.md Normal file
View File

@ -0,0 +1,18 @@
# Nx 20
## Features
{% cards cols="2" %}
{% card title="Composite Graph" type="document" url="/features/explore-graph" /%}
{% card title="New repositories can use TypeScript project references instead of path aliases" type="document" url="/nx-api/js" /%}
{% card title="Rspack plugin graduates from labs" type="document" url="/nx-api/rspack" /%}
{% /cards %}
## Breaking Changes
{% cards cols="2" %}
{% card title="Generators use `as-provided`" type="document" url="/deprecated/as-provided-vs-derived" /%}
{% card title="Storybook generators use Storybook Component tests instead of Cypress tests" type="document" url="/recipes/storybook/storybook-interaction-tests" /%}
{% card title="@nrwl/* packages are no longer published" type="document" url="/deprecated/rescope" /%}
{% card title="Nx Release programatic API changes" type="external" url="https://github.com/nrwl/nx/pull/28224" /%}
{% /cards %}

View File

@ -65,18 +65,23 @@ Click on a node to show a tooltip which also has a link to view more details abo
You can trace the dependency chain between two projects by choosing a **Start** and **End** point in the project tooltips. You can trace the dependency chain between two projects by choosing a **Start** and **End** point in the project tooltips.
Click on any dependency line to find which file(s) created the dependency. Click on any dependency line to find which file(s) created the dependency.
Composite nodes represent a set of projects in the same folder and can be expanded in place to show all the individual projects and their dependencies. You can also "focus" a composite node to render a graph of just the projects inside that node. Composite nodes are essential to navigate a graph of even a moderate size.
Try playing around with a [fully interactive graph on a sample repo](https://nrwl-nx-examples-dep-graph.netlify.app/?focus=cart) or look at the more limited example below: Try playing around with a [fully interactive graph on a sample repo](https://nrwl-nx-examples-dep-graph.netlify.app/?focus=cart) or look at the more limited example below:
{% graph height="450px" %} {% side-by-side %}
{% graph height="450px" title="Project View" %}
```json ```json
{ {
"hash": "58420bb4002bb9b6914bdeb7808c77a591a089fc82aaee11e656d73b2735e3fa", "composite": false,
"projects": [ "projects": [
{ {
"name": "shared-product-state", "name": "shared-product-state",
"type": "lib", "type": "lib",
"data": { "data": {
"root": "shared/product-state",
"tags": ["scope:shared", "type:state"] "tags": ["scope:shared", "type:state"]
} }
}, },
@ -84,6 +89,7 @@ Try playing around with a [fully interactive graph on a sample repo](https://nrw
"name": "shared-product-types", "name": "shared-product-types",
"type": "lib", "type": "lib",
"data": { "data": {
"root": "shared/product-types",
"tags": ["type:types", "scope:shared"] "tags": ["type:types", "scope:shared"]
} }
}, },
@ -91,6 +97,7 @@ Try playing around with a [fully interactive graph on a sample repo](https://nrw
"name": "shared-product-data", "name": "shared-product-data",
"type": "lib", "type": "lib",
"data": { "data": {
"root": "shared/product-data",
"tags": ["type:data", "scope:shared"] "tags": ["type:data", "scope:shared"]
} }
}, },
@ -98,6 +105,7 @@ Try playing around with a [fully interactive graph on a sample repo](https://nrw
"name": "cart-cart-page", "name": "cart-cart-page",
"type": "lib", "type": "lib",
"data": { "data": {
"root": "cart/cart-page",
"tags": ["scope:cart", "type:feature"] "tags": ["scope:cart", "type:feature"]
} }
}, },
@ -105,13 +113,15 @@ Try playing around with a [fully interactive graph on a sample repo](https://nrw
"name": "shared-styles", "name": "shared-styles",
"type": "lib", "type": "lib",
"data": { "data": {
"root": "shared/styles",
"tags": ["scope:shared", "type:styles"] "tags": ["scope:shared", "type:styles"]
} }
}, },
{ {
"name": "cart-e2e", "name": "e2e-cart",
"type": "e2e", "type": "e2e",
"data": { "data": {
"root": "e2e/cart",
"tags": ["scope:cart", "type:e2e"] "tags": ["scope:cart", "type:e2e"]
} }
}, },
@ -119,6 +129,7 @@ Try playing around with a [fully interactive graph on a sample repo](https://nrw
"name": "cart", "name": "cart",
"type": "app", "type": "app",
"data": { "data": {
"root": "cart",
"tags": ["type:app", "scope:cart"] "tags": ["type:app", "scope:cart"]
} }
} }
@ -153,8 +164,8 @@ Try playing around with a [fully interactive graph on a sample repo](https://nrw
} }
], ],
"shared-styles": [], "shared-styles": [],
"cart-e2e": [ "e2e-cart": [
{ "source": "cart-e2e", "target": "cart", "type": "implicit" } { "source": "e2e-cart", "target": "cart", "type": "implicit" }
], ],
"cart": [ "cart": [
{ "source": "cart", "target": "shared-styles", "type": "implicit" }, { "source": "cart", "target": "shared-styles", "type": "implicit" },
@ -169,12 +180,129 @@ Try playing around with a [fully interactive graph on a sample repo](https://nrw
"focus": null, "focus": null,
"groupByFolder": false, "groupByFolder": false,
"exclude": [], "exclude": [],
"enableTooltips": true "enableTooltips": false
} }
``` ```
{% /graph %} {% /graph %}
{% graph height="450px" title="Composite View (Nx 20+)" %}
```json
{
"composite": true,
"projects": [
{
"name": "shared-product-state",
"type": "lib",
"data": {
"root": "shared/product-state",
"tags": ["scope:shared", "type:state"]
}
},
{
"name": "shared-product-types",
"type": "lib",
"data": {
"root": "shared/product-types",
"tags": ["type:types", "scope:shared"]
}
},
{
"name": "shared-product-data",
"type": "lib",
"data": {
"root": "shared/product-data",
"tags": ["type:data", "scope:shared"]
}
},
{
"name": "cart-cart-page",
"type": "lib",
"data": {
"root": "cart/cart-page",
"tags": ["scope:cart", "type:feature"]
}
},
{
"name": "shared-styles",
"type": "lib",
"data": {
"root": "shared/styles",
"tags": ["scope:shared", "type:styles"]
}
},
{
"name": "e2e-cart",
"type": "e2e",
"data": {
"root": "e2e/cart",
"tags": ["scope:cart", "type:e2e"]
}
},
{
"name": "cart",
"type": "app",
"data": {
"root": "cart/cart",
"tags": ["type:app", "scope:cart"]
}
}
],
"dependencies": {
"shared-product-state": [
{
"source": "shared-product-state",
"target": "shared-product-data",
"type": "static"
},
{
"source": "shared-product-state",
"target": "shared-product-types",
"type": "static"
}
],
"shared-product-types": [],
"shared-product-data": [
{
"source": "shared-product-data",
"target": "shared-product-types",
"type": "static"
}
],
"shared-e2e-utils": [],
"cart-cart-page": [
{
"source": "cart-cart-page",
"target": "shared-product-state",
"type": "static"
}
],
"shared-styles": [],
"e2e-cart": [
{ "source": "e2e-cart", "target": "cart", "type": "implicit" }
],
"cart": [
{ "source": "cart", "target": "shared-styles", "type": "implicit" },
{ "source": "cart", "target": "cart-cart-page", "type": "static" }
]
},
"workspaceLayout": {
"appsDir": "apps",
"libsDir": "libs"
},
"affectedProjectIds": [],
"focus": null,
"groupByFolder": false,
"exclude": [],
"enableTooltips": false
}
```
{% /graph %}
{% /side-by-side %}
### Export Project Graph to JSON ### Export Project Graph to JSON
If you prefer to analyze the underlying data of the project graph with a script or some other tool, you can run: If you prefer to analyze the underlying data of the project graph with a script or some other tool, you can run:

View File

@ -103,6 +103,7 @@ export function Graph({
groupByFolder={false} groupByFolder={false}
theme={theme} theme={theme}
projects={parsedProps.projects} projects={parsedProps.projects}
composite={parsedProps.composite}
fileMap={{}} fileMap={{}}
workspaceLayout={parsedProps.workspaceLayout} workspaceLayout={parsedProps.workspaceLayout}
dependencies={parsedProps.dependencies} dependencies={parsedProps.dependencies}