What is @nrwl/devkit?
The @nrwl/devkit package is a set of utilities designed to improve the developer experience by providing tools for building, testing, and managing Angular and React projects within a monorepo setup. It is part of the Nx ecosystem, which focuses on bringing a unified approach to working with modern web technologies.
What are @nrwl/devkit's main functionalities?
Generating Components
This feature allows developers to programmatically generate components or other files within their project. The code sample demonstrates how to use the `generateFiles` function to create a new component in a library within the monorepo.
import { generateFiles } from '@nrwl/devkit';
function generateMyComponent(tree, schema) {
generateFiles(tree, path.join(__dirname, './files'), '/libs/mylib/src/lib', {
tmpl: '',
name: schema.name
});
}
Updating JSON Configuration
This feature provides a straightforward way to update JSON files, such as `tsconfig.json` or `.eslintrc.json`, programmatically. The code sample shows how to modify the `tsconfig.base.json` to add a new path mapping for a library.
import { updateJson } from '@nrwl/devkit';
function updateTsConfig(tree) {
updateJson(tree, 'tsconfig.base.json', (json) => {
json.compilerOptions.paths['@myorg/mylib'] = ['libs/mylib/src/index.ts'];
return json;
});
}
Executing Schematic Tasks
This feature enables developers to execute tasks such as adding project configurations or formatting files. The code sample illustrates how to add a new library configuration to the workspace and then format all files according to the workspace's prettier or eslint configurations.
import { addProjectConfiguration, Tree, formatFiles } from '@nrwl/devkit';
function addMyLib(tree: Tree) {
addProjectConfiguration(tree, 'my-lib', {
root: './libs/my-lib',
projectType: 'library',
targets: {},
});
formatFiles(tree);
}
Other packages similar to @nrwl/devkit
lerna
Lerna is a tool for managing JavaScript projects with multiple packages, similar to the Nx workspace concept. While Lerna focuses on multi-package repositories (monorepos), it does not provide the same level of integration for Angular and React projects or the same developer tools and utilities as @nrwl/devkit.
yeoman-generator
Yeoman is a generic scaffolding system allowing the creation of any kind of app. It provides generators for a wide variety of applications and frameworks. Compared to @nrwl/devkit, Yeoman is more flexible but lacks the specific optimizations and integrations for Angular and React projects within a monorepo setup.
Nx: Smart, Fast and Extensible Build System
Nx is a next generation build system with first class monorepo support and powerful integrations.
This package contains a set of utilities for creating Nx plugins.
Getting Started
Creating an Nx Workspace
Using npx
npx create-nx-workspace
Using npm init
npm init nx-workspace
Using yarn create
yarn create nx-workspace
The create-nx-workspace
command will ask you to select a preset, which will configure some plugins and create your applications to help you get started.
? What to create in the new workspace (Use arrow keys)
❯ apps [an empty workspace with no plugins with a layout that works best for building apps]
core [an empty workspace with no plugins set up to publish npm packages (similar to yarn workspaces)]
ts [an empty workspace with the JS/TS plugin preinstalled]
react [a workspace with a single React application]
angular [a workspace with a single Angular application]
next.js [a workspace with a single Next.js application]
nest [a workspace with a single Nest application]
express [a workspace with a single Express application]
web components [a workspace with a single app built using web components]
react-native [a workspace with a single React Native application]
react-express [a workspace with a full stack application (React + Express)]
Select the preset that works best for you
Adding Nx to an Existing Monorepo
Run:
npx add-nx-to-monorepo@latest
Documentation & Resources
A few links to help you get started: