Vue-SSR-Nuxtjs

[TOC]

服务器端渲染到底有什么好处?

最主要的原因时SPA(单页应用)不利于搜索引擎的SEO操作。比如你作一个新闻网站,流量的一个主要来源是通过百度、谷歌、bing这些搜索引擎,但是它们对SPA的抓取并不好,特别是百度根本没法抓取到SPA的内容页面,所以我们必须把我们的应用在服务端渲染成适合搜索引擎抓取的页面,再下载到客户端。那Nuxt.js适合作新闻、博客、电影、咨询这样的需要搜索引擎提供流量的项目。如果你要作移动端的项目,就没必要使用这个框架了。

什么是SSR

SSR,即服务器渲染,就是在服务器端将对Vue页面进行渲染生成html文件,将html页面传递给浏览器。

SSR两个优点:

  • SEO 不同于SPA的HTML只有一个无实际内容的HTML和一个app.js,SSR生成的HTML是有内容的,这让搜索引擎能够索引到页面内容。
  • 更快内容到达时间 传统的SPA应用是将bundle.js从服务器获取,然后在客户端解析并挂载到dom。而SSR直接将HTML字符串传递给浏览器。大大加快了首屏加载时间。

Nuxt

Nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染)。再直白点说,就是Vue.js原来是开发SPA(单页应用)的,但是随着技术的普及,很多人想用Vue开发多页应用,并在服务端完成渲染。这时候就出现了Nuxt.js这个框架,她简化了SSR的开发难度。还可以直接用命令把我们制作的vue项目生成为静态html。

官方解释

Nuxt.js 是一个基于 Vue.js 的通用应用框架。 通过对客户端/服务端基础架构的抽象组织,Nuxt.js 主要关注的是应用的 UI渲染。

Nuxt.js是特点(优点)

  • 基于 Vue.js
  • 自动代码分层
  • 服务端渲染
  • 强大的路由功能,支持异步数据
  • 静态文件服务
  • ES6/ES7 语法支持
  • 打包和压缩 JS 和 CSS
  • HTML头部标签管理
  • 本地开发支持热加载
  • 集成ESLint
  • 支持各种样式预处理器: SASS、LESS、 Stylus等等

Nuxt文件目录

目录结构

|-- .nuxt                            // Nuxt自动生成,临时的用于编辑的文件,build
|-- assets                           // 用于组织未编译的静态资源入LESS、SASS 或 JavaScript
|-- components                       // 用于自己编写的Vue组件,比如滚动组件,日历组件,分页组件
|-- layouts                          // 布局目录,用于组织应用的布局组件,不可更改。
|-- middleware                       // 用于存放中间件
|-- pages                            // 用于存放写的页面,我们主要的工作区域
|-- plugins                          // 用于存放JavaScript插件的地方
|-- static                           // 用于存放静态资源文件,比如图片
|-- store                            // 用于组织应用的Vuex 状态管理。
|-- .editorconfig                    // 开发工具格式配置
|-- .eslintrc.js                     // ESLint的配置文件,用于检查代码格式
|-- .gitignore                       // 配置git不上传的文件
|-- nuxt.config.json                 // 用于组织Nuxt.js应用的个性化配置,已覆盖默认配置
|-- package-lock.json                // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操作
|-- package-lock.json                // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操作
|-- package.json                     // npm包管理配置文件

Nuxt基础配置

  • 配置运行的端口

    //在package.json的文件中配置其端口
    "config":{
        "nuxt":{
            "host": "127.0.0.1",
            "port": "8899"
        }
    }
    
  • 配置全局CSS

    • 可创建文件/assets/css/normailze.css

    • /nuxt.config.js中配置

      css:['~assets/css/normailze.css'],
      
    • 配置webpack的loader

      • 在nuxt.config.js里是可以对webpack的基本配置进行覆盖的,比如现在我们要配置一个url-loader来进行小图片的64位打包。就可以在nuxt.config.js的build选项里进行配置。
       loaders:[
            {
              test:/\.(png|jpe?g|gif|svg)$/,
              loader:"url-loader",
              query:{
                limit:10000,
                name:'img/[name].[hash].[ext]'
              }
            }
          ],
          /*
          ** Run ESLint on save
          */
          extend (config, { isDev, isClient }) {
            if (isDev && isClient) {
              config.module.rules.push({
                enforce: 'pre',
                test: /\.(js|vue)$/,
                loader: 'eslint-loader',
                exclude: /(node_modules)/
              })
            }
          }
      

Nuxt路由配置

  • 基础路由配置

    • pages文件夹下面的的vue组件,重新编译执行后会被自动的配置成路由,
      • .nuxt中的router.js中可以看到详细的路由配置
    • 不管是任意名字的vue文件,还是文件夹,都会自动生成路由配置,无需手动配置
    • 需注意的是,配置后需要重新编译,可查看.nuxt文件中router.js中有没有相关的配置
      routes: [{
          path: "/abouts",
          component: _6fe9dcfd,
          name: "abouts"
        }, {
          path: "/news",
          component: _56266eb8,
          name: "news"
        }, {
          path: "/",
          component: _2335bbab,
          name: "index"
        }],
    
  • 参数传递

    • 从一个页面将参数传递给另一个页面的时候

      • vue基本相同,只是将跳转的router-link变成nuxt-link
      • 接受时,使用$route.params.newsId进行参数的获取
      <template>
        <div>
          <ul>
            <li><nuxt-link :to="{name:'index'}">HOME</nuxt-link></li>
            <li><nuxt-link :to="{name:'about'}">ABOUT</nuxt-link></li>
            <li><nuxt-link :to="{name:'news',params:{newsId:3306}}">NEWS</nuxt-link></li>
          </ul>
        </div>
      </template>
      
  • 动态路由

    • 如果需要为某个组件设置动态路由,则在相应的文件夹下面创建以下划线命名的vue文件即可_id.vuenuxt会自动配置其为动态路由,在router.js中可以查看具体的配置

    • 例如:在news文件夹下面新建了_id.vue的文件,然后在文件里边有$route.params.id来接收参数。

      //news.vue
      <template>
        <div>
          <h3>news</h3>
          <nuxt-link :to="{name:'news-news1'}">news1</nuxt-link>
          <nuxt-link :to="{name:'news-news2'}">news2</nuxt-link>
          <nuxt-link to="/news/124">news124</nuxt-link>
          <nuxt-link to="/news/125">news125</nuxt-link>
        </div>
      </template>
      
    • 动态参数的校验

      • 对传过来的参数进行校验

        //在动态路由 _id.vue中写校验规则
        export default {
          validate ({ params }) {
            //让传过来的参数必须是数字
            return /^\d+$/.test(params.id)
          }
        }
        
      • validate()

        validate({ params, query }) {
          return true // 如果参数有效
          return false // 参数无效,Nuxt.js 停止渲染当前页面并显示错误页面
        }
        
        async validate({ params, query, store }) {
          // await operations
          return true // 如果参数有效
          return false // 将停止Nuxt.js呈现页面并显示错误页面
        }
        
      • validate()校验store中的数据

        export default {
          validate ({ params, store }) {
            // 校验 `params.id` 是否存在
          // 比对store中存储的数据
          return store.state.categories.some((category) => category.id === params.id)
          }
        }
        

Nuxt中默认布局

默认布局主要针对于页面的统一布局使用。它在位置根目录下的layouts/default.vue

  • 在layouts目录下创建vue文件,其中需要注意的就是留坑让每个组件使用的时候,有填充内容的地方;

    <template>
      <div>
          <header>self-header</header>
          <nuxt/>
          <footer>self-footer</footer>
      </div>
    </template>
    
  • 使用自定义的布局

    //指定使用的布局
    export default {
        layout: 'self',
        name: 'Test'
    }
    

Nuxt中asyncData方法获取数据

  • 在项目初始化页面前先获取到数据,之前我们是一般实在mouted中写异步请求,但是在ssr中没有哪个生命周期,所以增加了asyncData的方法;

  • 在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用 asyncData方法来获取数据并返回给当前组件

  • 注意:由于asyncData方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。

    export default {
      data () {
        return { project: 'default' }
      },
      asyncData (context) {
        return { project: 'nuxt' }
      }
    }
    
    export default {
      data () {
        return { 
          list: []
        }
      },
      async asyncData (context) {
        const {state, data:{list}} = await axios.get('/api/')
        return {
            list
        }
      }
    }
    
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容