• vue路由懒加载和SPA单页应用的优缺点


    Vue路由懒加载

    对于SPA单页应用,当打包构建时,JavaScript包会变得非常大,影响页面加载速度,将不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这就是路由的懒加载。

    实现方式

    Vue异步组件

    Vue允许以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。

    Vue.component("async-example", function (resolve, reject) {
      setTimeout(function() {
        // 向 `resolve` 回调传递组件定义
        resolve({
          template: "<div>I am async!</div>"
        })
      }, 1000)
    })
    

    这个工厂函数会收到一个resolve回调,这个回调函数会在你从服务器得到组件定义的时候被调用,当然也可以调用reject(reason)来表示加载失败,此处的setTimeout仅是用来演示异步传递组件定义用。将异步组件和webpackcode-splitting功能一起配合使用可以达到懒加载组件的效果。

    Vue.component("async-webpack-example", function (resolve) {
      // 这个特殊的 `require` 语法将会告诉 webpack
      // 自动将你的构建代码切割成多个包,这些包
      // 会通过 Ajax 请求加载
      require(["./my-async-component"], resolve)
    })
    

    也可以在工厂函数中返回一个Promise,把webpack 2ES2015语法加在一起。

    Vue.component(
      "async-webpack-example",
      // 这个动态导入会返回一个 `Promise` 对象。
      () => import("./my-async-component")
    )
    

    事实上我们在Vue-Router的配置上可以直接结合Vue的异步组件和Webpack的代码分割功能可以实现路由组件的懒加载,打包后每一个组件生成一个js文件。

    {
      path: "/example",
      name: "example",
      //打包后,每个组件单独生成一个chunk文件
      component: reslove => require(["@/views/example.vue"], resolve)
    }
    

    动态import

    Webpack2中,可以使用动态import语法来定义代码分块点split point,官方也是推荐使用这种方法,如果使用的是Bable,需要添加syntax-dynamic-import插件, 才能使Babel可以正确的解析语法。

    //默认将每个组件,单独打包成一个js文件
    const example = () => import("@/views/example.vue")
    

    有时我们想把某个路由下的所有组件都打包在同一个异步块chunk中,需要使用命名chunk一个特殊的注释语法来提供chunk name,需要webpack > 2.4

    const example1 = () => import(/* webpackChunkName: "Example" */ "@/views/example1.vue");
    const example2 = () => import(/* webpackChunkName: "Example" */ "@/views/example2.vue");
    

    事实上我们在Vue-Router的配置上可以直接定义懒加载。

    {
      path: "/example",
      name: "example",
      //打包后,每个组件单独生成一个chunk文件
      component: () => import("@/views/example.vue")
    }
    

    webpack提供的require.ensure

    使用webpackrequire.ensure,也可以实现按需加载,同样多个路由指定相同的chunkName也会合并打包成一个js文件。

    // require.ensure(dependencies: String[], callback: function(require), chunkName: String)
    {
        path: "/example1",
        name: "example1",
        component: resolve => require.ensure([], () => resolve(require("@/views/example1.vue")), "Example")
    },
    {
        path: "/example2",
        name: "example2",
        component: resolve => require.ensure([], () => resolve(require("@/views/example2.vue")), "Example")
    }

    SPA单页应用的优缺点

    Single Page Web Application是一种特殊的Web应用,其所有的活动局限于一个Web页面中,仅在该Web页面初始化时加载相应的HTMLJavaScriptCSS文件,一旦页面加载完成,SPA不会进行页面的重新加载或跳转,而是利用JavaScript动态的变换HTML,默认Hash模式是采用锚点实现路由以及元素组件的显示与隐藏实现交互,简单来说SPA应用只有一个页面,通常多页面应用会有多个页面不断跳转,而单页面应用始终在一个页面中,默认Hash模式是通过锚点实现路由以及控制组件的显示与隐藏来实现类似于页面跳转的交互。

    优点

    • 良好的交互体验,页面首次加载完成后内容的改变不需要重新加载整个页面,具有更快的响应速度,具有桌面应用的即时性、网站的可移植性和可访问性。
    • 良好的前后端工作分离模式,单页应用可以和RESTful架构一起使用,通过RESTAPI提供接口数据,有助于分离客户端和服务器端工作与API通用化。
    • 减轻服务端压力,服务端不需要处理页面模板的逻辑与拼接,除首次加载页面外只需要提供数据信息即可,把计算尽量放在客户端,单页应用能提高单位服务器的负载量。
    • 可维护性高,通常采用组件化与模块化开发,代码复用程度高,相对来说可维护性高。

    缺点

    • 不利于SEO,由于是采用前端渲染的方式,搜索引擎不会去解析Js从而只能够抓取首页未渲染的模板,如果需要单页面应用有更好的SEO,那么通常需要使用SSR服务端渲染,搜索引擎爬虫抓取工具可以直接查看完全渲染的页面,但是由于是服务端进行渲染,那么会对服务器造成一定压力,SSR服务端渲染属CPU密集型,当然如果只是需要SEO少数几个页面,可以采用预渲染的方式。
    • 首次加载速度慢,SPA单页应用通常首次加载页面时就会将相应的HTMLJavaScriptCSS文件全部加载,通常可以通过采取缓存措施以及懒加载即按需加载组件的方式来优化。
     
     
  • 相关阅读:
    LOJ#2245 魔法森林
    洛谷P1173 [NOI2016]网格
    [NOI2018]归程
    宇宙旅行
    hdu 4027 Can you answer these queries?(线段树)
    poj 1661 Help Jimmy(记忆化搜索)
    hdu 1078 FatMouse and Cheese(简单记忆化搜索)
    poj 3616 Milking Time (基础dp)
    hdu 1074 Doing Homework(状压dp)
    codeforces 735C. Tennis Championship(贪心)
  • 原文地址:https://www.cnblogs.com/zycs/p/14232042.html
Copyright © 2020-2023  润新知