The \"classic\" approach to web development has been for some time a thin client and a thick server: the server generates HTML and spits it out for the browser to render only. B
ExtJS, YUI, dojo... frameworks that basically offer a hand in implementation apps like the one you're describing
We(at my workplace) used such approach successfully for many many large & small scale apps... In general basing most of our app on ExtJS+jQuery, in some cases on dojo(Zend Framework(if you care about PHP world at all) provide handy integration with dojo elements)
If it is not abused and used just for the sake of using it or bumping the coolness factor - it is an awesome tool.
With proper design it neither heavy nor slow as an approach per se.
I like to implement a hybrid approach. When a page is first requested, it should be populated with as much information as you can infer from the URL/Querystring/Post. And then any subsequent state changes can be queried for and updated using Ajax.
A lot of people tend to take the approach of simply loading the page, and then letting the javascript/ajax do the work of loading. This results in the client waiting for the page to load, and then the client waiting for the data to load.
Much better to just let the server do that initial data load and populate all the UI elements.
For internally consumed line of business apps where you can control the desktop, javascript makes sense.
For external / public facing apps where you have no idea what browser your consumers are using, keep it dead simple and use as little as possible.
When you say that Javascript just works now due to the frameworks, that's not exactly true. IE 6 is still in widespread use, as is older Safari. Even FF 2.x, and 1.x to some extent, has decent share of the consumer market.
Along with that, not everyone has high speed internet, which is pretty much a requirement for a lot of these frameworks. Further, although most libraries work with IE 7, it's a dog for most operations.
On the subject of library size, we have a number of .net controls which like to inject up to 1MB of javascript to the client. Trying sending that to Grandma.
Lastly, phones are picking up users as a primary internet access device. Unfortunately, their cache size is small and, for the most part, those cool javascript things don't work too well.
The YUI Theater has a video that I think is highly relevant to your question - I strongly recommend watching it
High-performance JavaScript: Why Everything You've Been Taught Is Wrong
The title is a bit misleading, but he actually talks about the very issues you're facing.
Your assertion that web developers can now "pretty much assume their Javascript code is working" is a tough one to agree with. In my experience Javascript is almost always a black hole sucking all the time and energy you can supply it. Frameworks like Prototype and Script.aculo.us have made things MUCH better, but they are not yet as hardened as your question assumes.
The two main issues are one, browser support and two is development time. You are relying on an application you cannot control to handle the bulk of your app's work load. The fact this can be broken with even the most minor update to the browser would concern me. Generating HTML server-side mitigates this risk to a large extent. Development of a rich Javascript front-end is time consuming, difficult to debug and equally difficult to test across the wide array of available browsers.
While those concerns are real, the fact you can achieve some fantastic User Experiences via client-side Javascript cannot be ignored. The frameworks I mentioned earlier expose functionality that was not even dreamed of a year or two ago and as a result make the up front development price in some cases largely worth it (and sometimes significantly shortened when the frameworks are implemented effectively).
I think there are applications for A Javascript-powered UI, as long as the decision to go that route is well thought-out. We would not be discussing this on SO were it not for the fact that the UI potential using this strategy is awesome. Web-based applicationsusing web-based data are perfect candiates (RSS, REST Services). Applications hitting a relation database or complex Web services repeadly are going to by necessity maintain a tighter coupling with the server-side.
My 2 cents.
I'm on the tail end of building just this sort of app. It's an ExtJS GUI on top of Zend Framework JSON-RPC web services, implementing an iGoogle-like gadget portal.
Advantages:
Disadvantages:
The driving reason for us to do this was to deliver a better user experience. Users expect a desktop-like experience, and you can't deliver that across a server roundtrip. We get to deliver that now, but there's no denying there are big challenges with an approach like this. Overall I'm satisfied though.
Update (september 2013):
Still using this architecture and still thinking it's the right architecture if you are building a genuine web application (not just a web page with some dynamic features). Our team and product is now much larger (nearing 500.000 lines of code), but the architecture has scaled without issue. There are now many really good scalable javascript frameworks (angular, ember, ...), so it is easier than ever to adopt this way of working.
Because @rwoo asked, some challenges that we still have: