Vue方向:nuxt服务端渲染

1、初始化

使用脚手架工具create-nuxt-app快速搭建,只要npm版本在5.2.0以上,就可以使用npx快速搭建。

npx  create-nuxt-app  项目名

2、安装nuxt时出现的选项

项目名称.png

开发脚本语言.png

包管理工具.png

UI框架的选取.png

添加 axios module 以轻松地将 HTTP 请求发送到您的应用程序中.png

添加 EsLint 以在保存时代码规范和错误检查您的代码.png

选取测试的框架.png

选取模式类型.png

是否属于静态资源.png

3、基本nuxt配置

修改index.vue首页的内容

   <h1>测试nuxt项目搭建</h1>
image.png
image.png

4、Nuxt项目目录结构

[---
 -- .nuxt                            // Nuxt自动生成,临时的用于编辑的文件
 -- 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包管理配置文件               
---]   

别名:~或者@ 目录:srcDir
别名:~~或者@@ 目录:rootDir
在vue模板中,如果想引入静态文件assets或者static目录,使用:

~/assets/img.png
或
@/assets/img.png

5、配置IP和端口

在根目录下的package.json里对config项进行配置

"config":{
    "nuxt":{
        "host":"127.0.0.1",
        "port":"1111"
    }
}

6、配置全局的CSS

定义一个全局的CSS来初始化页面渲染,比如:normalize.css

// 新建一个normalize.css文件
// 再去修改nuxt.config.js文件
css: ["element-ui/lib/theme-chalk/index.css", "~assets/css/normailze.css"],

7、修改webpack配置

在nuxt.config.js中可以对webpack配置进行覆盖

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)/
        })
      }
    }
  }

8、案例测试

8.1、导入UI组件
// 安装iview组件库
npm install iview --save
8.2、配置并引入iview

可以在nuxt.config.js的plugins配置项中加入,同时在plugins文件夹下加入引入逻辑,如:

{ src: '~/plugins/iview', ssr: true}

并且在plugins目录下新建iview.js文件

import Vue from 'vue'
import iView from 'iview'

Vue.use(iView)
import 'iview/dist/styles/iview.css'
8.3、修改默认布局

可以通过添加layouts/default.vue文件扩展应用的默认布局

<template>
    <div class="layout">
        布局内容
    </div>
</template>

相比于传统的SPA页面使用<router-view>,但在nuxt.js中使用<nuxt/>组件显示页面的主体内容 ,created和data中的逻辑,是在服务端加载时处理的,并不是浏览器端,浏览器端的逻辑比如window等对象要在mounted中写,否则会报错。head中定义一些元数据,这些元数据会被爬虫爬取到,可以在每个页面自定义。

8.4、添加静态资源

静态资源需要用require引入或者import,配合@/~使用

<template>
    <div class="container">
        <div>
            <Card v-for="i in 5" :key="i" :style="{width:'100%',marginBottom:'15px'}">
                <div style="text-align:center">
                    <img src="~/static/image/cat.jpg" height="300px" />
                    <h3>A high quality UI Toolkit based on Vue.js</h3>
                </div>
            </Card>
        </div>
    </div>
</template>
8.5、nuxt路由的使用

nuxt中的基础路由是根据pages的目录结构生成的,如:
pages/index.vue 就是: { name:'index',path:'/',components:'pages/index.vue' }
pages/books/index.vue 就是:{ name:'books', path:'/books', components:'pages/books/index.vue' }
修改layout/default.vue文件

<Menu mode="horizontal" theme="dark" active-name="1">
  <div class="layout-logo"></div>
  <div class="layout-nav">
    <MenuItem name="1">
      <Icon type="ios-navigate"></Icon>
      <nuxt-link to="/">首页</nuxt-link>
    </MenuItem>
    <MenuItem name="2">
      <Icon type="ios-keypad"></Icon>发现
    </MenuItem>
    <MenuItem name="3">
      <nuxt-link to="/books">小书</nuxt-link>
    </MenuItem>
  </div>
</Menu>
8.6、asyncData方法获取数据

使用 asyncData 的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据。asyncData 方法会在组件(限于页面组件)每次加载之前被调用。它可以在服务端或路由更新之前被调用。 在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用 asyncData 方法来获取数据,Nuxt.js 会将 asyncData 返回的数据融合组件 data 方法返回的数据一并返回给当前组件。由于 asyncData 方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。
安装axios

npm install axios --save

http://myjson.com/上创建假伪数据

{
  "data": [
    {
      "name": "Cesium基础功能-鹰眼地图。附带源码下载"
    },
    {
      "name": "iOS开发简记(7):网络请求模块"
    },
    {
      "name": "iOS开发简记(7):网络请求模块"
    },
    {
      "name": "(难度Hard) Problem 132. Palindrome Partitioning II(回文串拆分II)"
    },
    {
      "name": "iOS 13适配问题"
    },
    {
      "name": "Cesium基础功能-气泡弹窗。附带源码下载"
    },
    {
      "name": "重学安卓:是让人耳目一新的 Jetpack MVVM 精讲啊!"
    },
    {
      "name": "iOS开发简记(6):storyboard的使用"
    },
    {
      "name": "最熟悉的陌生人:5 分钟快速理解 HTTP2"
    }
  ]
}

将数据保存到地址上去

8.7、新建index.vue
<template>
    <div class="container">
        <div>
            <Card v-for="(item,index) in books" :key="index" :style="{width:'100%',marginBottom:'15px'}">
                <div style="text-align:center">
                    <img src="~/static/image/cat.jpg" height="300px" />
                    <h3>{{ item.name }}</h3>
                </div>
            </Card>
        </div>
    </div>
</template>
<script>
import axios from 'axios'
export default {
  async asyncData(){
      let {data}=await axios.get('https://api.myjson.com/bins/f1bdx')
      return {info: data}
  }
}
</script>
8.8、Nuxt页面的meta设置

Nuxt.js 为页面提供的特殊配置项。其中 head 配置当前页面的 Meta 标签, 详情参考 页面头部配置 API

    head: {
        title: '一本书 - 首页',
        meta: [
            {
                hid: 'description',
                name: 'description',
                content: 'website description'
            },
            { name: 'keywords', content: '一本书,码农,技术,vue,node,nuxt,前端' }
        ]
    },

打开网页->刷新->右键查看,效果就显示出来了,这也是 nuxt 的一大优点

8.9、添加页面切换特效

全局动画默认使用 page 来进行设置,例如现在我们为每个页面都设置一个进入和退出时的渐隐渐现的效果。我们可以先在根目录的 assets/css 下建立一个 main.css 文件。

.page-enter-active, .page-leave-active {
    transition: opacity 2s;
}
.page-enter, .page-leave-active {
    opacity: 0;
}

然后在 nuxt.config.js 里加入一个全局的 css 文件就可以了。
目前官方设定nuxt-link组件制作跳转链接才有动画

css:['assets/css/main.css']
8.10、制作一个详情页

修改pages/books/index.vue

<Row type="flex" gutter="10" justify="start" class="code-row-bg">
  <Col v-for="i in 10" :key="i" span="6">
    <Card style="width:100%">
      <nuxt-link :to="'/books/'+i">
        <div style="text-align:center">
          <img style="width:100%" src="https://img3.doubanio.com/view/subject/m/public/s6974202.jpg" />
          <h3>史蒂夫·乔布斯传</h3>
        </div>
      </nuxt-link>
    </Card>
  </Col>
</Row>

在 Nuxt.js 里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的 Vue 文件 或 目录。也就是要么创建_id.vue,要么创建_id/index.vue

新建 pages/books/_id.vue

<template>
    <div>
        <Card style="width:100%">
            <div style="text-align:center">
                <img style="width:100%" src="https://img3.doubanio.com/view/subject/m/public/s6974202.jpg" />
                <h3>史蒂夫·乔布斯传</h3>
                <p>当前id : {{ id }}</p>
            </div>
        </Card>
    </div>
</template>

<script>
export default {
    validate({ params }) {
        return /^[0-9]+$/.test(params.id)
    },
    data() {
        return {
            id: this.$route.params.id
        }
    },
    head() {
        return {
            title: '史蒂夫·乔布斯传',
            meta: [{ hid: 'description', name: 'books', content: '史蒂夫·乔布斯传' }]
        }
    }
}
</script>
8.11、给网站添加head

Nuxt.js 允许你在 nuxt.config.js 里定义应用所需的所有默认 meta 标签,在 head 字段里配置就可以了

新建 root/app.html

<!DOCTYPE html>
<html lang="en">
    <head>
        {{
            HEAD
        }}
    </head>

    <body>
        {{ APP }}
    </body>
</html>

nuxt 实际上已经将开发的一些需求都准备好了,使用 nuxt 进行 vue 服务端渲染能够极大的提高开发效率.

9、最后打包

npm run generate

注:本文是记录nuxt搭建便于后期使用时翻阅,本文是参考简书其他作者的//www.greatytc.com/p/37f0b9c9432f

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

推荐阅读更多精彩内容