Hiring in-house gives you the deepest product knowledge. The people internalise your customers and your data model over time, and that knowledge remains inside the company. The cost is slow hiring and fixed overhead: hiring well is slow, onboarding adds several more weeks, and the cost carries on through the quiet quarters.
Handing a project to a vendor is the arrangement where someone else is accountable for shipping: the partner staffs the roles, the partner manages the day-to-day work, and they absorb the risk of missing the date. This fits well when the outcome can be described and your side has a decision maker with time for it. It fails when the requirements change weekly, because a vendor is not able to guess what the business wants.
Hiring individual contractors sits between the two: you bring in developers while keeping the management yourself. It moves quickly — the right specialist can join almost immediately — and it winds down as quickly as it ramped up. The trade-off remains that your engineering managers have to have time for code review and planning. If that capacity is missing, you are paying for effort with no owner.
In practice, companies blend them. A frequent arrangement holds the critical decisions and the core system in-house, while a partner covers peaks, well-defined modules or typescript framework platform work. The rule holds: hold on to the parts that are hard to re-learn, and contract out what is well understood.
A few questions usually settle it. First: is what you are building the product itself, or a cost centre? Then: for how long will the work last — a quarter or a decade? Third: angularjs vs vuejs who answers the phone at two in the morning when it breaks? Work through them with real answers and the model is normally clear.