It is absolutely daunting if you're first getting into a new project, the only thing that helps is experience, and the only way to get that is to keep trying, unfortunately.
Nowadays, I usually contribute out of a somewhat selfish interest in seeing a feature/bugfix get released so I can use it without having to maintain a fork :)
I do indeed try and reach out to contributors by opening a Github issue with comprehensive detail about the change I'd like to make and more importantly, why. Hopefully (and usually) they're responsive, and I can get their feedback and ask more questions, like any particular parts of the codebase I should look at. I also try to look at open source issue discussions/PRs as a process that can takes weeks (if not months), and so it can often be the case that I maintain a fork in the interim period. However, sometimes I just can't wait and am itching to get stuck in, and the best way to do that (without any prior knowledge of the codebase) is to try and trace the execution flow, which is just fancy-talk for adding `console.log(1), console.log(2)` statements in places that seem relevant.
I've certainly heard people say the best way to get started is on "easy" bugs. That may be true to a degree, but for me it was always because I felt a library/tool that I liked and used could be improved in some way. I found it helped me keep up the motivation to finish what I started, as opposed to fixing a random issue from the tracker that I might not fully understand the context of.