笔者的学习进度比较慢,直到两年以前写的网站都还是以服务端为主导的,即网站的所有视图都由服务器视图模板来渲染,笔者使用的是 DotNet MVC,开发套路就是在Controller里面写Action,在Views里写对应的Action.cshtml,使用ajax发起请求已经是比较前端的事情了。这种时候由于DotNet MVC框架继承的微软风格的懒人模式,甚至不需要去知道其路由是如何实现的,给人一种感觉是只要在浏览器里敲进去Controller名与Action名,就访问到视图了。
后来笔者开始使用ng1前端框架,起初的开发完全放弃其路由功能,而使用服务端MVC路由来区分页面,在各自页面内写ng1代码。现在想来这样做实在是浪费了ng1的能力,因为.Net MVC的视图能力虽说有布局页这些概念,但其仍然是多页面的应用,视图间的切换都会造成页面的刷新,这会导致每切换一个页面都会重新加载一次ng1近两万行的代码。根本原因是没有利用这个强大的前端框架的精髓之一——前端路由。
抛开前端路由的底层,其所做的事情就是动态操作DOM来模拟页面的切换,带来的好处是巨大的,首先是不用再页面切换时重复加载大量的脚本依赖了,还有就是页面切换不再是白屏读条,而是可以加上接近原生应用的切换效果。而使用了前端路由后要解决的最大问题,自然是如何与服务端路由分离,至少不造成冲突。
前端路由有两种形式,一种是Html5的pushState风格,一种是使用#符号实现与服务端路由的分隔,笔者在基于微信公众号开发的时候涉及到了使用前端路由的SPA与微信API交互的各种情况,发现这两种形式各有问题,只能说微信以及传统的web服务器(至少IIS这个毒瘤)对现在这些前后端分离的SPA应用还不怎么友好。
一、ng2项目的部署

