当前位置: 代码迷 >> 综合 >> Nuxt.js基础
  详细解决方案

Nuxt.js基础

热度:36   发布时间:2023-12-05 14:42:44.0

Nuxt.js 基础

Nuxt.js是什么

Nuxt.js 是一个基于Vue.js的通用应用框架
通过对客户端/服务端基础架构的抽象组织,Nuxt主要关注的是应用的UI渲染
可以基于它初始化新项目的基础结构,或者在已有的node.js中使用Nuxt.js Nuxt.js预设了利用Vue.js
开发服务端渲染所需要的各种配置 提供了一个命令: nuxt generate ,为基于Vue.js应用提供了生成对应静态站点的功能

Nuxt.js运作
Nuxt.js集成了 VUE + webpack + babel + Vue-Router + Vuex + Vue ssr + Vue-Meta

Nuxt.js 的作用

  • 服务端渲染(通过SSR)
  • 单页应用程序(SPA)
  • 静态化(预渲染)

Nuxt.js 的使用方式

初始化项目
已有的Node.js服务端项目

  • 直接把Nuxt当做一个中间件集成到Node Web Server中

现有的Vue.js项目

  • 非常熟悉Vue.js项目

  • 至少有百分之10的代码改动

官方文档: https://zh.nuxtjs.org/guide/installation

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

从头新建项目

mkdir 文件名
npm init -y
npm i nuxt
package增加 script配置 “dev”:“nuxt”
,通过npm run dev 启动项目
新建pages目录下index.vue文件,表示网站的首页
新建about.vue ,会自动编译

index.vue

<template><div><h1>hello nuxt</h1></div>
</template><script>
export default{
    name:'HomePage'
}
</script>  

基础

git init
新增 .gitignore 新增 node_modules .nuxt 排除提交文件

Nuxt.js 基础路由

Nuxt.js 依据pages 目录结构自动生成vue-router模块的路由配置 页面之间跳转 ,建议使用 标签
新建pages/user/index.vue 可以直接访问locahost:3000/user user下新增abc组件,访问
localhost:3000/user/abc
.nuxt文件夹下会生成router.js
,就是对应的路由规则,引入vue,vue-router

路由-路由导航

实现方式

  • a 标签:不友好,会刷新整个页面,不建议使用
  • nuxt-link 组件,使用和Vue的router-link使用基本一样
    编程式导航:js跳转路由,使用和vue编程导航一致

实现
about.vue

<template><div><h1>About page</h1><!-- a链接实现,刷新导航,走服务端渲染 --><a href="/">首页</a><!-- router-link 导航链接组件 --><router-link to="/">首页</router-link><!-- 编程式导航 --><button @click="onClick">首页</button></div>
</template>
<script>
export default {
    name: "AboutPage",methods:{
    onClick(){
    this.$router.push('/')}}
}
</script>

路由-动态路由

Vue Router 动态路由匹配
vue中使用/:id 方式 Nuxt.js 动态路由
在nuxt.js里面定义带产生的动态路由,需要创建对应的以下划线作为前缀的Vue文件 或 目录 例如user 下 新建 _id.vue
id是对应动态参数 在地址栏跳转 localhost:3000/user/1, localhost:3000/user/2
或是其他数字都可以跳转到_id.vue

_id.vue

<template><div><h1>user page</h1><p>{
    {
    $route.params.id}}</p></div>
</template>
<script>
export default {
    name:"userPage"
}
</script>

路由-嵌套路由

nuxt.js嵌套路由同 vue中的嵌套路由 创建内嵌子路由, 你需要添加一个Vue文件,同时添加一个
与该文件同名的子目录用来存放子视图组件 需要添加 占位符存放子路由出口
pages文件夹下 新建user.vue
访问localhost:3000/user 会渲染user下index.vue
访问localhost:3000/user/abc.vue 渲染user下abc.vue

自定义路由配置

增加nuxt.config.js文件配置

extendRoutes :类型function
希望扩展Nuxt.js创建的路由,可以通过extendRoutes选项执行此操作
添加自定义路由

/*** Nuxt.js 配置文件 * * 需要使用node.js中module规范* */
module.export={
    router:{
    // // abc 成为默认路径// base:"/abc"extendRoutes(routes,resolve){
    routes.push({
    name:'/hello',path:'hello',component:resolve(__dirname,'pages/about.vue')})}}
}

视图 - 模板

在这里插入图片描述
视图一般由三部分组成:

  • 第一层是外层的document的html
  • 第二层是可选的Layout组件,相当于所有页面的父路由
  • 第三层是page,是自定义的组件
    如果自定义默认的html模板,在src文件夹下新建 app.html
<!DOCTYPE html>
<html {
    {
     HTML_ATTRS }}><head {
    {
     HEAD_ATTRS }}>{
    {
     HEAD }}</head><body {
    {
     BODY_ATTRS }}><!--渲染的内容最终会注入到这里-->{
    {
     APP }}</body>
</html>

视图 - 布局

Layout:页面模板和具体页面之间加入的布局组件
使用
通过添加layouts/default.vue 文件来拓展应用的默认布局
在布局文件在需要添加 组件显示页面的主题内容

<template><div><nuxt /></div>
</template>
<script>
export default {
    name:"LayoutPage"
}
</script>

异步组件

基本用法

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

注意事项

  1. 只能在页面组件中使用
  2. 没有this,因为它是在组件初始化之前被调用的
<template><div><h1>{
    {
     title }}</h1><nuxt-link to="/about">About</nuxt-link><br><foo :posts="posts" /></div>
</template><script>
import axios from 'axios'export default {
    name: 'HomePage',// 当你想要动态页面内容有利于 SEO 或者是提升首屏渲染速度的时候,就在 asyncData 中发请求拿数据async asyncData () {
    console.log('asyncData')console.log(this)const res = await axios({
    method: 'GET',url: 'http://localhost:3000/data.json'})return res.data},// 如果是非异步数据或者普通数据,则正常的初始化到 data 中即可data () {
    return {
    foo: 'bar'}}
}
</script>

异步数据 - 上下文对象

Foo.vue

<template><div><h1>FooPage</h1><ul><liv-for="item in posts":key="item.id"><nuxt-link :to="'/article/' + item.id">{
    {
     item.title }}</nuxt-link></li></ul></div>
</template><script>
export default {
    name: 'FooPage',props: ['posts'],// async asyncData () {
    // console.log('foo asyncData')// return {
    // foo: 'bar'// }// }
}
</script><style></style>

index.vue

<template><div><h1>{
    {
     title }}</h1><nuxt-link to="/about">About</nuxt-link><br><foo :posts="posts" /></div>
</template><script>
import axios from 'axios'
import Foo from '@/components/Foo'export default {
    name: 'HomePage',components: {
    Foo},// 当你想要动态页面内容有利于 SEO 或者是提升首屏渲染速度的时候,就在 asyncData 中发请求拿数据async asyncData () {
    console.log('asyncData')console.log(this)const res = await axios({
    method: 'GET',url: 'http://localhost:3000/data.json'})return res.data},// 如果是非异步数据或者普通数据,则正常的初始化到 data 中即可data () {
    return {
    foo: 'bar'}}
}
</script><style></style>

_id.vue

<template><div><h1>{
    {
     article.title }}</h1><div>{
    {
     article.body }}</div></div>
</template><script>
import axios from 'axios'export default {
    name: 'ArticlePage',// Nuxt 中特殊提供的钩子函数,专门用于获取页面服务端渲染获取async asyncData (context) {
    console.log(context)const {
     data } = await axios({
    method: 'GET',url: 'http://localhost:3000/data.json'})const id = Number.parseInt(context.params.id)// 这返回的数据会和data(){}中的数据合并到一起给页面使用return {
    article: data.posts.find(item => item.id === id)}}
}
</script><style></style>