Drawing Multiple Things in Webgl

I’ve been playing around with WebGL for some time now, followed lots of tutorials and read lots of online info. One thing that doesn’t get covered is what to do when you want to draw different things with different with different shaders.

Say I had a bunch of meshes where some had image textures, some had procedural textures, some were just flat colours, some had phong shading, some didn’t. Are the shader programs swapped out between draw calls or do you create some grand shader program that handles all cases?

I tried looking at three.js, but that code base is a bit beyond me at the moment.

How do scene graph implementations handle potentially lots of different drawing techniques in the one scene?

What’s standard practice here?