I have long believed that Web programming is one of the most difficult parts of practical, software development. As the name suggests, full-stack web development encapsulates all levels of programming, from database to backend to frontend.
Not only is there breadth across the stack, but there is also breadth across the different types of stacks. For instance, PHP web development is completely different from modern Node ES6 development is completely different from C# web development.
Web development is also the one area of CS that is intimately focused on the end-user. The end of web development (at least the first cycle) is actually deploying your app to a hosting platform and making it publicly availble. There are a wide range of deployment methods: IIS, Apache, nginx, Netlify, Heroku, AWS.
I propose web development from an axiomatic viewpoint. Instead of a book that teaches you how, let it teach you why.
One provocative question is the following: how do we ensure that the resource/static assets path actually exposes the underlying file structure?
Google: “IIS virtual directory”
John