Libraries should be grouped by scope. A library's scope is either application to which it belongs or (for larger applications) a section within that application.
Don't be too anxious about choosing the exact right folder structure from the beginning. Libraries can be moved or renamed using the
For instance, if a library under the
booking folder is now being shared by multiple apps, you can move it to the shared folder like this:
nx g move --project booking-some-library shared/some-library
For Angular projects, you should use the
@nx/angular:move generator instead.
Similarly, if you no longer need a library, you can remove it with the
nx g remove booking-some-library
Let's use Nrwl Airlines as an example organization. This organization has two apps,
check-in. In the Nx workspace, libraries related to
booking are grouped under a
libs/booking folder, libraries related to
check-in are grouped under a
libs/check-in folder and libraries used in both applications are placed in
libs/shared. You can also have nested grouping folders, (i.e.
The purpose of these folders is to help with organizing by scope. We recommend grouping libraries together which are (usually) updated together. It helps minimize the amount of time a developer spends navigating the folder tree to find the right file.
1apps/ 2 booking/ 3 check-in/ 4libs/ 5 booking/ <---- grouping folder 6 feature-shell/ <---- library 7 8 check-in/ 9 feature-shell/ 10 11 shared/ <---- grouping folder 12 data-access/ <---- library 13 14 seatmap/ <---- grouping folder 15 data-access/ <---- library 16 feature-seatmap/ <---- library 17
One of the main advantages of using a monorepo is that there is more visibility into code that can be reused across many different applications. Shared libraries are a great way to save developers time and effort by reusing a solution to a common problem.
Let’s consider our reference monorepo. The
shared-data-access library contains the code needed to communicate with the back-end (for example, the URL prefix). We know that this would be the same for all libs; therefore, we should place this in the shared lib and properly document it so that all projects can use it instead of writing their own versions.
1 libs/ 2 booking/ 3 data-access/ <---- app-specific library 4 5 shared/ 6 data-access/ <---- shared library 7 8 seatmap/ 9 data-access/ <---- shared library 10 feature-seatmap/ <---- shared library 11