verypogu Having reusable components is always good, but here too you have to take care not to overdo and overdesign it. Just because something can be made a component, it doesn't mean it should. Exercise economy here as well and be sure that introduction of a component actually simplifies things. Similarly to having too many classes, too many components can create chaos.
Unlike some other engines, Godot doesn't have an explicit ECS system. Its equivalent of a component is a scene. So everything that should function as a reusable, self contained component - should be a scene.
Your weapon example sure sounds like an overkill. You insist on turning every tiny bit of functionality into a component, just because you can. This is not a very wise design choice as you'd end up with too many of too small components. This is cumbersome to manage mentally, and it also makes statements in your code long and repetitive.
Godot's architecture is based mainly on node class inheritance. In many cases it may be better to pack the shared functionality into a base class instead of scattering it among the components. But decision on how to approach it really depends on the system you're trying to model and your stance on the eternal oo conundrum: Is-a vs Has-a
To go back to your weapon example, that's definitely too many tiny components. This would be better handled via a base class that holds all of the ranged weapon common functionality. Also, no need to use the word component in component names. It just contributes to annoying longwindedness. Now if you throw in several nested levels of such components and a "manager" or two on top of it, then you'll likely end up having to write a lot of extremely long and similar looking statements just to address some basic properties. For example:
player.weapon_manager.equipped_weapon.ammunition_component.current_ammo -= 1
enemy.health_manager.current_hp -= player.weapon_manager.equipped_weapon.ranged_weapon_stats_component.damage
Doing this a lot will make your code excruciatingly hard to read and understand. Especially when it starts to grow larger. Instead, you should design your class/components structure as well as your naming conventions so it results in simple, easy to read and understand statements like this:
player.weapon.ammo -= 1
enemy.hp -= player.weapon.damage