In this recipe, we'll show you how to create a Remix application with Nx.
Create Nx Workspace
Section titled “Create Nx Workspace”NX Let's create a new workspace [https://nx.dev/getting-started/intro]
✔ Which CI provider would you like to use? · skip✔ Would you like remote caching to make your build faster? · skip
Install Nx Remix Plugin
Section titled “Install Nx Remix Plugin”nx add @nx/remix
Generate a Remix Application
Section titled “Generate a Remix Application”NX Generating @nx/remix:application
✔ What unit test runner should be used? · vitest✔ Which E2E test runner would you like to use? · playwright
UPDATE package.jsonUPDATE nx.jsonCREATE apps/myapp/project.jsonCREATE apps/myapp/README.mdCREATE apps/myapp/app/nx-welcome.tsxCREATE apps/myapp/app/root.tsxCREATE apps/myapp/app/routes/_index.tsxCREATE apps/myapp/public/favicon.icoCREATE apps/myapp/remix.config.jsCREATE apps/myapp/remix.env.d.tsCREATE apps/myapp/tests/routes/_index.spec.tsxCREATE apps/myapp/tsconfig.app.jsonCREATE apps/myapp/tsconfig.jsonCREATE apps/myapp/.gitignoreCREATE apps/myapp/package.jsonCREATE apps/myapp/tsconfig.spec.jsonCREATE apps/myapp/vitest.config.tsCREATE apps/myapp/test-setup.tsCREATE apps/myapp/.eslintrc.jsonCREATE apps/myapp/.eslintignoreCREATE apps/myapp-e2e/project.jsonCREATE apps/myapp-e2e/src/example.spec.tsCREATE apps/myapp-e2e/playwright.config.tsCREATE apps/myapp-e2e/tsconfig.jsonCREATE apps/myapp-e2e/.eslintrc.json
Build, Serve and Test your Application
Section titled “Build, Serve and Test your Application”- To build your application run:
> nx run myapp:build
Building Remix app in production mode...
Built in 857ms
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
NX Successfully ran target build for project myapp (3s)
- To serve your application for use during development run:
> nx run myapp:dev
💿 Building...💿 Rebuilt in 377msRemix App Server started at http://localhost:3000 (http://192.168.0.14:3000)
- To test the application using vitest run:
> nx run myapp:test
RUN v0.31.4 /Users/columferry/dev/nrwl/issues/remixguide/acme/apps/myappstderr | app/routes/index.spec.ts > test > should renderWarning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.✓ app/routes/index.spec.ts (1 test) 10msTest Files 1 passed (1) Tests 1 passed (1)Start at 16:15:45Duration 1.20s (transform 51ms, setup 139ms, collect 180ms, tests 10ms, environment 379ms, prepare 103ms)
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
NX Successfully ran target test for project myapp (2s)
Generating an Nx Library
Section titled “Generating an Nx Library”When developing your application, it often makes sense to split your codebase into smaller more focused libraries.
To generate a library to use in your Remix application run:
NX Generating @nx/remix:library
✔ What test runner should be used? · vitestUPDATE nx.jsonUPDATE package.jsonCREATE babel.config.jsonCREATE libs/login/project.jsonCREATE libs/login/.eslintrc.jsonCREATE libs/login/README.mdCREATE libs/login/src/index.tsCREATE libs/login/tsconfig.lib.jsonCREATE libs/login/tsconfig.jsonCREATE libs/login/vite.config.tsCREATE libs/login/tsconfig.spec.jsonCREATE libs/login/src/lib/login.module.cssCREATE libs/login/src/lib/login.spec.tsxCREATE libs/login/src/lib/login.tsxUPDATE tsconfig.base.jsonCREATE libs/login/src/test-setup.tsCREATE libs/login/src/server.ts
You can then use the library by importing one of the exports into your application:
apps/myapp/app/routes/index.tsx
import { Login } from '@acme/login';
export default function Index() { return ( <div> <Login /> </div> );}
You can also run test on your library:
nx test login
Generating a Route
Section titled “Generating a Route”To generate a route for your application:
NX Generating @nx/remix:route
CREATE apps/myapp/app/routes/admin.tsxCREATE apps/myapp/app/styles/admin.css
Using a loader from your Library
Section titled “Using a loader from your Library”To use a Route Loader where the logic lives in your library, follow the steps below.
- Generate a loader for your route:
NX Generating @nx/remix:loader
UPDATE apps/myapp/app/routes/admin.tsx
- Add a new file in your
login
lib
libs/login/src/lib/admin/admin.loader.ts
import { json, LoaderFunctionArgs } from '@remix-run/node';
export const adminLoader = async ({ request }: LoaderFunctionArgs) => { return json({ message: 'Hello, world!', });};
Export the function from the libs/login/src/server.ts
file:
export * from './lib/admin/admin.loader';
- Use the loader in your
apps/myapp/app/routes/admin.tsx
Replace the default loader code:
export const loader = async ({ request }: LoaderFunctionArgs) => { return json({ message: 'Hello, world!', });};
with
import { adminLoader } from '@acme/login/server';
export const loader = adminLoader;
GitHub Repository with Example
Section titled “GitHub Repository with Example”You can see an example of an Nx Workspace using Remix by clicking below.
Example repository/nrwl/nx-recipes/tree/main/remix