普通视图

发现新文章,点击刷新页面。
昨天 — 2026年1月22日首页

nuxt 配 modules模块 以及 数据交互

作者 江湖文人
2026年1月22日 18:26
  • 类型 Array

modulesNuxt.js扩展,可以扩展它的核心功能并添加无限。

例如(nuxt.config.js):

export default {
  modules: [
    // Using package name
    '@nuxtjs/axios',
    
    // Relative to your project srcDir
    '~/modules/awesome.js',
    
    // Providing options
    ['@nuxtjs/google-analytics', { ua: 'X1234567' }],
    
    // Inline definition
    function() {}
  ]
}

安装过程中,它会让我们选择模块。

image.png

Axios - Promise based HTTP client

// nuxt.config.js
{
  modules: [
    '@nuxtjs/axios' // 前面安装nuxtjs的时候没选,也可以后续一条命令去装上去 ==> npm install @nuxtjs/axios -initial-scale
  ]
}

// 笔记.html

一、安装nuxt的axios
    1.1 npm install @nuxtjs/axios -S
    1.2 nuxt.config.js进行配置
    
    modules: [
      '@nuxtjs/axios',
    ]

二、安装axios
    2.1 npm install axios -S
    

在每一个页面中或者每个component中用axios。

<template>
  <div>页面</div>
</template>

<script>
import axios from 'axios'
export default {
  name: 'IndexPage'
}
</script>

在nuxt中如何请求接口。两种方式:

异步数据

请求接口一定是首先先把服务器端的接口拿到了。然后再打开页面,这个时候源代码中就有接口数据了。那这个时候蜘蛛就可以爬取到这个数据了。如果还是像vue一样,这个页面打开了,再把数据返回来,那蜘蛛就抓取不到了。

在页面中有一个生命周期。叫asyncData

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

asyncData

这个是个生命周期。

asyncData方法会在组件(限于页面组件)每次加载之前被调用。可在服务端或路由更新之前被调用。

在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,可以用asyncData方法来获取数据,

三、asyncData生命周期 || 方法
  
  pages 目录中的页面组件才可以去用
  
    ***注意components内的.vue文件是不可以使用的。
  
// index.vue
<template>
  <div>首页</div>
</template>

<script type="text/script">
export default {
  data() {},
  asyncData(app) {
    console.log(app)
  }
}
</script>

可以看到,app对象下面有一个$axios

在控制台,和在服务端都可以打印出来。

所以也可以这样子写:

// index.vue
<template>
  <div>首页</div>
</template>

<script type="text/script">
export default {
  data() {},
  asyncData({ $axios }) {
    console.log($axios)
  }
}
</script>

这样子就可以去请求接口,放进去。

接口给过来,都是后端代码上面去解决跨域问题。至于nuxt如何解决跨域,待会说。

这里写一个async 和 await

// pages/index.vue
<template>
  <div>首页</div>
</template>

<script>
export default {
  name: 'IndexPage',
  async asyncData({ $axios }) {
    const res = await $axios('后端给的接口地址')
    console.log(res)
  }
}
</scirpt>

拿到数据之后呢,要把数据渲染到也米娜上,如果是vue的话,

// pages/index.vue
<template>
  <div>
    <ul>
      <li v-for='item in list' :key='item.id'>
        {{ item.imageName }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'IndexPage',
  data () {
    return {
      list: []
    }
  },
  async asyncData({ $axios }) {
    const res = await $axios('后端给的接口地址')
    const list = res.data
    console.log(res)
    // 要这样
    return { list }
    // 不要这样
    this.list = list
  }
}
</scirpt>

按照vue来讲,这上面完全没问题,但是nuxt中不行。其实不是nuxt不行,而是asyncData不行,在asyncData中是不能写this的,因为在asyncData中this是undefined。

注意:在asyncData中没有this

其实在这个地方,有写到,说要return。说白了,nuxt.js会将asyncData返回的数据融合组件data方法返回的数据并返回给当前组件。

其实就是data () { return { list: [] } },和asyncData里面的return 合并数据,然后。

然后重新去看页面,就可以看到页面生效了。

fetch

还有方式请求接口。

四、fetch生命周期 || 方法

首先fetch是在aysncData之后的生命周期,然后fetch也有参数({ $axios }),它也是当前组件的上下文,所以这里的$axios也有接口请求,

// pages/index.vue
<template>
  <div>
    <News />
    <ul>
      <li v-for='item in list' :key='item.id'>
        {{ item.imageName }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'IndexPage',
  data () {
    return {
      list: [],
      items: []
    }
  },
  async asyncData({ $axios }) {
    const res = await $axios('后端给的接口地址')
    const list = res.data
    console.log(res)
    // 要这样
    return { list }
    // 不要这样
    this.list = list
  },
  // 注意fetch里面是可以有this的
  async fetch({ $axios }) {
    const res = await $axios('后端给的接口地址')
    const list = res.data
   
    this.items = list
  }
}
</scirpt>

不过在页面上能拿到数据,不过在template上打印出来是空数组。所以说在页面级的请求用asyncData。

四、fetch生命周期 || 方法
  fetch是有this的

components下创建个News.vue:

<template>
  <div>111</div>
</template>
<script>
export default {
  // 注意fetch里面是可以有this的
  async fetch({ $axios }) {
    const res = await $axios('后端给的接口地址')
    const list = res.data
   
    this.items = list
  }
}
</script>

刚刚提到的一点,asyncData在页面级别的组件是可以拿到的,可以执行的,在某个组件中,component中。asyncData是不能用在component上的,那它这种只能引入fetch,必须用fetch。

fetch方法用于在渲染页面前填充应用的状态树(store)数据,与asyncData方法类似,不同的是它不会设置组件的数据。

四、fetch生命周期 || 方法
  fetch是有this的

components下创建个News.vue:

<template>
  <div>111</div>
</template>
<script>
export default {
  // 注意fetch里面是可以有this的
  async fetch({ $axios }) {
    // 在组件中,这里是没有$axios的,
    const res = await $axios('后端给的接口地址')
    const list = res.data
   
    this.items = list
  }
}
</script>
<template>
  <div>
      111
      {{ list }}
  </div>
</template>
<script>
export default {
  data () {
    return {
      list
    }
  },
  // 注意fetch里面是可以有this的
  async fetch() {
    // 正确
    const res = await this.$axios('后端给的接口地址')
    const list = res.data
    this.list = list
  }
}
</script>

nuxt配置之head动态配置

作者 江湖文人
2026年1月22日 11:05

讲一下nuxt中的配置,那么首先的配置文件是nuxt.config.js,那么也就是说在我们的项目的根目录的一个nuxt.config.js文件。然后大家需要明确的一点就是这个文件的所有的配置,是全局配置。

image.png

head来说,那我们知道nuxt它是可以解决seo的部分问题的。比如说它可以解决每个网页都有他自己所独有的title描述以及关键字。那如果说我这里有很多页面,到那时呢我都没有进行配置,那这个时候就会走全局的配置。

当然,如果某个页面配置了,就会走独有的页面的head。

pages里边新建一个页面。比如list.vue

<template>
  <div>列表页</div>
</template>

然后一个about页面

<template>
  <div>关于页</div>
</template>

所有页面的title全是页面的项目名。因为这些页面都没有独有的head配置。所以如果想要做针对单独页面的配置。那应该怎么去配置呢?

可以注意一下写法,参考文档这个api有一个head的单篇介绍。只不过文档写得不是特别的完整。

在全局是head的一个对象,然后在单独页面就是一个head的一个函数。

image.png

image.png

动态title

做动态title标题。包括描述或者关键词可能都是动态的。

然后呢现在我们做的是点击每一个进入到这个文章的详情页。

/pages/news/index.vue

<template>
  <div>
    <h1>新闻列表</h1>
    <ul>
      <li 
        v-for='item in newList' 
        :key='item.id'
        @click='goDetail(item.id)'
      >
        {{item.title}}
      </li>
    </ul>
  </div>
</template>

<script type="text/javascript">
export default {
  data() {
    return {
      newList: [
        { id: 1, title: '111' },
        { id: 2, title: '222' },
        { id: 3, title: '333' },
        { id: 4, title: '444' },
        { id: 5, title: '555' },
      ]
    }
  },
  methods: {
    goDetail(id) {
      this.$router.push({
        path: `/news/${id}`
      })
    }
  }
}
</script>
// _id.vue
<template>
  <div>
    {{ id }} 新闻的详情页
  </div>
</template>

<script type="text/javascript">
export default{
  head() {
    return {
      title: this.id,
      meta: [
        { hid: 'description', name: 'description', content: '此处是网站描述' },
        { hid: '', name: 'keywords', content: '此处是网站关键词' }
      ]
    }
  },
  data () {
    return {
      id: 0
    }
  },
  created() {
    this.id = this.$route.params.id
  }
}
</script>

总结

head 可以全局配置,也可以局部配置,也可以动态配置。

昨天以前首页

Nuxt 写后端

作者 江湖文人
2026年1月17日 09:22

写接口

// server/api/test.ts

export default defineEventHandler(async (event) => {
  // 写这个接口的逻辑
})

可以直接返回textjsonhtmlstream(文件流等流)

放心好了,nuxt支持热模块替换和自动导入。改代码直接看到效果。无需手动写import语句。

// vue
<script setup>
// 要写import
import { ref } from 'vue'
import MyButton from '@/components/MyButton.vue'
import { useFetch } from '@/composables/useFetch'

const count = ref(0)
const { data } = useFetch('/api/data')
</script>

<template>
  <MyButton>点击</MyButton>
</template>

Nuxt的自动导入

<script setup>
const count = ref(0) // 自动从`vue`导入ref
const { data } = useFetch('/api/data') // 自动从 composables/ 导入
</script>

<template>
  <MyButton>点击</MyButton>
</template>

Nuxt自动导入了哪些

  • Vue APIrefcomputedonMounted

  • Nuxt ComposablesuseFetchuseAsyncData

  • Vue RouteruseRouteruseRoute

  • 组件components/目录下的所有组件

  • 工具函数utils/composables/目录下的函数

  • VueUse:如果安装了@vueuse/nuxt

<template>
  <div>
    <h1>{{ title }}</h1>
    <MyComponent />
  </div>
</template>

<script setup>
// 1. 不需要导入 MyComponent - 自动导入
// 2. 修改后页面局部更新 - HMR
const title = ref('欢迎') // ref 也是自动导入的
</script>

部署 - 通用

云服务器构建Nuxt应用

  • Cloudflare
  • Netlify
  • Edge

混合渲染

自定义路由

// nuxt.config.ts

export default defineNuxtConfig({
  routeRules: {
    // 为 SEO 目的在构建时生成
    '/': { prerender: true },
    '/api/*': { cache: { maxAge: 60 * 60 } },
    '/old-page': {
      redirect: { to: '/new-page', statusCode: 302 }
    }
  }
})

目录结构

  • 通过nuxt.configapp.config在项目之间共享可重用的配置预设。
  • components/目录做组件库。
  • composables/utils/目录创建工具和组合式函数库。
  • layers/目录做项目的层

每个层的srcDir都会自动创建命名的层别名。可以用#layers/test访问~~/layers/test层。

也可以自定义nuxt.config文件去设置添加extends去加一个层:

// nuxt.config.ts

export default defineNuxtConfig({
  extends: [
    '../base', // 从本地层去加
    '@my-themes/awesome', // 从安装的包去加
    'github:my-themes/awesome#v1' // 从git库中加
  ]
})

github私有库的要加token

// nuxt.config.ts

export default defineNuxtConfig({
  extends: [
    '../base', // 从本地层去加
    '@my-themes/awesome', // 从安装的包去加
    ['github:my-themes/awesome#v1': { auth: process.env.GITHUB_TOKEN }] // 从git库中加
  ]
})

起别名

// nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    [
      'github:my-themes/awesome',
      { 
        meta: {
          name: 'my-awesome-theme',
        },
      },
    ],
  ]
})

预渲染

Nuxt允许页面在构建时进行静态渲染,提高SEO。

为啥选Nuxt。它SEO优秀啊。在应用中,我们可以选几个页面在构建时进行渲染。有请求时,Nuxt会提供预构建的页面,而不是动态生它们。

基于爬取的预渲染

nuxt generate命令。通过Nitro爬虫去建和预渲染应用。

建站点,启动一个nuxt实例。

选择性预渲染

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    prerender: {
      routes: ["/user/1", "/user/2"],
      ignore: ["/dynamic"],
    },
  },
});
❌
❌