前端架构之路(8) - 单页面应用(SPA)、按需加载

单页面应用(SPA)、按需加载

1. 多页面应用

传统多页面是由后端控制一个 url 对应一个 html 文件,页面之间的跳转须要根据后端给出的 url 跳转到新的 html 上。好比:html

http://www.example.com/page1 -> path/to/page1.html
http://www.example.com/page2 -> path/to/page2.html
http://www.example.com/page3 -> path/to/page3.html

多数状况下,这种方式都是没问题的,但对一些业务逻辑类似,重前端的应用就不是很友好了,好比系统管理应用。前端

  • 页面之间的跳转须要从新加载资源,这样就不能很好的重用公共文件,也使体验不畅;
  • 不能动态更新页面的路由,由于已经被后端定义好了,更改比较麻烦;
  • 对于 UI 相似,业务逻辑相似的页面,不可以很好的共用代码;
  • 对后端来讲,每添加一个页面,都须要加一个路由,也是很麻烦的。

2. 单页面应用

单页面应用(single page application),就是只有一个页面的应用,页面的刷新和内部子页面的跳转彻底由 js 来控制。vue

通常单页面应用都有如下几个特色:node

  • 本地路由,由 js 定义路由、根据路由渲染页面、控制页面的跳转,这是单页面应用最基本的特色;
  • 全部文件只会加载一次,最大限度重用文件,而且极大提高加载速度,让 web app 有了 native app 的流畅体验;
  • 按需加载:单页面应用通常都会加上这个特性。

这样一来,整个应用便只有一个 html 文件,路由由前端控制(有时候须要后端配合),前端对应用的控制就变得游刃有余了。react

2.1 路由

通常来讲,单页面应用的路由从表现形式上来讲分为两种:Hash Router 与 Browser Routerwebpack

2.1.1 Hash Router(哈希路由)

经过 location hash 定义路由。git

http://www.example.com -> path/to/main.html

http://www.example.com -> 主页面
http://www.example.com/#/ -> 主页面
http://www.example.com/#/page1 -> page1 页面
http://www.example.com/#/page2 -> page2 页面
http://www.example.com/#/page3 -> page3 页面

这样作的好处是后端只须要给一个 url 就能够了,由于路由彻底是由前端实现的。github

2.1.2 Browser Router(浏览器路由)

经过浏览器连接定义路由。这个时候,每次路由就都像正常的浏览器连接跳转同样。web

这种路由须要后端配合,就是把全部须要路由的 url 都指定同一个 html 文件,由前端来根据 url 判断怎样渲染页面。vue-router

http://www.example.com/page1 -> path/to/main.html
http://www.example.com/page2 -> path/to/main.html
http://www.example.com/page3 -> path/to/main.html

这样作的好处是对搜索引擎友好,对浏览器的表现就像正常的 url 同样。

2.1.3 经常使用的路由组件

3. 按需加载

按需加载,就是按照当前呈现的不一样页面加载不一样的文件,而不是最开始就把全部文件都加载出来。

这样作的好处是首页第一次加载不须要把全部页面的文件一次性所有加载出来,而是只加载一些每一个页面都依赖的基础库文件,从而避免首页加载很慢。

这个功能须要构建工具的支持,dynamic-imports,好比:

register('page1', () => {
    import('filesOfPage1').then(() => {
        // 渲染 page1
    });
});

register('page2', () => {
    import('filesOfPage2').then(() => {
        // 渲染 page2
    });
});

4. 常见的单页面应用组合

5. react 全家桶 + ant-design 开发模板

6. 后续

上一篇:私有 npm 仓库

下一篇:服务器端渲染(SSR)与 node 中间层

更多博客,查看 https://github.com/senntyou/blogs

做者:深予之 (@senntyou)

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证