nuxt踩坑集

2023-05-16

目录结构

assets: 资源文件。用于组织未编译的静态资源如 LESS、SASS或 JavaScript。
components: 组件。
layouts: page: 模板页面,默认为 default.vue可以在这个目录下创建全局页面的统一布局,或是错误处理页面页,需要提供一个nuxt 标签,类似于router-view
middleware: 中间件,放置自定义的中间件,会在加载组件之前调用。可以在页面中调用: middleware: ‘中间件名称’。
pages: 页面,index.vue 为根页面,Nuxt.js 框架读取该目录下所有的 .vue文件并自动生成对应的路由配置,如需要动态参数id,则可以添加_id的文件,必须是下划线加参数名。
plugin: 插件,用于组织那些需要在 根Vue.js应用实例化之前需要运行的 Javascript 插件。
static: 静态文件,静态文件目录 static用于存放应用的静态文件,此类文件不会被 Nuxt.js 调用 Webpack 进行构建编译处理。
store: 用于组织vuex状态管理。具体使用请移步至 官网。
nuxt.config.js: nuxt.config.js文件用于组织Nuxt.js 应用的个性化配置,配置head,loading,css,plugins等。

Nuxt.js生命周期

在这里插入图片描述

  1. incoming Request 浏览器发出的请求)
  2. nuxtServerInit 服务端接受请求后,要检查当前有没有 nuxtServerInit配置项,如果有就执行这个函数
  3. store action 用来操作vuex
  4. middleware 可以做jWT等一些操作。
  5. validate() 检验参数,参数检验失败,可以在layout里的error里面进行捕捉。
  6. asyncData()& fetch() asyncData用来渲染组件,fetch用来渲染vuex
  7. Render

Nuxt扩展以后的生命周期和方法以下:

beforeCreate: ƒ beforeCreate()
components: {NuxtLoading: {…}}
computed: {isOffline: ƒ}
context: {isStatic: false, isDev: true, isHMR: true, app: {…}, payload: undefined, …}
created: ƒ created()
data: ƒ data()
head: {title: "nuxt-meituan-ssr", meta: Array(3), link: Array(1), style: Array(0), script: Array(0)}
methods: {refreshOnlineStatus: ƒ, refresh: ƒ, errorChanged: ƒ, setLayout: ƒ, loadLayout: ƒ}
mounted: ƒ mounted()
nuxt: {…}
render: ƒ render(h, props)
router: VueRouter {app: Vue, apps: Array(1), options: {…}, beforeHooks: Array(2), resolveHooks: Array(0), …}
watch: {nuxt.err: "errorChanged"}

注意:

Vue.js生命周期的钩子只有beforeCreate和created会在服务端和客户端渲染。
以上生命周期里都获取不到window对象。
asyncData和fetch我们可以拿到数据,不要尝试挂载数据到data上,此时获取不到this对象。

开发总结

如何修改默认启动端口?

可以在nuxt.config.js下面修改配置,如下。

  "server":{
    "host":"127.0.0.1",
    "port":"3304"
  }

如何添加全局的样式?

可以在assets里添加全局Css文件,如在assets下的Css文件夹目录下添加了一个index.css文件,然后在nuxt-config.js里配置该css文件路径即可。 css:[’~assers/css/index.css’]

通过别名访问图片在template里是正确的,为何在Css设置背景图却报错?

在css配置的是,需要将’~/‘后面的’/'去除掉。

<img src="~/static/logo.jpg"/> 
backround-image:url('~static/logo.jpg');

如何添加路由动画?

同样,我们在Css文件里添加一些动画代码,一般样式会在其后面添加-active和-leave-active,其实和Vue动画形式一致。其中以page开头的动画,默认会作用于全部页面,如果想给特定的页面加动画,可以在对应的页面script里引用,如 transitions: 'bounce’即可。

.page-enter-active, .page-leave-active {
  transition: opacity .3s
 }
 .page-enter, .page-leave-active {
  opacity: 0
 }
 .bounce-enter-active {
  animation: bounce-in .8s;
 }
 .bounce-leave-active {
  animation: bounce-out .5s;
 }
 @keyframes bounce-in {
  0% { transform: scale(1) }
  50% { transform: scale(1.01) }
  100% { transform: scale(1) }
 }
 @keyframes bounce-out {
  0% { transform: scale(1) }
  50% { transform: scale(1.01) }
  100% { transform: scale(1) }
 }

路由参数如何传递?

同Vue-router,有声明式和编程式两种方式,无非是标签变成了 router.push(…)

nuxt-link :to="{name:'article',params:{id:1234}}" >声明式</nuxt-link>
// 编程式
this.$router.push({
  name:'article',
  params:{
    id:1234
  }
})

动态路由如何进行参数检验?

Nuxt.js提供了一个validate的生命周期钩子,可以在此进行参数的校验。以文章详情校验id为例,我们需要判断传入的id是否是数字,可以像下面这样处理。

validate({ params }) {
 return /^\d+$/.test(params.id)
}

如何添加404等错误页面?

可以在layout下新建一个error.vue页面,内容如下,当访问一个不存在的页面的时候,或者参数检验失败的时候,或者我们在middleware中间件处理抛出异常的时候,都会跳转到该页面。

<template>
 <div class="container">
  <h1 v-if="error.statusCode === 404">页面不存在</h1>
  <h1 v-else>应用发生错误异常</h1>
  <nuxt-link to="/">首 页</nuxt-link>
 </div>
</template>
 
<script>
export default {
 props: ['error'],
 layout: 'blog' // 指定模板页面
}
</script>

middleware中的文件抛出错误

export default function({ store, error, redirect }) {
  if (!store.state.user.userInfo.auth) {
      error({
       message: '没有权限哦!',
      statusCode: 403
     })
  }
}

顶部进度条如何设置?

loading 属性配置 可以在nuxt-config.js设置loading的颜色,使用了this. loading可能无法在created里立即使用。此种配置loading有严重的缺陷,无法知道真正的加载进度。也可以自定义加载组件,loading: ‘~components/loading.vue’。

export default {
	 mounted () {
		  this.$nextTick(() => {
			   this.$nuxt.$loading.start()
			   setTimeout(() => this.$nuxt.$loading.finish(), 500)
		  })
	 }
 }

异步数据如何获取?

Nuxt.js提供了两个函数,asyncData和fetch函数。asyncData 获取组件的数据,fetch 在渲染页面之前获取数据填充应用的状态树(store)。

asyncData可以使用promise也可以使用async函数,记住,此时返回的东西需要用一个对象进行包裹,不能挂载到data里,此时没有this对象。

// 方式一
 asyncData({ app,params,route,query,error}) {
   return getUserlist({}).then(res => {
    let user = [];
     user = res.list
     console.log(user,'user')
     return {user}
    })
     .catch(err => {
      console.log(err)
    })
},
 
// 方式二
async asyncData({ app }) {
  let data = await getUserlist({});
  let user = data.list;
  return { user }
}

fetch函数同上,可以使用promise也可以使用async函数,通常会commit一个mutation。

export default {
 fetch ({ store, params }) {
  return axios.get('http://my-api/stars')
  .then((res) => {
   store.commit('setStars', res.data)
  })
 }
}
</script>

// 或者使用 async 或 await 的模式简化代码如下:
<template>
 <h1>Stars: {{ $store.state.stars }}</h1>
</template>
 
<script>
export default {
 async fetch ({ store, params }) {
  let { data } = await axios.get('http://my-api/stars')
  store.commit('setStars', data)
 }
}
</script>

如何动态修改title的内容?

如果是写死的,可以直接修改head的配置。

head() {
 return {
  // title: '',这里一旦声明,在asyncdata里修改也不起作用,直接以这个为准
  meta: [
   {
    hid: 'description', // nuxt.config 替换唯一标识 hid  { hid: 'description', name: 'description', content: 'Nuxt.js project' }
    name: 'content',
    content: '文章详情'
   }
  ]
 }
},

如果是动态数据从数据源里获取,然后通过asynData里的app对象,动态修改head的title。

asyncData({ app, params }) {
 const id = params.id;
 return getArticleDetail({ id })
  .then(result => {
     app.head.title = result.title;
  })
  .catch(err => {})
}

如何进行权限JWT验证?

登录成功以后,我们会在cookie和Vuex中缓存token信息,当界面刷新的时候,会走store里的nuxtServerInit 函数,该函数仅在每个服务器端渲染中运,可以使用req.headers.cookie获取浏览器的cookie,再次更新store里的值,接着会走到中间件,中间件进行验证,如果有token信息则继续,没有则跳转到登录页。

  1. 为什么要在nuxtServerInit更新store的值?
    需要在middleware里使用,否则刷新后store里的值为空了。
  2. 客户端调用接口可以拿到token,服务器端如何拿到?
    可以通过nuxtServerInit里的req拿到请求信息的cookie,然后请求接口。
  3. 前后端分离,刷新的时候如何保证用户名、token等信息依然存在?
    可以像上面一样,每次取cookie的值再次更新store,但这样有一个问题,cookie可能会被篡改,后端代码需要做验证。也可以每次刷新重新通过token请求接口,更新用户信息。

store代码

import Vue from 'vue';
import Vuex from 'vuex';
import user from './modules/user';
import { COOKIE_KEY } from '~/assets/js/constant.js';
Vue.use(Vuex);
const store = () =>
  new Vuex.Store({
    modules: {
      user
    },
    actions: {
      async nuxtServerInit({ commit, dispatch }, { req, app }) {
        if (req.headers.cookie) {
          let parsedResult = {};
          req.headers.cookie.split(';').forEach(cookie => {
            const currentCookie = cookie.split('=');
            parsedResult[currentCookie[0].trim()] = (currentCookie[1] || '').trim();
          });
          const userInfo = {
            name: parsedResult[COOKIE_KEY.NAME],
            token: parsedResult[COOKIE_KEY.TOKEN]
          };
          commit('user/setUserInfo',userInfo);
        }
      }
    }
  });

export default store;
中间件代码

export default function({ store, error, redirect }) {
  if (!store.state.user.userInfo.token || !store.state.user.userInfo.name) {
    //  error({
    //   message: 'You are not connected',
    //   statusCode: 403
    //  })
    redirect('/');
  }
}

nginx部署

npm run build
选择build以后的四个文件: .nuxt, static, nuxt.config.js, package.json上传到服务器。
pm2 pm2 start npm --name ‘package.json.name’ – run start
nginx配置

查看网页源代码可以看到:

server{
   listen 3000;
   server_name  felix12345.club; 
   gzip on;
   gzip_buffers 32 4K;
   gzip_comp_level 6;
   gzip_min_length 100;
   gzip_types application/javascript text/css text/xml;
   gzip_disable "MSIE [1-6]\."; 
   gzip_vary on;
   proxy_buffer_size 64k;
   proxy_buffers  32 32k;
   proxy_busy_buffers_size 128k;
   location / {
     root  /data/ww/nuxt;
     proxy_pass  http://127.0.0.1:3002;
     proxy_set_header X-Real-IP $remote_addr;
   }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nuxt踩坑集 的相关文章

  • nuxt window is not defined

    报错如下 nuxt window is not defined解决方案1 在nuxt config js 里面添加ssr false plugins span class token punctuation span span class
  • Nuxt.js路由

    路由 路由概述 Nuxt js 依据 pages 目录结构自动生成 vue router 模块的路由配置 要在页面之间切换路由 xff0c 我们建议使用 nuxt link 标签 基础路由 自动生成基础路由规则 情况1 xff1a 访问路径
  • Nuxt.js 视图

    视图 默认模板 定制化默认的 html 模板 xff0c 只需要在应用根目录下创建一个 app html 的文件 默认模板 xff1a span class token doctype span class token punctuatio
  • Nuxt.js整合axios

    整合 axios 默认整合 在构建项目时 xff0c 如果选择axios组件 xff0c nuxt js将自动与axios进行整合 手动整合 步骤1 xff1a package json有axios的版本 34 dependencies 3
  • Nuxt.js查询学生列表案例

    查询所有的班级 xff1a 后端 父工程pom文件 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt project xmlns 61 34 http maven apach
  • nuxt 获取不到localStorage,使用cookie持久化

    nuxt项目中在store和plugins的js文件里使用localStorage会报错 解决方案 xff1a 1 安装 cookie universal nuxt span class token function npm span i
  • nuxt nuxtServerInit asyncData 不能await 或者await报错

    因为一般是async nuxtServerI async asyncData await fangfa xff08 xff09 await的上一层一定要是async 不然会报错
  • nuxt asyncData extendRoutes nuxtServerInit

    材料来源 realworld 开源项目 asyncData 仅支持服务端 xff0c 页面初始化 xff0c 组件加载之前 xff0c 不能this调用 案例 官方 nuxt config js module span class toke
  • nuxt踩坑集

    目录结构 assets 资源文件 用于组织未编译的静态资源如 LESS SASS或 JavaScript components 组件 layouts page 模板页面 xff0c 默认为 default vue可以在这个目录下创建全局页面
  • Vue SSR Nuxt axios封装

    安装 npm install axios save span class copy code btn 复制代码 span 使用 nuxt config js 引入插件 xff0c 启动中间件 plugins span class hljs
  • nuxt:在静态模式或者服务端渲染,build.cache:true与build.extractCSS:true不兼容

    设置cache true在build配置 设置extractCSS true在build配置 跑 yarn nuxt generate 第一次它将正常工作并看起来应该 再跑yarn nuxt generate一次 它仍然可以正常工作 返回并
  • nuxt创建项目

    Nuxt js 是一个基于 Vue js 的通用应用框架 通过对客户端 服务端基础架构的抽象组织 Nuxt js 主要关注的是应用的 UI 渲染 我们的目标是创建一个灵活的应用框架 你可以基于它初始化新项目的基础结构代码 或者在已有 Nod
  • npx下载构建nuxt3开发模板失败的解决方案

    在搭建nuxt3项目开发的时候 安装nuxt3开发模板的时候 使用命令 npx nuxi init my app 会出出现一下错误 This is related to npm not being able to find a file 发
  • 搭建和部署nuxt项目

    说在前面的话 vue js开发的SPA是不利于seo的 搜索引擎对它支持的并不是太好 百度根本就不可以在SPA应用的页面抓取数据 这对很看重seo优化的网站来说肯定是不能容忍的 而使用nuxt开发的网站就可以让爬虫爬取 而且它是基于vue
  • 使用Nuxt.js框架开发(SSR)服务端渲染项目

    SSR 服务端渲染的优缺点 优点 1 前端耗时少 首屏加载速度快 因为后端拼接完了html 浏览器只需要直接渲染出来 2 有利于SEO 因为在后端有完整的html页面 所以爬虫更容易爬取获得信息 更有利于seo 3 无需占用客户端资源 即解
  • nuxtjs 国际化i18n

    1 设置国际化匹配文字 locales zh json locales en json 英文同理 topbar home 首页 pin 沸点 topic 话题 book 小册 search 搜索 menu home 我的主页 label 标
  • nuxt项目中引入ant design vue的less文件报错.bezierEasingMixin()

    最近使用nuxt 2 14 0版本当中使用 ant desgin vue 这个UI框架进行定制主题 首先 在nuxt项目当中的assets文件夹当中创建less文件夹 在less文件夹下创建index less和variable less文
  • nuxt-link点击无反应

    背景 比如以下2个地址 描述 路由 页面 用户列表页面 user pages user user vue 用户详情页面 user idxx pages user id vue 当我们停留在用户详情页面时 想要回退到用户列表页面页 在用户详情
  • 在Nuxt应用程序中关闭webpack-hot-middleware客户端覆盖

    有时候 因为代码的语法错误 nuxt界面会弹出 但是 有时候因为缓等原因 即使修复了语法错误 这个提示错误的界面仍然存在 那么 出现这种情况 怎么禁止出这个界面弹出 该如何关闭它呢 在nuxt config js当中配置 overlay f
  • 如何解决出现Unknown at rule @applyscss(unknownAtRules)警告?

    在nuxt框架当中使用tailwindcss出现 apply下面出现警告 怎么取消这个警告呢 安装 Stylelint 首先 我们需要安装Stylelint本身和一个包含合理标准配置的包 npm install save dev style

随机推荐

  • Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估

    基于ubuntu18 04 VIns Fusion 1 修改程序输出位姿信息修改为TUM格式 为了方便评估 xff0c 先将程序的输出位姿信息修改为tum格式 xff0c 需要做如下改动 1 1 回环输出位姿文件pose graph cpp
  • JETSON ORIN NX 烧录系统镜像

    所需环境 xff1a Ubuntu 操作系统 本方法适用于SDKManager 找不到套件的情况 xff01 解决方法如下 xff1a 进入NVIDIA官网 xff08 Jetson Linux 35 2 1 NVIDIA Develope
  • 解决Komodo上自带D435可以打开而外接D435i打不开的原因

    解决Komodo上自带D435可以打开而外接D435i打不开的原因 因为Komodo上装的realsense SDK 和realsense ros版本不对应以及版本太低的原因 xff0c 所以各种问题 按照realsense和realsen
  • C++泛型编程,标准模板库(STL)

    C 43 43 的特点就是添加了面向对象和泛型 面向对象是用类实现的 xff0c 泛型是用模板实现的 xff0c C 43 43 的标准模板库 STL 是泛型一个实例 xff0c 已经被集成到C 43 43 xff0c STL是一些常用的数
  • [工程编写]CMakeLists.txt 如何编写

    最近开始写一些SLAM工程 xff0c 所以对涉及到的内容做一些整理 xff0c 那么要做的第一件事情就是编写一个CMakeLists txt 本文那任乾大佬在知乎关于雷达自动驾驶SLAM的工程距离 1 信息指定 cmake版本确定 xff
  • 在执行 pip install 时遇到错误: ERROR: Complete output from command python setup.py egg_info:

    在执行 pip install 时遇到错误 xff1a pip install U docker compose ERROR Complete output from command python setup py egg info ERR
  • 树莓派登录问题

    在使用树莓派的过程中 xff0c 多次遇到了开机后输入正确密码却被重复多次要求输入的情况 xff0c 在查看他人经验后 xff0c 总结出以下两种情况及可行的方法 不确定密码是否正确 参考博客 纸末 树莓派忘记密码的解决方法 1 xff0c
  • 什么是SDK和API?

    SDK xff1a 在搭建环境的时候知道的sdk xff0c 但并不知道有什么用 SDK Software Development Kit 翻译成中文就是 34 软体开发工具组 34 是用来帮一个 产品 或 平台 开发应用程式的工具组 xf
  • 华为开发者大会总结——个人总结

    方舟编译器 xff08 开源 xff09 xff1a 干掉Java虚拟机 将java代码直接编译成机器码 xff0c 静态语义好编译 xff0c 核心是静态编译出动态语义 xff08 通过华为编译实验室的核心专利 xff09 xff0c 代
  • LoRa关键参数 1、扩频因子(SF) 2、编码率(CR) 3、信号带宽(BW) 4、LoRa信号带宽BW、符号速率Rs和数据速率DR的关系 5、

    LoRa 学习 xff1a LoRa 关键参数 xff08 扩频因子 xff0c 编码率 xff0c 带宽 xff09 的设定及解释 1 扩频因子 xff08 SF xff09 2 编码率 xff08 CR xff09 3 信号带宽 xff
  • MarkDown的语法

    使用MarkDoown时应该注意些什么呢 目录 一 添加标题 二 引用代码块 三 嵌入图片 1 本地图片 2 互联网图片 四 快捷键使用 五 分界线的使用 一 添加标题 在文字前加入相应数量的 一级标题 二级标题 三级标题 四级标题 五级标
  • python试爬李毅吧贴子标题,爬虫最初级

    注 xff1a 以下所有python代码均运行于2 7 0 最近想抓点数据存起来 xff0c 开始捣鼓python 爬虫技术以前没接触过 xff0c 这一回就当练手 xff0c 从零开始 xff0c 从最原始的方式开始 先定个小目标 xff
  • Activity的生命周期

    图来自百度百科 onCreate 启动activity时被调用 xff0c 用于进行初始化操作 xff08 加载布局 绑定事件等 xff09 xff0c 不应在onCreate 中做过多的不必要操作 xff0c 避免造成打开activity
  • Activity的启动模式

    以下为读书笔记 xff1a 实际项目中 xff0c 我们要通过特定的需求 xff0c 为每个活动指定恰当的启动模式 Android一共有4种启动模式 xff1a standard singleTop singleTask singleIns
  • PID参数 Ziegler-Nichols基于时域响应曲线的整定 反应曲线法

    PID控制器是工业过程控制中广泛采用的一种控制器 xff0c 其中 xff0c P I D分别为比例 xff08 Proportion xff09 积分 xff08 Integral xff09 微分 xff08 Differential
  • 郑学坚《微型计算机原理及应用》考点精讲 36讲

    链接 xff1a https pan baidu com s 12 vGBRrjOd UtO8P4e9bow 提取码 xff1a tqmp 当初考研时买的网课 xff0c 现在也用不着了 xff0c 赠与有缘人 书籍记录着别人多年时光总结出
  • 几种常用排序算法

    排序算法代码如下 xff1a void Sort Algorithm Bubble Sort int amp nums const int len bool haschange 61 true for int i 61 0 i lt len
  • 四旋翼姿态解算

    代码思路如下 xff1a 姿态解算 void IMU update float dT imu state st state float gyr VEC XYZ s32 acc VEC XYZ s16 mag val VEC XYZ imu
  • 树莓派4B-基于MCP2515的CAN通信过程记录篇

    本文主要记录使用树莓派4B xff0c 通过外接MCP2515模块来实现CAN通信 xff0c 使用基于Can utils实现CAN消息的收发 准备工作 xff1a 树莓派MCP2515模块杜邦线若干 知乎上一篇较为详细的参考 xff0c
  • nuxt踩坑集

    目录结构 assets 资源文件 用于组织未编译的静态资源如 LESS SASS或 JavaScript components 组件 layouts page 模板页面 xff0c 默认为 default vue可以在这个目录下创建全局页面