大前端学习-Vue服务端渲染Nuxt.js

内容输出来源 拉勾教育大前端高薪训练营

一、Nuxt.js是什么

  • Nuxt.js 一个基于Vue.js生态的第三方开源服务端渲染应用框架
  • 它可以帮我们轻松的使用Vue.js技术栈构建同构应用
  • 官网
  • GitHub仓库

二、Nuxt.js的基本使用

  • 可以初始项目
  • 在已有的Node.js服务端项目
  • 或者直接把Nuxt当作一个中间件集成到Node Web Server中

如果在现有的Vue.js项目上使用的话,我们需要非常熟悉Nuxt.js,除此之外呢,可能还需要至少10%的代码改动,会遇到坑。

所以从学习的角度上我们就先使用初始化项目,当然熟练之后,可以运用到各种环境上。

初始化NUxt.js应用的方式

  • 官方文档
  • 方式一: 使用create-nuxt-app
  • 方式二: 手动创建

创建过程

mkdir nuxt-demo

npm init -y // 初始化 package.json

// npm install nuxt
// script 修改启动项
"script": {
  "dev": "nuxt"
}

在根目录下创建page文件和一个index.vue文件

----page
-----index.vue

npm run dev

image
访问3000端口即可看到Nuxt运行起来了
image

三、基本路由

Nuxt基本路由

要在页面之间使用路由,建议使用 <nuxt-link> 标签。

<template>
  <nuxt-link to="/">首页</nuxt-link>
</template>

假设 pages 的目录结构如下:

pages/
--| user/
-----| index.vue
-----| one.vue
--| index.vue

那么,Nuxt.js 自动生成的路由配置如下:

router: {
  routes: [
    {
      name: 'index',
      path: '/',
      component: 'pages/index.vue'
    },
    {
      name: 'user',
      path: '/user',
      component: 'pages/user/index.vue'
    },
    {
      name: 'user-one',
      path: '/user/one',
      component: 'pages/user/one.vue'
    }
  ]
}

image

.nuxt/router文件中nuxt已经自动帮我们懒加载好了路由
image

npm run dev

四、Nuxt 路由- 路由导航

<template>
  <div>
    <h1>Hello Nuxt.js</h1>
    <a href="/">首页</a>
    <!-- router-link -->
    <router-link to="/">首页-router</router-link>
    <!-- 编程式导航-->
    <button @click="onClick">首页</button>
  </div>
</template>

<script>
export default {
  name: 'HomePage',
  methods: {
    onClick () {
      console.log('Hello')
      this.$router.push('/about')
    }
  }
}
</script>

<style>

</style>

五、动态路由

urser目录下创建_id.vue

---page
---user
---_id.vue

image

获取路由参数
image

$router.params.id

六、嵌套路由

  • 可以通过 vue-router 的子路由创建 Nuxt.js 应用的嵌套路由。

  • 创建内嵌子路由,你需要添加一个Vue文件,同时添加一个与该文件同名的目录用来存放子视图组件

Warning: 别忘了在父组件(.vue文件) 内增加 用于显示子视图内容

pages/
--| users/
-----| _id.vue
-----| index.vue
--| users.vue

Nuxt.js 自动生成的路由配置如下:

router: {
  routes: [
    {
      path: '/users',
      component: 'pages/users.vue',
      children: [
        {
          path: '',
          component: 'pages/users/index.vue',
          name: 'users'
        },
        {
          path: ':id',
          component: 'pages/users/_id.vue',
          name: 'users-id'
        }
      ]
    }
  ]
}

image

七、自定义路由配置

在根目录下新建 nuxt.config.js

module.exports = {
  router: {
    base: '/home',
    // routers: 一个数组,路由配置表
    // resolve: 解析路由组件路径
    extendRoutes(routes, resolve) {
      routes.push({
        path: '/userInfo',
        name: 'userInfo',
        component: resolve(__dirname, 'pages/about.vue')
      })
    }
  }
}

image

八、nuxt 视图-模版

官网

  • Nuxt.js 视图-结构,一般由三部分组成
  • Doucument - HTML file 最外层的文档页面,也就是服务端渲染的那个页面
  • 在HTML里面会包裹着 Layout 也就是页面的父路由
  • 里面的页面组件和可选内容

image

// 根目录下创建app.html

// 默认的模版
<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
  <head {{ HEAD_ATTRS }}>
    {{ HEAD }}
  </head>
  <body {{ BODY_ATTRS }}>
    <h1>app.html</h1>
    {{ APP }}
  </body>
</html>

执行npm run dev 即可看到效果啦

image

九、视图布局

在根目录下创建layouts/default.vue 这是默认的布局组件

// default.vue
<template>
  <div class="layout">
    <h1>layout/default.vue</h1>
    <nuxt />
  </div>
</template>

<script>
export default {
  name: 'LayoutDefault',
  layout: 'default'
}
</script>

<style>

</style>

执行npm run dev

image

十、指定默认组件

// layouts/foo.vue

export default {
  name: 'HomePage',
  layout: 'foo'
}

image

十一、asyncData异步数据

如何在服务端渲染动态页面

基本用法

  • 它会将asyncData返回的数据融合组件data方法返回数据一并给组件
  • 调用时机:服务端渲染期间和客户端路由更新之前

注意事项

  • 只能在页面组件中使用
  • 没有this,因为它是在组件初始化之前被调用的

异步数据

Nuxt.js 扩展了 Vue.js,增加了一个叫 asyncData 的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据

import axios from 'axios'
export default {
  name: 'HomePage',
  async asyncData () {
    const res = await axios({
      method: 'GET',
      url: 'http://localhost:3000/data.json'
    })
    return res.data
  },
  data () {
    return {
      name: '大白菜'
    }
  }
}

return 中的数据 会和data中的数据合并

非页面组件不会调用 asyncData

我们分别在page文件新建两个文件index.vue 以及foo.vue

// index.vue
<template>
  <div>
    <h1>Hello Nuxt.js</h1>
    <h1>{{posts[0].title}}</h1>
    <nuxt-link to="/about"></nuxt-link>
    <foo :posts="posts" />
  </div>
</template>

<script>
import axios from 'axios'
import Foo from '@/components/Foo'
export default {
  name: 'HomePage',
  components: {
    Foo
  },
  async asyncData () {
    const res = await axios({
      method: 'GET',
      url: 'http://localhost:3000/data.json'
    })
    return res.data
  },
  data () {
    return {
      name: '大白菜'
    }
  }
}
</script>

<style>

</style>

// foo.vue
<template>
  <div>
    <h1>FooPage</h1>
    <ul>
      <li v-for="item in posts" :key="item.id">
        {{item.title}}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'FooPage',
  props: ['posts']
}
</script>

<style>

</style>

image

asyncData 没有 this

  • 当你想要动态页面内容有利于SEO或者是提升首屏渲染速度的时候,就在asyncData中发请求那数据
  • 如果是非异步数据或者普通数据,则正常初始化到data中即可

十二、Nuxt.js异步数据- 上下文对象

  • asyncData中没有this,通过this.$router.params.id拿到的undefined,如果我们要获取点击跳转的路由怎么办呢,asyncData 有一个参数,就是是上下问对象asyncData(context)
// article/_id.vue
<template>
  <div>
    <h1>{{article.title}}</h1>
  </div>
</template>

<script>
import axios from 'axios'
export default {
  name: 'ArticlePage',
  async asyncData (context) {
    const  { data } = await axios({
      method: 'GET',
      url: 'http://localhost:3000/data.json'
    })
    const id = Number.parseInt(context.params.id)
    console.log(data, '44444')
    return {
      article: data.posts.find(item => item.id === id)
    }
  }
} 
// 传入一个上下文参数,这个时候我们可以通过context.params.id
// 或者通过context.route.params.id
</script>

<style>

</style>
// foo.vue
<template>
  <div>
    <h1>FooPage</h1>
    <ul>
      <li v-for="item in posts" :key="item.id">
        {{item.title}}
        <nuxt-link :to="'/article/' + item.id">{{item.title}}</nuxt-link>
      </li>
    </ul>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: 'FooPage',
  props: ['posts']
}
</script>

<style>

</style>

参考

感谢

完整代码请点击在这里,并且每一小节,都对应着相应的分支

最后感谢您花宝贵的时间阅读本文, 有问题,欢迎在评论区留言,如果本文对你有帮助的话,就给本文点个赞吧,您的肯定是我前进的最大动力~🌹🌹🌹

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue SSR(Server Side Rendering)服务端渲染是一种在服务器端将Vue组件渲染成HTML字符串的技术。Vue SSR可以提高应用程序的性能和搜索引擎优化。在此基础上,Nuxt.js是一个基于Vue.js的通用应用框架,它通过一个命令行工具来创建和管理Vue SSR应用程序。Nuxt.js提供了一些默认的配置,使得创建Vue SSR应用程序变得非常简单。 CNode社区是一个专门讨论Node.js技术的社区,许多Node.js开发者都会在这里交流。在本文中,我们将使用Nuxt.js来创建一个CNode社区的SSR应用程序。我们将使用CNode社区提供的API来获取帖子列表,然后使用Nuxt.js来将其渲染成HTML字符串,最后将其呈现给用户。 首先,我们需要安装Nuxt.js和一些必要的依赖项。可以使用以下命令来安装: ``` npm install --save nuxt axios ``` 接下来,我们需要配置Nuxt.js。我们可以在项目的根目录中创建一个`nuxt.config.js`文件来配置Nuxt.js。我们需要配置Nuxt.js的一些选项,例如页面路由、构建选项、插件等等。以下是一个简单的配置示例: ```javascript module.exports = { head: { title: 'CNode社区', meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, ], }, modules: ['@nuxtjs/axios'], axios: { baseURL: 'https://cnodejs.org/api/v1', }, plugins: ['~/plugins/vue-markdown.js'], }; ``` 在上面的配置中,我们设置了页面标题,设置了meta标签,使用了`@nuxtjs/axios`模块来发送HTTP请求,设置了API的基本URL,以及添加了一个Vue插件来渲染Markdown。 接下来,我们需要创建页面。在Nuxt.js中,每个`.vue`文件都可以作为一个页面,它们位于`pages`目录中。我们可以创建一个名为`index.vue`的文件来显示CNode社区的帖子列表。以下是`index.vue`的示例代码: ```html <template> <div> <h1>CNode社区</h1> <ul> <li v-for="post in posts" :key="post.id"> <router-link :to="'/post/' + post.id">{{ post.title }}</router-link> </li> </ul> </div> </template> <script> export default { asyncData({ $axios }) { return $axios.get('/topics').then((res) => { return { posts: res.data.data }; }); }, }; </script> ``` 在上面的代码中,我们使用了Vue.js的`v-for`指令来遍历每个帖子,并使用Vue.js的`router-link`组件来呈现帖子标题和链接。我们还使用了Nuxt.js提供的`asyncData`方法来在服务器端获取帖子列表。在这个方法中,我们使用了`$axios`模块来发送HTTP请求,获取帖子列表数据,并将其存储在`posts`变量中。 最后,我们需要启动应用程序。可以使用以下命令来启动: ``` npm run dev ``` 这将启动一个本地服务器,可以在浏览器中访问`http://localhost:3000`来查看我们的应用程序。 总结一下,通过Nuxt.jsVue SSR技术,我们可以快速创建一个CNode社区帖子列表的SSR应用程序。我们只需要简单地配置Nuxt.js,然后创建一个`.vue`文件作为页面,并使用`asyncData`方法来获取数据和渲染页面。 ### 回答2: Vue SSR服务端渲染是指在服务端Vue组件渲染为HTML,然后将其发送给浏览器进行展示。这种技术的好处是可以提高页面的渲染速度和SEO友好性。 Nuxt.js是一个基于Vue.js服务端渲染应用框架,它提供了很多方便的特性和工具,可以帮助我们快速开发和部署Vue SSR应用。 CNode社区是一个以Node.js为后端,Vue.js前端的技术社区。我们可以使用Nuxt.js来打造CNode社区的SSR应用,从而提升用户体验和搜索引擎的收录。 首先,我们可以使用Nuxt.js的CLI工具来初始化一个新的项目,选择SSR模式。然后,我们可以根据CNode社区的需求,创建相应的页面组件,如首页、帖子详情页、用户个人中心等。 在创建这些页面组件的过程中,我们可以使用Nuxt.js提供的一些特性,如动态路由、全局组件等,来简化开发和提升复用性。 在每个页面组件中,我们可以通过asyncData方法来获取数据,并将其作为组件的属性进行渲染。这样,我们就可以在服务端获取数据并渲染好HTML,然后将其发送到浏览器进行展示。 为了提高页面的加载速度,我们可以使用Nuxt.js的代码拆分功能,将不同页面的代码拆分成多个小块,并按需加载。这样,用户只需要加载当前页面所需的代码,可以减少页面的加载时间。 最后,我们可以使用Nuxt.js的部署工具来快速部署CNode社区的SSR应用。Nuxt.js支持将应用打包成静态文件,并可以轻松地部署到各种服务器或服务商上。 总结来说,通过深入学习Vue SSR服务端渲染,借助Nuxt.js框架,我们可以有效地打造CNode社区的SSR应用,提升用户体验和搜索引擎的收录,从而更好地为用户提供技术交流和资源分享的平台。 ### 回答3: Vue SSR(服务端渲染)是一种将Vue应用程序在服务器端进行渲染的技术。通过使用服务器端渲染,可以将静态HTML页面返回给客户端浏览器,从而提高首次加载速度和搜索引擎的抓取能力。而Nuxt.js是一个基于Vue SSR的框架,提供了一整套开箱即用的功能以快速构建Vue SSR应用程序。 在使用Nuxt.js构建CNode社区时,我们可以深入学习Vue SSR服务端渲染的原理和技巧。首先,我们需要了解Nuxt.js提供的目录结构和配置文件,这些会帮助我们更好地组织和管理前端开发流程。接下来,我们需要学习如何使用Nuxt.js的路由系统和异步数据获取功能,这些能帮助我们实现动态的页面渲染和数据预取。 在深入学习Vue SSR服务端渲染时,我们还需要了解服务器端渲染的优势和限制。通过SSR,我们可以提供更好的搜索引擎优化和用户体验,但也需要注意应用程序中可能出现的问题,比如对于某些浏览器不支持的特性、第三方库的兼容性和性能方面的考虑等。 除此之外,为了更好地打造CNode社区,我们还需要学习如何使用Nuxt.js的插件系统和组件库,以及如何与后端API进行交互和数据处理。通过深入学习Vue SSR服务端渲染和使用Nuxt.js打造CNode社区,我们可以提升自己的前端开发技能,并且能够快速构建出高效、可扩展的Vue SSR应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值