Great question. I really cut my teeth in SPA developing an enterprise mobile first application. I learned so much from the experience. The application had about 40 modules or apps,if you like. Each app had about 3-6 views. I realized early on that traditional web architecture would not cut it, remember it was a mobile first project, so I started doing a spa.
There is so much to it, and not enough or here to articulate, but it is not really that hard. Here are some principles I believe you have to stick with:
Avoid heavy frameworks, they get in the way too much and they come and go, so don't be married to them
Vanilla JavaScript is your friend in many ways. All browsers are pretty consistent with supporting the same standards, Apis etc.
Leverage local storage to cache data as well as markup
Do not download large chunks of markup at one time
Do not create an unnecessarily chatty application, localStorage and indexDB are your friends
Create a mechanism to serve only modified markup content each time the app is loaded
Keep your DOM small, too many elements, even hidden creates a sluggish machine starving for memory.
Use appcache for offline, but understand its quirks
I general most of my enterprise apps can be done with 100kb of JavaScript or less, that is the entire application. My DOM is usually less than 100 elements baring a long list or table in the view. All my apps load in less than 1 second, and load sub module content in the background.