nx/nx-dev/nx-dev/pages/tips.tsx
Isaac Mann 471536cb38
docs(core): remove integrated docs (#28228)
- Move the integrated vs. package-based concept page to the deprecated
section
- Remove the integrated project in package-based repo recipe
- Remove the package-based project in integrated repo recipe
- Rename standalone to integrated recipe
- Update references to integrated or package-based terms in tutorials
2024-10-01 23:22:11 -04:00

518 lines
16 KiB
TypeScript

import {
FlipCard,
FlipCardBack,
Footer,
Header,
YouTube,
} from '@nx/nx-dev/ui-common';
import { NextSeo } from 'next-seo';
import Link from 'next/link';
import { useRouter } from 'next/router';
import { frameworkIcons } from '@nx/graph/ui-icons';
import { ReactNode, useEffect, useState } from 'react';
interface NewYearTip {
day: number;
cardBack: ReactNode;
fullDate: string;
}
const tips: NewYearTip[] = [
{
day: 8,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">What is Nx?</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 8th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://www.youtube.com/watch?v=-_4WMl-Fn0w"
title="Soo...what is Nx?"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
Are you just getting started with Nx? Or do you need a succinct way of
explaining Nx to your colleagues?
</p>
<p className="my-4">
Read more in our{' '}
<Link
href="/getting-started/intro"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Intro to Nx
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 8th',
},
{
day: 9,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">
Which Style of Workspace is Right for You?
</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 9th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://www.youtube.com/watch?v=ArmERpNvC8Y"
title="Package based vs Integrated Style - Use Nx however it works best for you"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
Nx can provide benefits no matter how your repository is organized. It
helps to have terms to describe different kinds of repositories.
</p>
<p className="my-4">
Read more in our{' '}
<Link
href="/deprecated/integrated-vs-package-based"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Types of Repos Guide
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 9th',
},
{
day: 10,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">What is Nx Cloud?</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 10th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://www.youtube.com/watch?v=NZF0ZJpgaJM"
title="What is Nx Cloud?"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
Nx does not just enable you to manage your repo even as it scales to a
large monorepo - it also makes your CI fast. With features like remote
caching, distributed task execution,{' '}
<Link
href="/ci/features/distribute-task-execution"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Nx Agents
</Link>
, and auto-splitting E2E tests, your CI times can be dramatically
reduced without a large maintenance burden on you.
</p>
<p className="my-4">
Read more about how to set up{' '}
<Link
href="/ci/intro/ci-with-nx"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
CI with Nx
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 10th',
},
{
day: 11,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">Add Nx to an Existing Project</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 11th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://youtu.be/VmGCZ77ao_I"
title="Add Nx to Any Project"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
Nx can be incrementally adopted in any project. A single{' '}
<code>npx nx init</code> command will get you started.
</p>
<p className="my-4">
Read more about how to{' '}
<Link
href="/recipes/adopting-nx/adding-to-existing-project"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Add Nx to an Existing Project
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 11th',
},
{
day: 12,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">Micro Frontends with Nx</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 12th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://www.youtube.com/watch?v=dotA6ZSmNL4"
title="Superpowered Micro Frontends with Monorepos"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
Micro Frontends allow you to deploy different sections of a web
application independently. Nx helps you to set them up in a structured
way.
</p>
<p className="my-4">
Read more about how to set up{' '}
<Link
href="/concepts/module-federation/micro-frontend-architecture"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Micro Frontends with Nx
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 12th',
},
{
day: 15,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">Explore Example Repos</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 15th
</p>
<p className="my-4">
Nx can work with any technology stack and we have created examples for
many of them.
</p>
<div className="flex items-center justify-center">
<Link
href="/getting-started/tutorials/react-standalone-tutorial"
className="m-4 w-20"
prefetch={false}
>
{frameworkIcons.react.image}
</Link>
<Link
href="/getting-started/tutorials/angular-standalone-tutorial"
className="m-4 w-20"
prefetch={false}
>
{frameworkIcons.angular.image}
</Link>
<Link
href="/getting-started/tutorials/vue-standalone-tutorial"
className="m-4 w-20"
prefetch={false}
>
{frameworkIcons.vue.image}
</Link>
</div>
<p className="my-4">
Read more about using{' '}
<Link
href="/showcase/example-repos"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Nx with your Favorite Tech
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 15th',
},
{
day: 16,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">Let's Build a CLI</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 16th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://youtu.be/ocllb5KEXZk"
title="Build Your Own CLI"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
If you maintain a framework, open source library, or starter repo, you
can use Nx to allow your users to quickly create a new repo and keep
their existing repo up to date with the changes that you make.
</p>
<p className="my-4">
Read more about how to use Nx to{' '}
<Link
href="/extending-nx/recipes/create-install-package"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Build Your Own CLI
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 16th',
},
{
day: 17,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">
Nx Agents: The Next Leap in Distributed Task Execution
</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 17th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://youtu.be/XLOUFZeqRpM"
title="Victor FIXES Your CI with Nx"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
With Nx Agents, you allow Nx Cloud to manage your agent machines in CI
for you. Along with that convenience, Nx Agents also offer dynamic
scaling, automatic task splitting and flaky task re-running.
</p>
<p className="my-4">
Currently in private beta, Nx Agents are slated for public release in
February 2024. Don't miss the opportunity to be among the first to
experience this groundbreaking tool.{' '}
<Link
href="https://go.nx.dev/nx-agents-ea"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Sign up now for early access.
</Link>
</p>
<p className="my-4">
Read more about the upcoming{' '}
<Link
href="/ci/features/distribute-task-execution"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Nx Agents
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 17th',
},
{
day: 18,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">Graduating to a Monorepo</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 18th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://www.youtube.com/watch?v=ztNpLf2Zl-c"
title="Graduating Your Standalone Nx Repo To A Monorepo"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
If you start an Nx repo with a single standalone app, you can easily
convert it into a monorepo when you are ready to add more apps to the
repo.
</p>
<p className="my-4">
Read more about using Nx to{' '}
<Link
href="/recipes/tips-n-tricks/standalone-to-monorepo"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
convert a standalone app repo to a monorepo
</Link>
.
</p>
</FlipCardBack>
),
fullDate: 'January 18th',
},
{
day: 19,
cardBack: (
<FlipCardBack>
<h3 className="text-xl font-semibold">Keep Your Tooling Up to Date</h3>
<p className="pt-1 text-sm text-blue-500 dark:text-sky-500">
January 19th
</p>
<div className="mx-auto my-4 max-w-3xl">
<YouTube
src="https://youtu.be/Ss6MfcXi0jE"
title="Run Code Migrations to Update your Codebase"
caption=""
width="100%"
></YouTube>
</div>
<p className="my-4">
Nx allows you to keep your tooling versions and configuration files up
to date - even after breaking changes. You can think of it as{' '}
<Link
href="https://blog.nrwl.io/evergreen-tooling-more-than-just-codemods-fc68f32ce605"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Evergreen Tooling
</Link>
.
</p>
<p className="my-4">
Read more about using Nx to{' '}
<Link
href="/features/automate-updating-dependencies"
className="text-slate-900 underline dark:text-slate-100"
prefetch={false}
>
Automate Updating Dependencies
</Link>
</p>
</FlipCardBack>
),
fullDate: 'January 19th',
},
];
export default function NewYear(): JSX.Element {
const currentDay =
new Date().getFullYear() === 2024 ? new Date().getDate() : 0;
const currentTipIndex = tips.filter((tip) => tip.day <= currentDay).length;
const shownTips = tips.slice(0, currentTipIndex + 1);
const router = useRouter();
const [cards, setCards] = useState({});
useEffect(() => {
const cards = JSON.parse(localStorage.getItem('cards') || '{}');
if (cards) {
setCards(cards);
}
}, []);
useEffect(() => {
localStorage.setItem('cards', JSON.stringify(cards));
}, [cards]);
const onFlip = (text, isFlipped) => {
setCards({ ...cards, [text]: isFlipped });
};
function getIsFlippable(day: number) {
return currentDay >= day;
}
return (
<>
<NextSeo
title="Nx New Year Tips"
description="Start off the new year with these tips on how to make the most of Nx."
openGraph={{
url: 'https://nx.dev' + router.asPath,
title: 'Nx New Year Tips',
description:
'Start off the new year with these tips on how to make the most of Nx.',
images: [
{
url: 'https://nx.dev/socials/nx-media.png',
width: 800,
height: 421,
alt: 'Nx: Smart, Fast and Extensible Build System',
type: 'image/jpeg',
},
],
siteName: 'NxDev',
type: 'website',
}}
/>
<Header />
<main id="main" role="main">
<div className="w-full bg-slate-50 py-10 dark:bg-slate-800/40 dark:text-slate-300">
<div
id="new-year"
className="py-18 mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"
>
<article id="nx-new-year-tips-intro" className="relative">
<h1 className="my-8 text-3xl font-semibold sm:text-5xl dark:text-white">
Nx New Year Tips
</h1>
<p>
Start 2024 off right with some tips to help you get the most out
of Nx. Each day, a new card will be unlocked for you to flip.
You can{' '}
<a
className="text-slate-900 underline dark:text-slate-100"
href="https://share.hsforms.com/1cShEClnQRIuu5w-1cLalZw1n3n7"
>
sign up to receive an email
</a>{' '}
each day as new tips are released.
</p>
</article>
</div>
</div>
<div className="w-full bg-gradient-to-r from-cyan-500 to-blue-500 dark:from-cyan-800 dark:to-blue-800">
<div
id="new-year"
className="py-18 mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"
>
<article id="nx-new-year-tips" className="relative">
<div className="mx-auto grid grid-cols-1 items-stretch gap-8 py-12 sm:grid-cols-2 md:grid-cols-3 lg:py-16 dark:text-slate-100">
{shownTips.map((tip) => (
<FlipCard
key={tip.day}
isFlippable={getIsFlippable(tip.day)}
onFlip={onFlip}
isFlipped={cards[tip.day]}
day={tip.day}
fullDate={tip.fullDate}
>
{tip.cardBack}
</FlipCard>
))}
</div>
</article>
</div>
</div>
</main>
<Footer />
</>
);
}