sidebar_position | sidebar_label |
---|---|
2 |
Monorepo |
📔 What is it - Choosing the right Monorepo tool and features for the boilerplate
⏰ Status - Open for discussions
📁 Corresponding discussion - Here
🎯Bottom-line: our recommendation - TBD
📊 Detailed comparison table
*For some lacking features there is a community package that bridges the gap; For workspace, we evaluated whether most of them support a specific feature
****Community and maintenance | Huge eco-system and commercial-grade maintenance |
Trending, commercial-grade maintenance |
Not maintained anymore |
Solid |
|||||
❗Encourage component autonomy | Packages are highly coupled |
Workflow is coupled |
npm link bypasses the SemVer |
Minor concern: shared NODE_MODULES on the root |
|||||
Build speed | Smart inference and execution plan, shared dependencies, cache |
Smart inference and execution plan, shared dependencies, cache |
Parallel tasks execution, copied dependencies |
Shared dependencies |
|||||
Standardization | Non standard Node.js stuff: One single root package.json by default, TS-paths for linking |
An external build layer |
An external build layer |
An external package centralizer |
|||||
Run recursive commands (affect a group of packages) | Yes |
Yes |
Yes |
Yes |
|||||
❗️Parallel task execution | Yes |
Yes |
No |
Yes* (Yarn & Pnpm) |
|||||
❗️Realize which packages changed | Yes |
Yes |
Yes |
No |
|||||
❗️Realize packages that are affected by a change | Yes both through package.json and code |
Yes through package.json |
None |
None |
|||||
Ignore missing commands/scripts | No |
Yes |
Yes |
Yes |
|||||
❗️In-project cache - Skip tasks if local result exists | Yes |
Yes |
No |
No |
|||||
Remote cache - Skip tasks if remote result exists | Yes |
Yes |
No |
No |
|||||
Visual dependency graph | Yes |
Yes |
Partially, via plugin |
No |
|||||
❗️Smart waterfall pipeline - Schedule unrelated tasks in parallel, not topologically | Yes |
Yes |
No |
No |
|||||
Distributed task execution - Spread tasks across machines | Yes |
No |
No |
No |
|||||
❗️Is supported | Partially Achieved through TS paths |
No Relies on workspaces |
Yes |
Yes |
|||||
How | ❗️Via TypeScript paths and webpack |
Relies on workspaces |
Symlink |
Symlink |
|||||
❗️Can opt-out? | Yes By default local packages are linked |
- | No | Partially Pnpm allows preferring remote packages, Yarn has a [focused package](https://classic.yarnpkg.com/blog/2018/05/18/focused-workspaces/) option which only works per a single package |
|||||
Link a range - only specific versions will be symlinked | No | - | No | Some Yarn and Pnpm allows workspace versioning |
|||||
Supported | Yes Via a single Root package.json and NODE_MODULES |
Yes Via caching |
No Can be used on top of yarn workspace |
Yes Via single node_modules folder |
|||||
Retain origin file path (some module refers to relative paths) | Partially NODE_MODULES is on the root, not per package |
Yes | Not relevant | Partially Pnpm uses hard link instead of symlinks |
|||||
Keep single NODE_MODULES per machine (faster, less disc space) | No |
No | No | Partially Pnpm supports this |
|||||
Community plugins | Yes |
No |
Yes |
Yes |
|||||
Scaffold new component from a gallery | Yes |
None |
None |
None |
Create a new package to the repo | Built it code genreation with useful templates |
None, 3rd party code generator can be used |
None, 3rd party code generator can be used |
None, 3rd party code generator can be used |
Adapt changes in the monorepo tool | Supported via nx migrate |
Supported via codemod |
None |
None |
|||||
Incremental builds | Supported |
Supported |
None |
None |
|||||
Cross-package modifications | Supported via nx generate |
None |
None |
None |
__
Ideas for next iteration:
- Separate command execution and pipeline section
- Stars and popularity
- Features summary
- Polyrepo support