其他分享
首页 > 其他分享> > 谈谈你对 SPA 的理解

谈谈你对 SPA 的理解

作者:互联网

谈谈你对 SPA 的理解

什么是 SPA ?

SPA (single-page-application), 即单页面应用, spa 可以根据需要动态装载适当的资源并添加到页面里面, 可以减少重复渲染, 提高效率。就像一个杯子,早上可装牛奶,下午可以装茶水, 晚上可以装白开水, 变的始终是杯子里面的内容, 而那个杯子永远不变

SPA 和 MPA(多页面应用)

SPA MPA
组成 一个主页面和多个页面片段 多个主页面
刷新方式 局部刷新 整页刷新
url模式 哈希模式 历时模式
SEO 搜索引擎优化 难以实现, 可使用SSR方式改善 容易实现
数据传递 容易 通过 url 、cookie 或 localStorage等
页面切换 速度快、用户体验良好 切换加载资源, 速度慢, 用户体验差
维护成本 相对容易 相对复杂

单页面应用的优点

缺点

哈希模式 hash

// 定义 Router  
class Router {  
    constructor () {  
        this.routes = {}; // 存放路由path及callback  
        this.currentUrl = '';  
          
        // 监听路由change调用相对应的路由回调  
        window.addEventListener('load', this.refresh, false);  // 给全局 window 添加 load 事件句柄
        window.addEventListener('hashchange', this.refresh, false);  
    }  
      
    route(path, callback){  
        this.routes[path] = callback;  
    }  
      
    push(path) {  
        this.routes[path] && this.routes[path]()  // this.router[path] 存在 即为 true 的话, 就执行回调函数
    }  
}  
  
// 使用 router  
window.miniRouter = new Router();  
miniRouter.route('/', () => console.log('page1'))   // 定义页面路由, '/' 路径绑定回调函数
miniRouter.route('/page2', () => console.log('page2'))  
  
miniRouter.push('/') // page1  调用 '/' 路径所绑定的回调函数,渲染页面
miniRouter.push('/page2') // page2

历史模式 history

// 定义 Router  
class Router {  
    constructor () {  
        this.routes = {};  
        this.listerPopState()  
    }  
      
    init(path) {  
        history.replaceState({path: path}, null, path);  
        this.routes[path] && this.routes[path]();  
    }  
      
    route(path, callback){  
        this.routes[path] = callback;  
    }  
      
    push(path) {  
        history.pushState({path: path}, null, path);  
        this.routes[path] && this.routes[path]();  
    }  
      
    listerPopState () {  
        window.addEventListener('popstate' , e => {  
            const path = e.state && e.state.path;  
            this.routers[path] && this.routers[path]()  
        })  
    }  
}  
  
// 使用 Router  
  
window.miniRouter = new Router();  
miniRouter.route('/', ()=> console.log('page1'))  
miniRouter.route('/page2', ()=> console.log('page2'))  
  
// 跳转  
miniRouter.push('/page2')  // page2 

标签:page2,谈谈,理解,path,routes,SPA,miniRouter,Router,页面
来源: https://www.cnblogs.com/white-boy/p/vue1.html