From 3cc17d7566b8ba1d10445c5329fbf2b7d97a7abf Mon Sep 17 00:00:00 2001 From: Benjamin Cabanes <3447705+bcabanes@users.noreply.github.com> Date: Fri, 12 Nov 2021 11:59:45 -0500 Subject: [PATCH] docs(nxdev): home updates (#7567) --- docs/shared/mental-model.md | 123 +- docs/shared/mental-model/dte.png | Bin 0 -> 32138 bytes nx-dev/nx-dev/pages/angular.tsx | 8 +- nx-dev/nx-dev/pages/index.tsx | 658 ++----- nx-dev/nx-dev/pages/node.tsx | 8 +- nx-dev/nx-dev/pages/react.tsx | 8 +- .../latest/shared/mental-model.md | 123 +- .../latest/shared/mental-model/dte.png | Bin 0 -> 32138 bytes .../images/background/hero-bg-large-2.svg | 14 + .../images/background/hero-bg-large-3.svg | 14 + .../images/background/hero-bg-large.svg | 6 +- .../public/images/background/hero-bg.svg | 6 +- .../nx-dev/public/images/conf/brainlylogo.svg | 4 +- .../nx-dev/public/images/conf/briebuglogo.svg | 7 +- .../nx-dev/public/images/conf/ioniclogo.svg | 4 +- .../nx-dev/public/images/conf/webrushlogo.svg | 4 +- nx-dev/nx-dev/public/images/github-app.webp | Bin 0 -> 118416 bytes nx-dev/nx-dev/public/images/lerna-logo.svg | 1 + .../nx-dev/public/images/nrwlio-channel.webp | Bin 0 -> 91434 bytes .../public/images/nx-affected-dep-graph.webp | Bin 0 -> 31042 bytes nx-dev/nx-dev/public/images/nx-affected.webp | Bin 0 -> 50118 bytes nx-dev/nx-dev/public/images/nx-cloud.webp | Bin 0 -> 71656 bytes nx-dev/nx-dev/public/images/nx-console.webp | Bin 0 -> 67082 bytes nx-dev/nx-dev/public/images/nx-dep-graph.webp | Bin 0 -> 261236 bytes .../public/images/nx-egghead-course.webp | Bin 0 -> 71712 bytes nx-dev/nx-dev/public/images/nx-playbook.webp | Bin 0 -> 77376 bytes nx-dev/nx-dev/public/videos/nx-dep-graph.mp4 | Bin 0 -> 2894211 bytes nx-dev/nx-dev/public/videos/nx-dep-graph.webm | Bin 0 -> 446826 bytes nx-dev/nx-dev/specs/index.spec.tsx | 3 +- nx-dev/nx-dev/styles/main.css | 22 + nx-dev/nx-dev/tailwind.config.js | 9 +- nx-dev/ui-commands/.babelrc | 12 + nx-dev/ui-commands/.eslintrc.json | 18 + nx-dev/ui-commands/README.md | 7 + nx-dev/ui-commands/jest.config.js | 9 + nx-dev/ui-commands/project.json | 23 + nx-dev/ui-commands/src/index.ts | 1 + .../src/lib/inline-command.spec.tsx | 0 .../src/lib/inline-command.tsx | 4 +- nx-dev/ui-commands/tsconfig.json | 23 + nx-dev/ui-commands/tsconfig.lib.json | 13 + nx-dev/ui-commands/tsconfig.spec.json | 15 + nx-dev/ui-home/.babelrc | 12 + nx-dev/ui-home/.eslintrc.json | 18 + nx-dev/ui-home/README.md | 7 + nx-dev/ui-home/jest.config.js | 9 + nx-dev/ui-home/project.json | 23 + nx-dev/ui-home/src/index.ts | 14 + .../ui-home/src/lib/affected-command.spec.tsx | 11 + nx-dev/ui-home/src/lib/affected-command.tsx | 159 ++ nx-dev/ui-home/src/lib/cloud-support.spec.tsx | 11 + nx-dev/ui-home/src/lib/cloud-support.tsx | 118 ++ .../ui-home/src/lib/dependency-graph.spec.tsx | 11 + nx-dev/ui-home/src/lib/dependency-graph.tsx | 104 ++ .../src/lib/ecosystem-features.spec.tsx | 11 + nx-dev/ui-home/src/lib/ecosystem-features.tsx | 261 +++ .../ui-home/src/lib/egghead-courses.spec.tsx | 11 + nx-dev/ui-home/src/lib/egghead-courses.tsx | 67 + .../src/lib/experience-features.spec.tsx | 11 + .../ui-home/src/lib/experience-features.tsx | 256 +++ .../ui-home/src/lib/getting-started.spec.tsx | 11 + nx-dev/ui-home/src/lib/getting-started.tsx | 1007 +++++++++++ .../src/lib/monorepo-features.spec.tsx | 11 + nx-dev/ui-home/src/lib/monorepo-features.tsx | 268 +++ nx-dev/ui-home/src/lib/nx-playbook.spec.tsx | 12 + nx-dev/ui-home/src/lib/nx-playbook.tsx | 69 + nx-dev/ui-home/src/lib/open-platform.spec.tsx | 11 + nx-dev/ui-home/src/lib/open-platform.tsx | 146 ++ .../src/lib/open-source-projects.spec.tsx | 11 + .../ui-home/src/lib/open-source-projects.tsx | 328 ++++ nx-dev/ui-home/src/lib/performance.spec.tsx | 11 + nx-dev/ui-home/src/lib/performance.tsx | 157 ++ nx-dev/ui-home/src/lib/vscode-plugin.spec.tsx | 11 + nx-dev/ui-home/src/lib/vscode-plugin.tsx | 105 ++ .../ui-home/src/lib/youtube-channel.spec.tsx | 12 + nx-dev/ui-home/src/lib/youtube-channel.tsx | 68 + nx-dev/ui-home/tsconfig.json | 23 + nx-dev/ui-home/tsconfig.lib.json | 14 + nx-dev/ui-home/tsconfig.spec.json | 15 + nx-dev/ui/common/src/index.ts | 3 +- nx-dev/ui/common/src/lib/footer.tsx | 408 +++-- .../src/lib/npx-create-nx-workspace.spec.tsx | 11 + .../src/lib/npx-create-nx-workspace.tsx | 568 ++++++ .../ui/common/src/lib/nx-users-showcase.tsx | 1527 +++++++++++------ nx-dev/ui/common/src/lib/testimonials.tsx | 112 ++ package.json | 6 +- tsconfig.base.json | 2 + workspace.json | 2 + yarn.lock | 90 +- 89 files changed, 6052 insertions(+), 1228 deletions(-) create mode 100644 docs/shared/mental-model/dte.png create mode 100644 nx-dev/nx-dev/public/documentation/latest/shared/mental-model/dte.png create mode 100644 nx-dev/nx-dev/public/images/background/hero-bg-large-2.svg create mode 100644 nx-dev/nx-dev/public/images/background/hero-bg-large-3.svg create mode 100644 nx-dev/nx-dev/public/images/github-app.webp create mode 100644 nx-dev/nx-dev/public/images/lerna-logo.svg create mode 100644 nx-dev/nx-dev/public/images/nrwlio-channel.webp create mode 100644 nx-dev/nx-dev/public/images/nx-affected-dep-graph.webp create mode 100644 nx-dev/nx-dev/public/images/nx-affected.webp create mode 100644 nx-dev/nx-dev/public/images/nx-cloud.webp create mode 100644 nx-dev/nx-dev/public/images/nx-console.webp create mode 100644 nx-dev/nx-dev/public/images/nx-dep-graph.webp create mode 100644 nx-dev/nx-dev/public/images/nx-egghead-course.webp create mode 100644 nx-dev/nx-dev/public/images/nx-playbook.webp create mode 100644 nx-dev/nx-dev/public/videos/nx-dep-graph.mp4 create mode 100644 nx-dev/nx-dev/public/videos/nx-dep-graph.webm create mode 100644 nx-dev/ui-commands/.babelrc create mode 100644 nx-dev/ui-commands/.eslintrc.json create mode 100644 nx-dev/ui-commands/README.md create mode 100644 nx-dev/ui-commands/jest.config.js create mode 100644 nx-dev/ui-commands/project.json create mode 100644 nx-dev/ui-commands/src/index.ts rename nx-dev/{ui/common => ui-commands}/src/lib/inline-command.spec.tsx (100%) rename nx-dev/{ui/common => ui-commands}/src/lib/inline-command.tsx (86%) create mode 100644 nx-dev/ui-commands/tsconfig.json create mode 100644 nx-dev/ui-commands/tsconfig.lib.json create mode 100644 nx-dev/ui-commands/tsconfig.spec.json create mode 100644 nx-dev/ui-home/.babelrc create mode 100644 nx-dev/ui-home/.eslintrc.json create mode 100644 nx-dev/ui-home/README.md create mode 100644 nx-dev/ui-home/jest.config.js create mode 100644 nx-dev/ui-home/project.json create mode 100644 nx-dev/ui-home/src/index.ts create mode 100644 nx-dev/ui-home/src/lib/affected-command.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/affected-command.tsx create mode 100644 nx-dev/ui-home/src/lib/cloud-support.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/cloud-support.tsx create mode 100644 nx-dev/ui-home/src/lib/dependency-graph.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/dependency-graph.tsx create mode 100644 nx-dev/ui-home/src/lib/ecosystem-features.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/ecosystem-features.tsx create mode 100644 nx-dev/ui-home/src/lib/egghead-courses.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/egghead-courses.tsx create mode 100644 nx-dev/ui-home/src/lib/experience-features.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/experience-features.tsx create mode 100644 nx-dev/ui-home/src/lib/getting-started.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/getting-started.tsx create mode 100644 nx-dev/ui-home/src/lib/monorepo-features.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/monorepo-features.tsx create mode 100644 nx-dev/ui-home/src/lib/nx-playbook.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/nx-playbook.tsx create mode 100644 nx-dev/ui-home/src/lib/open-platform.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/open-platform.tsx create mode 100644 nx-dev/ui-home/src/lib/open-source-projects.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/open-source-projects.tsx create mode 100644 nx-dev/ui-home/src/lib/performance.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/performance.tsx create mode 100644 nx-dev/ui-home/src/lib/vscode-plugin.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/vscode-plugin.tsx create mode 100644 nx-dev/ui-home/src/lib/youtube-channel.spec.tsx create mode 100644 nx-dev/ui-home/src/lib/youtube-channel.tsx create mode 100644 nx-dev/ui-home/tsconfig.json create mode 100644 nx-dev/ui-home/tsconfig.lib.json create mode 100644 nx-dev/ui-home/tsconfig.spec.json create mode 100644 nx-dev/ui/common/src/lib/npx-create-nx-workspace.spec.tsx create mode 100644 nx-dev/ui/common/src/lib/npx-create-nx-workspace.tsx create mode 100644 nx-dev/ui/common/src/lib/testimonials.tsx diff --git a/docs/shared/mental-model.md b/docs/shared/mental-model.md index cf724fc814..fecc6fa3e6 100644 --- a/docs/shared/mental-model.md +++ b/docs/shared/mental-model.md @@ -1,14 +1,20 @@ # Mental Model -Nx is a VSCode of build tools, with a powerful core, driven by metadata, and extensible through plugins. Nx works with a few concepts to drive your monorepo efficiently, and effectively. This guide covers the mental model around how Nx works with project graphs, task graphs, affected commands, computation hashing and caching. +Nx is a VSCode of build tools, with a powerful core, driven by metadata, and extensible through plugins. Nx works with a +few concepts to drive your monorepo efficiently, and effectively. This guide covers the mental model around how Nx works +with project graphs, task graphs, affected commands, computation hashing and caching. ## The project graph -A project graph is used to reflect the source code in your repository and all the external dependencies that aren’t authored in your repository, such as Webpack, React, Angular, and so forth. +A project graph is used to reflect the source code in your repository and all the external dependencies that aren’t +authored in your repository, such as Webpack, React, Angular, and so forth. ![project-graph](/shared/mental-model/project-graph.png) -With Nx, nodes in the project graph are defined in `workspace.json`. You can manually define dependencies between the nodes, but you don’t have to do it very often. Nx analyzes files’ source code, your installed dependencies, TypeScript files, and others figuring out these dependencies for you. Nx also stores the cached project graph, so it only reanalyzes the files you have changed. +With Nx, nodes in the project graph are defined in `workspace.json`. You can manually define dependencies between the +nodes, but you don’t have to do it very often. Nx analyzes files’ source code, your installed dependencies, TypeScript +files, and others figuring out these dependencies for you. Nx also stores the cached project graph, so it only +reanalyzes the files you have changed. ![project-graph-updated](/shared/mental-model/project-graph-updated.png) @@ -16,7 +22,8 @@ Nx provides an updated graph after each analysis is done. ## Metadata-driven -Everything in Nx comes with metadata to enable toolability. The default values, validations, autocompletion work, and more are all defined in a schema, instead of in code. +Everything in Nx comes with metadata to enable toolability. The default values, validations, autocompletion work, and +more are all defined in a schema, instead of in code. The following sample schema shows inputs, prompts, and validations for adding a new application. @@ -52,7 +59,10 @@ The following sample schema shows inputs, prompts, and validations for adding a "message": "Which stylesheet format would you like to use?", "type": "list", "items": [ - { "value": "css", "label": "CSS" }, + { + "value": "css", + "label": "CSS" + }, { "value": "scss", "label": "SASS(.scss) [ http://sass-lang.com ]" @@ -116,7 +126,8 @@ The following sample schema shows inputs, prompts, and validations for adding a } ``` -This metadata is used by Nx itself, by VSCode and WebStorm integrations, by GitHub integration, and by third-party tools. +This metadata is used by Nx itself, by VSCode and WebStorm integrations, by GitHub integration, and by third-party +tools. ![metadata](/shared/mental-model/metadata.png) @@ -124,7 +135,8 @@ These tools are able to implement richer experiences with Nx using this metadata ## The task graph -Nx uses the project graph to create a task graph. Any time you run anything, Nx creates a task graph from the project graph and then executes the tasks in that graph. +Nx uses the project graph to create a task graph. Any time you run anything, Nx creates a task graph from the project +graph and then executes the tasks in that graph. For instance `nx test lib` creates a task graph with a single node: @@ -132,11 +144,14 @@ For instance `nx test lib` creates a task graph with a single node: A task is an invocation of a target. If you invoke the same target twice, you create two tasks. -Nx uses the [project graph](#the-project-graph), but the task graph and project graph aren’t isomorphic, meaning they aren’t directly connected. In the case above, app1 and app2 depend on lib, but running `nx run-many --target=test --projects=app1,app2,lib`, the created task graph will look like this: +Nx uses the [project graph](#the-project-graph), but the task graph and project graph aren’t isomorphic, meaning they +aren’t directly connected. In the case above, app1 and app2 depend on lib, but +running `nx run-many --target=test --projects=app1,app2,lib`, the created task graph will look like this: ![task-graph-creation](/shared/mental-model/task-graph-creation.png) -Even though the apps depend on lib, testing `app1` doesn’t depend on the testing lib. This means that the two tasks can run in parallel. +Even though the apps depend on lib, testing `app1` doesn’t depend on the testing lib. This means that the two tasks can +run in parallel. Let’s look at the test target relying on its dependencies. @@ -145,7 +160,12 @@ Let’s look at the test target relying on its dependencies. "test": { "executor": "@nrwl/jest:jest", "outputs": ["coverage/apps/app1"], - "dependsOn": [{ "target": "test", "projects": "dependencies" }], + "dependsOn": [ + { + "target": "test", + "projects": "dependencies" + } + ], "options": { "jestConfig": "apps/app1/jest.config.js", "passWithNoTests": true @@ -158,35 +178,46 @@ With this, running the same test command creates the following task graph: ![task-graph-run](/shared/mental-model/task-graph-run.png) -This often makes more sense for builds, where to build app1, you want to build lib first. You can also define similar relationships between targets of the same project, including a test target that depends on the build. +This often makes more sense for builds, where to build app1, you want to build lib first. You can also define similar +relationships between targets of the same project, including a test target that depends on the build. -A task graph can contain different targets, and those can run in parallel. For instance, as Nx is building `app2`, it can be testing `app1` at the same time. Learn more about configuring targets in the [configuration guide](/{{framework}}/core-concepts/configuration) +A task graph can contain different targets, and those can run in parallel. For instance, as Nx is building `app2`, it +can be testing `app1` at the same time. Learn more about configuring targets in +the [configuration guide](/{{framework}}/core-concepts/configuration) ![task-graph-execution](/shared/mental-model/task-graph-execution.png) -Nx also runs the tasks in the task graph in the right order. Nx executing tasks being executed speeds up your overall execution time. +Nx also runs the tasks in the task graph in the right order. Nx executing tasks being executed speeds up your overall +execution time. ## Affected commands When you run `nx test app1`, you are telling Nx to run the app1:test task plus all the tasks it depends on. -When you run `nx run-many --target=test --projects=app1,lib`, you are telling Nx to do the same for two tasks app1:test and lib:test. +When you run `nx run-many --target=test --projects=app1,lib`, you are telling Nx to do the same for two tasks app1:test +and lib:test. When you run `nx run-many --target=test --all`, you are telling Nx to do this for all the projects. -As your workspace grows, retesting all projects becomes too slow. To address this Nx implements code change analysis to get the min set of projects that need to be retested. How does it work? +As your workspace grows, retesting all projects becomes too slow. To address this Nx implements code change analysis to +get the min set of projects that need to be retested. How does it work? -When you run `nx affected --target=test`, Nx looks at the files you changed in your PR, it will look at the nature of change (what exactly did you update in those files), and it uses this to figure the list of projects in the workspace that can be affected by this change. It then runs the `run-many` command with that list. +When you run `nx affected --target=test`, Nx looks at the files you changed in your PR, it will look at the nature of +change (what exactly did you update in those files), and it uses this to figure the list of projects in the workspace +that can be affected by this change. It then runs the `run-many` command with that list. -For instance, if my PR changes `lib`, and I then run `nx affected --target=test`, Nx figures out that `app1` and `app2` depend on `lib`, so it will invoke `nx run-many --target=test --projects=app1,app2,lib`. +For instance, if my PR changes `lib`, and I then run `nx affected --target=test`, Nx figures out that `app1` and `app2` +depend on `lib`, so it will invoke `nx run-many --target=test --projects=app1,app2,lib`. ![affected](/shared/mental-model/affected.png) -Nx analyzes the nature of the changes. For example, if you change the version of Next.js in the package.json, Nx knows that `app2` cannot be affected by it, so it only retests `app1`. +Nx analyzes the nature of the changes. For example, if you change the version of Next.js in the package.json, Nx knows +that `app2` cannot be affected by it, so it only retests `app1`. ## Computation hashing and caching -Nx runs the tasks in the task graph in the right order. Before running the task, Nx computes its computation hash. As long as the computation hash is the same, the output of running the task is the same. +Nx runs the tasks in the task graph in the right order. Before running the task, Nx computes its computation hash. As +long as the computation hash is the same, the output of running the task is the same. How does Nx do it? @@ -200,36 +231,70 @@ By default, the computation hash for say `nx test app1` includes: ![computation-hashing](/shared/mental-model/computation-hashing.png) -This behavior is customizable. For instance, lint checks may only depend on the source code of the project and global configs. Builds can depend on the dts files of the compiled libs instead of their source. +This behavior is customizable. For instance, lint checks may only depend on the source code of the project and global +configs. Builds can depend on the dts files of the compiled libs instead of their source. -After Nx computes the hash for a task, it then checks if it ran this exact computation before. First, it checks locally, and then if it is missing, and if a remote cache is configured, it checks remotely. +After Nx computes the hash for a task, it then checks if it ran this exact computation before. First, it checks locally, +and then if it is missing, and if a remote cache is configured, it checks remotely. -If Nx finds the computation, Nx retrieves it and replay it. Nx places the right files in the right folders and prints the terminal output. So from the user’s point of view, the command ran the same, just a lot faster. +If Nx finds the computation, Nx retrieves it and replay it. Nx places the right files in the right folders and prints +the terminal output. So from the user’s point of view, the command ran the same, just a lot faster. ![cache](/shared/mental-model/cache.png) -If Nx doesn’t find this computation, Nx runs the task, and after it completes, it takes the outputs and the terminal output and stores it locally (and if configured remotely). All of this happens transparently, so you don’t have to worry about it. +If Nx doesn’t find this computation, Nx runs the task, and after it completes, it takes the outputs and the terminal +output and stores it locally (and if configured remotely). All of this happens transparently, so you don’t have to worry +about it. -Although conceptually this is fairly straightforward, Nx optimizes this to make this experience good for you. For instance, Nx: +Although conceptually this is fairly straightforward, Nx optimizes this to make this experience good for you. For +instance, Nx: - Captures stdout and stderr to make sure the replayed output looks the same, including on Windows. - Minimizes the IO by remembering what files are replayed where. - Only shows relevant output when processing a large task graph. -- Provides affordances for troubleshooting cache misses. - And many other optimizations. +- Provides affordances for troubleshooting cache misses. And many other optimizations. As your workspace grows, the task graph looks more like this: ![cache](/shared/mental-model/task-graph-big.png) -All of these optimizations are crucial for making Nx usable for any non-trivial workspace. Only the minimum amount of work happens. The rest is either left as is or restored from the cache. +All of these optimizations are crucial for making Nx usable for any non-trivial workspace. Only the minimum amount of +work happens. The rest is either left as is or restored from the cache. -In summary: +## Distributed task execution + +Nx supports running commands across multiple machines. You can either set it up by hand ( +see [here](/ci/distributed-builds)) or use Nx +CLoud. [Read the comparison of the two approaches.](https://blog.nrwl.io/distributing-ci-binning-and-distributed-task-execution-632fe31a8953?source=friends_link&sk=5120b7ff982730854ed22becfe7a640a) + +Nx Cloud is a cloud companion for Nx (which is free and MIT-licensed). Most features of Nx Cloud are free, but some are +paid. One of them is the distributed computation cache, which allows you to share cache with your team members and CI +agents. + +Another one is config-free distributed task execution (DTE). When using the distributed task execution, Nx is able to +run any task graph on a many agents instead of locally. + +When using this, `nx affected --build`, won't run the build locally (which for large workspace can take hours). Instead, +it will send the Task Graph to Nx Cloud. Nx Cloud Agents will then pick up the task they can run and execute them. + +Note this happens transparently. If an agent builds `app1`, it will fetch the outputs for `lib` if it doesn't have it +already. + +As agents complete tasks, the main job where you invoked `nx affected --build` will start receiving created files and +terminal outputs. + +After `nx affected --build` completes, the machine will have the build files and all the terminal outputs as if it ran +it locally. + +![DTE](/shared/mental-model/dte.png) + +## In summary - Nx is able to analyze your source code to create a Project Graph. - Nx can use the project graph and information about projects’ targets to create a Task Graph. - Nx is able to perform code-change analysis to create the smallest task graph for your PR. -- Nx supports computation caching to never execute the same computation twice. This computation cache is pluggable and can be distributed. +- Nx supports computation caching to never execute the same computation twice. This computation cache is pluggable and + can be distributed. ## Learn more: diff --git a/docs/shared/mental-model/dte.png b/docs/shared/mental-model/dte.png new file mode 100644 index 0000000000000000000000000000000000000000..eec3627e7f6c21bd33cc9113024e18b17f5e7346 GIT binary patch literal 32138 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 Wt*Ydbf;Wr?$}2Hh(I3LP-v0p@RDmM^ literal 0 HcmV?d00001 diff --git a/nx-dev/nx-dev/pages/angular.tsx b/nx-dev/nx-dev/pages/angular.tsx index aa2898cd83..8163a0db85 100644 --- a/nx-dev/nx-dev/pages/angular.tsx +++ b/nx-dev/nx-dev/pages/angular.tsx @@ -3,14 +3,10 @@ import { useRouter } from 'next/router'; import Image from 'next/image'; import Link from 'next/link'; import Head from 'next/head'; -import { - Footer, - Header, - InlineCommand, - NxUsersShowcase, -} from '@nrwl/nx-dev/ui/common'; +import { Footer, Header, NxUsersShowcase } from '@nrwl/nx-dev/ui/common'; import { sendCustomEvent } from '@nrwl/nx-dev/feature-analytics'; import { useStorage } from '@nrwl/nx-dev/feature-storage'; +import { InlineCommand } from '@nrwl/nx-dev/ui-commands'; export function AngularPage() { const router = useRouter(); diff --git a/nx-dev/nx-dev/pages/index.tsx b/nx-dev/nx-dev/pages/index.tsx index 375a2ba0ba..ab27063df1 100644 --- a/nx-dev/nx-dev/pages/index.tsx +++ b/nx-dev/nx-dev/pages/index.tsx @@ -1,16 +1,32 @@ import React from 'react'; import { useRouter } from 'next/router'; -import Image from 'next/image'; import Link from 'next/link'; import Head from 'next/head'; import { Footer, Header, - InlineCommand, + NpxCreateNxWorkspace, NxUsersShowcase, - FeatureList, + Testimonials, } from '@nrwl/nx-dev/ui/common'; import { sendCustomEvent } from '@nrwl/nx-dev/feature-analytics'; +import { + AffectedCommand, + CloudSupport, + DependencyGraph, + EcosystemFeatures, + EggheadCourses, + ExperienceFeatures, + GettingStarted, + MonorepoFeatures, + NxPlaybook, + OpenPlatform, + OpenSourceProjects, + Performance, + VscodePlugin, + YoutubeChannel, +} from '@nrwl/nx-dev/ui-home'; +import { InlineCommand } from '@nrwl/nx-dev/ui-commands'; export function Index() { const router = useRouter(); @@ -60,16 +76,17 @@ export function Index() { {/*INTRO COMPONENT*/}
-
-
+
+
-

- Smart, Extensible Build Framework +

+ Smart, Extensible{' '} + Build Framework

Nx helps architect, test, and build at any scale: @@ -82,12 +99,18 @@ export function Index() {

-