Introduction
- Structure of This Book
- Trainings and Consultancy
- Help to Improve this Book!
- Thanks
Strategic Domain-Driven Design
- What is Domain-Driven Design?
- Finding Domains with Strategic Design
- Domains are Modelled Separately
- Context-Mapping
- Sub Domains vs. Bounded Contexts
- Team Topologies and Strategic Design
- Conclusion
Architectures with Sheriff and Standalone Components
- The Architecture Matrix
- Project Structure for the Architecture Matrix
- Enforcing your Architecture with Sheriff
- Lightweight Path Mappings
- Conclusion
Build Performance with Nx
- Incremental Builds – Getting Started
- More comfortable and more powerful: Nx
- Incremental Builds with Nx
- Side Note: Micro Frontends
- Distributed Cache with Nx Cloud
- Even Faster: Parallelization with Nx Cloud
- Conclusion
Nx & Sheriff - Friends for Life
- Module Boundaries in Nx
- Recap: Different Types of Boundaries
- Options with Sheriff
- Conclusion
From Domains to Micro Frontends
- Deployment Monoliths
- Micro Frontends
- UI Composition with Hyperlinks
- UI Composition with a Shell
- The Hero: Module Federation
- Finding a Solution
- Consequences of Micro Frontends
- Conclusion
The Micro Frontend Revolution: Using Module Federation with Angular
- Example
- Activating Module Federation for Angular Projects
- The Shell (aka Host)
- The Micro Frontend (aka Remote)
- Trying it out
- A Further Detail
- More Details: Sharing Dependencies
- Conclusion and Evaluation
Dynamic Module Federation
- A Simple Dynamic Solution
- Going “Dynamic Dynamic”
- Some More Details
- Conclusion
Plugin Systems with Module Federation: Building An Extensible Workflow Designer
- Building the Plugins
- Loading the Plugins into the Workflow Designer
- Providing Metadata on the Plugins
- Dynamically Creating the Plugin Component
- Wiring Up Everything
- Conclusion
Using Module Federation with Nx Monorepos and Angular
- Multiple Repos vs. Monorepos
- Multiple Repositories: Micro Frontends by the Book
- Micro Frontends with Monorepos
- Monorepo Example
- The Shared Lib
- The Module Federation Configuration
- Trying it out
- Isolating Micro Frontends
- Incremental Builds
- Deploying
- Conclusion
Dealing with Version Mismatches in Module Federation
- Example Used Here
- Semantic Versioning by Default
- Fallback Modules for Incompatible Versions
- Differences With Dynamic Module Federation
- Singletons
- Accepting a Version Range
- Conclusion
Multi-Framework and -Version Micro Frontends with Module Federation
- Pattern or Anti-Pattern?
- Micro Frontends as Web Components?
- Do we also need Module Federation?
- Implementation in 4 steps
Pitfalls with Module Federation and Angular
- “No required version specified” and Secondary Entry Points
- Unobvious Version Mismatches: Issues with Peer Dependencies
- Issues with Sharing Code and Data
- NullInjectorError: Service expected in Parent Scope (Root Scope)
- Several Root Scopes
- Different Versions of Angular
- Bonus: Multiple Bundles
- Conclusion
Module Federation with Angular’s Standalone Components
- Router Configs vs. Standalone Components
- Initial Situation: Our Micro Frontend
- Activating Module Federation
- Static Shell
- Alternative: Dynamic Shell
- Bonus: Programmatic Loading
From Module Federation to esbuild and Native Federation
- Native Federation with esbuild
- Native Federation: Setting up a Micro Frontend
- Native Federation: Setting up a Shell
- Exposing a Router Config
- Communication between Micro Frontends
- Conclusion
The new NGRX Signal Store for Angular: 3 + n Flavors
- Getting the Package
- Flavor 1: Lightweight with signalState
- Side Effects
- Flavor 2: Powerful with signalStore
- Custom Features - n Further Flavors
- Flavor 3: Built-in Features like Entity Management
- Conclusion
Smarter, Not Harder: Simplifying your Application With NGRX Signal Store and Custom Features
- Goal
- DataService Custom Feature
- Implementing A Generic Custom Feature
- Providing a Fitting Data Service
- Undo/Redo-Feature
- Using the Store in a Component
- Conclusion and Outlook
NGRX Signal Store Deep Dive: Flexible and Type-Safe Custom Extensions
- A Simple First Extension
- Now it Really Starts: Typing
- Typing and Dynamic Properties – How do They Work Together?
- More Examples: CRUD and Undo/Redo
- Out of the Box Extensions
- Conclusion
The NGRX Signal Store and Your Architecture
- Where to Put it?
- Combining the Signal Store With the Traditional NGRX Store
- The Best of Both Worlds via Custom Features
- How Large Should a Signal Store be?
- May a Signal Store Access Other Signal Stores?
- Preventing Cycles, Redundancies, and Inconsistencies
- Conclusion
Bonus: Automate your Architecture with Nx Workspace Plugins
- Creating a Workspace Plugin With a Generator
- Templates for Generators
- Implementing a Generator
- True Treasures: Helper Methods for Generators in Nx
- Trying out Generators
- Testing Generators
- Exporting Plugins via NPM
- Conclusion
Bonus: The Core of Domain-Driven Design
- DDD in a Nutshell
- How to Define DDD?
- When Can we Call it DDD?
- What’s the Core of DDD and Why did People get a Wrong Impression About that?
- Is Tacticial Design Object-Oriented? Is There a Place for FP?
- Further Adaptions of Tactical Design
- Conclusion