What I have listed constitutes a component.
- A component knows how to interact with its host element
- A component knows how to interact with its content and view children
- A component knows how to render itself
- A component configures dependency injection
- A component has a well-defined public API of input and output properties
All of these make components in Angular self-describing, so they contain all the information needed to instantiate them. And this is extremely important.
This means that any component can be bootstrapped. It does not have to be special in any way. Moreover, any component can be loaded into a router outlet. As a result, you can write a component that can be bootstrapped as an application, loaded as a route, or used in some other component directly. This results in less API to learn. And it also makes components more reusable.