mode 属性

  • spa 没有服务器端渲染(只有客户端导航)
  • universal 默认 同构应用(服务端渲染+客户端导航)

此属性已被弃用,请使用 ssr: false || true 代替

  1. // nuxt.config.js
  2. {
  3. //...
  4. ssr: true, // 默认是true 代替 mode = universal
  5. //...
  6. }

Middleware

nuxt Middleware 执行时机

  1. 当第一次访问nuxt的应用时或刷新页面时
  2. 在pages/.vue / layouts/.vue 配置了 Middleware时,并跳转到对应路由时
    nuxt.config.js 配置了 ssr:false 时 在两种情况下都会在客户端调用中间件

您可以通过在middleware/ 目录中创建一个文件来创建命名中间件 ,文件名将是中间件名称。
中间件将按以下顺序依次执行:

  1. nuxt.config.js (按文件内的顺序)
  2. 匹配的布局
  3. 匹配的页面

中间件可以是异步的。为此,请返回 a Promise 或使用 async/await。

  1. // middleware/stats.js
  2. import http from 'http'
  3. export default function ({ route }) {
  4. return http.post('http://my-stats-api.com', {
  5. url: route.fullPath
  6. })
  7. }
  8. // nuxt.config.js
  9. export default {
  10. router: {
  11. middleware: ['stats']
  12. }
  13. }
  14. // pages/index.vue / layouts/default.vue
  15. export default {
  16. middleware: ['stats']
  17. }
  1. // 匿名中间件
  2. <template>
  3. <h1>Secret page</h1>
  4. </template>
  5. <script>
  6. export default {
  7. middleware({ store, redirect }) {
  8. // If the user is not authenticated
  9. if (!store.state.authenticated) {
  10. return redirect('/login')
  11. }
  12. }
  13. }
  14. </script>

plugins

plugins 目录包含要在实例化根 Vue.js 应用程序之前运行的 JavaScript 插件。需要配置nuxt.config.js
注意,插件默认会在服务器端和客户端都执行,想要区分他的话

  1. export default {
  2. plugins: [
  3. '~/plugins/foo.client.js', // only in client side
  4. '~/plugins/bar.server.js', // only in server side
  5. '~/plugins/baz.js', // both client & server
  6. { src: '~/plugins/client-only.js', mode: 'client' }, // only on client side
  7. { src: '~/plugins/server-only.js', mode: 'server' } // only on server side
  8. ]
  9. }
  1. // plugins/axios.js
  2. export default function ({ $axios, redirect }) {
  3. $axios.onError(error => {
  4. if (error.response.status === 500) {
  5. redirect('/sorry')
  6. }
  7. })
  8. }
  9. // nuxt.config.js
  10. module.exports = {
  11. modules: ['@nuxtjs/axios'],
  12. plugins: ['~/plugins/axios.js']
  13. }
  14. // pages/index.vue
  15. <template>
  16. <h1>{{ post.title }}</h1>
  17. </template>
  18. <script>
  19. export default {
  20. async asyncData ({ $axios, params }) {
  21. const post = await $axios.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
  22. return { post }
  23. }
  24. }
  25. </script>
  1. // plugins/vue-tooltip.js
  2. import Vue from 'vue'
  3. import VTooltip from 'v-tooltip'
  4. Vue.use(VTooltip)
  5. export default {
  6. plugins: ['~/plugins/vue-tooltip.js']
  7. }
  1. export default {
  2. extendPlugins(plugins) { // 调整plugins顺序
  3. const pluginIndex = plugins.findIndex(
  4. ({ src }) => src === '~/plugins/shouldBeFirst.js'
  5. )
  6. const shouldBeFirstPlugin = plugins[pluginIndex]
  7. plugins.splice(pluginIndex, 1)
  8. plugins.unshift(shouldBeFirstPlugin)
  9. return plugins
  10. }
  11. }

plugin Inject

  1. // plugins/hello.js
  2. export default ({ app }, inject) => {
  3. // Inject $hello(msg) in Vue, context and store.
  4. inject('hello', msg => console.log(`Hello ${msg}!`))
  5. }
  6. // nuxt.config.js
  7. export default {
  8. plugins: ['~/plugins/hello.js']
  9. }
  10. // demo.vue
  11. export default {
  12. mounted() {
  13. this.$hello('mounted')
  14. // will console.log 'Hello mounted!'
  15. },
  16. asyncData({ app, $hello }) {
  17. $hello('asyncData')
  18. // If using Nuxt <= 2.12, use 👇
  19. app.$hello('asyncData')
  20. }
  21. }
  22. // store/index.js
  23. export const state = () => ({
  24. someValue: ''
  25. })
  26. export const actions = {
  27. setSomeValueToWhatever({ commit }) {
  28. this.$hello('store action')
  29. const newValue = 'whatever'
  30. commit('changeSomeValue', newValue)
  31. }
  32. }

Store

nuxt会自定去读store目录,目录中的每个 .js 文件都 store被转换为一个 命名空间模块 (index 作为根模块)

  1. // 可以通过在store/index.js里面加入plugins
  2. // import myPlugin from 'myPlugin'
  3. // export const plugins = [myPlugin]
  4. // 可以关闭严格模式
  5. // export const strict = false
  6. // store/count.js 使用 this.$store.state.count.counter
  7. export const state = () => ({
  8. counter: 0
  9. })
  10. export const mutations = {
  11. increment(state) {
  12. state.counter++
  13. }
  14. }
  15. export const actions = {
  16. // 如果 nuxtServerInit 在 store 中定义了 action 并且 mode 为 universal,Nuxt.js 将使用上下文调用它(仅从服务器端)。当我们想要直接提供给客户端的服务器上有一些数据时,它很有用。
  17. async nuxtServerInit({ commit, dispatch }, { req }) {
  18. if (req.session.user) {
  19. commit('user', req.session.user)
  20. }
  21. await dispatch('core/load')
  22. }
  23. }

预取链接 提前加载 prefetch

Nuxt.js 自动包含智能预取。

  1. <!-- 禁用 prefetch -->
  2. <NuxtLink to="/about" no-prefetch>About page not prefetched</NuxtLink>
  3. <NuxtLink to="/about" :prefetch="false">About page not prefetched</NuxtLink>
  1. // nuxt.config.js
  2. export default {
  3. router: {
  4. prefetchLinks: false // 全局禁用prefetch
  5. // 如果全局禁用了 可以用下面的语句做独立的prefetch
  6. // <NuxtLink to="/about" prefetch>About page prefetched</NuxtLink>
  7. }
  8. }

仅客户端组件

只在客户端被执行

如果您使用的是 Nuxt < v2.5.0版本和vue 版本 < v2.6.0,请使用已弃用的语法而不是

如果您使用的是 Nuxt < v2.9.0 版本,请使用代替

  1. <template>
  2. <div>
  3. <sidebar />
  4. <client-only placeholder="Loading...">
  5. <!-- this component will only be rendered on client-side -->
  6. <comments />
  7. </client-only>
  8. </div>
  9. </template>

有时在服务器渲染网页$refs内可能不会甚至准备好$nextTick,关键可能是调用$nextTick几次:

需要注意 this.$nextTick

  1. mounted(){
  2. this.initClientOnlyComp()
  3. },
  4. methods: {
  5. initClientOnlyComp(count = 10) {
  6. this.$nextTick(() => {
  7. if (this.$refs.myComp) {
  8. //...
  9. } else if (count > 0) {
  10. this.initClientOnlyComp(count - 1);
  11. }
  12. });
  13. },
  14. }

build dir

.nuxt目录就是所谓的构建目录

  1. // nuxt.config.js
  2. export default {
  3. buildDir: 'nuxt-dist', // 可以通过此选项修改.nuxt的名称,但是记得修改.gitignore文件夹防止它被渲染
  4. }

.nuxt 文件夹中:

  • router.js 文件是当您将.vue文件放入 pages 文件夹时 Nuxt.js 为您生成的生成的路由器文件。当您想查找为 vue-router 生成哪些路由并找出特定路由的名称时,您可以使用此文件进行调试。
  • router.scrollBehavior.js 是你的 Router ScrollBehavior
  • Components 文件夹包含所有 Nuxt 组件,例如 NuxtChild 和 NuxtLink。它还包含 nuxt-build-indicator,它是我们在构建应用程序时看到的页面,以及 nuxt-loading,它是我们等待页面加载时看到的加载组件。您还将在此处找到 nuxt-error 页面,其中包含 Nuxt 默认错误页面。
  • mixins 文件夹包含 Nuxt$fetch方法所需的文件。
  • views 文件夹包含您的应用程序模板和您的服务器错误页面。
  • app.js 是您的主要应用程序文件。
  • client.js 文件是客户端发生的所有事情所需的客户端文件。
  • 对于无操作别名,空文件有意留空
  • index.js 文件引导您的应用程序。
  • loading.html 是页面加载时使用的文件。
  • 中间件文件是保存中间件的地方
  • server.js 文件是在服务器上运行的所有代码
  • 实用程序包含 Nuxt 工作所需的实用程序。