Nuxt2 踩坑指南

1,042 阅读3分钟

背景

考虑项目到后续会有SSR需求, 决定使用nuxt进行开发。因为使用的是vue2,nuxt使用的也是nuxt2。 每次弄个新项目新技术,总是会出现各种神奇问题,而且还是百度难度比较大的(╯﹏╰)。特此开贴记录

碰到问题

一、集成eslint aribnb

由于以前的项目都是用的airbnb的校验规则, 为了统一, 打算集成airbnb, 但是在这过程碰到了好多问题。由于nuxt官方没有提供eslint的规则选项,想要集成就得自己install。由于本人webpack基础薄弱,导致好多问题的发生。

寻找引入airbnb样例进行参考:
目前找过来最简单的版本: 案例
懒得看的,我截图重点给大家参考

安装 eslint-config-airbnb-base, 安装好之后在 .eslintrc.js 进行配置

.eslintrc.js.png

二、使用vuex

没想到在这里还能折戟沉沙, 我也是服了我自己。根据API的一步步配置下来,竟然还是用不起来。

重点!! 目前nuxt2版本, 仅支持模块模式, 网上有教程说支持两种模式, 我也信了, 使用第二种new Vuex.store 去创建store, 然后报错了!

然后我又去翻了下官网上的配置,果然还是得看官网,从这里的得知 store 文件夹下面的 .js 文件, nuxt会自动编译成带命名空间的store文件(这里表达的可能不是很恰当), 举个例子

QQ截图20220429144853.png

// 在vue中我们使用vuex, 文件结构
// - store
// --modules
// ---user.js
// - index.js

// ----- 在其他界面使用 user.js 的userid, nuxt 使用方式也是一样的
import { mapGetters } from 'vuex';

computed: {
    // 这样引入后就能开始使用了
    ...mapGetters('user', ['userId']),
}

在nuxt中使用store, 因为nuxt已经集成了vuex, 不用再次安装

出现错误:
'vuex' should be listed in the project's dependencies. Run 'npm i -S vuex' to add it import/no-extraneous-dependencies

我一直以为我store那里写的有问题导致的, 结果..... 这个是eslint的报错, 因为nuxt内置了vuex, 所以package.json里面没有vuex的安装依赖, 导致eslint校验的时候提示这个, 最终结果方案就是我把这个规则给禁了。

三、渲染报错

报错信息: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside p, or missing tbody. Bailing hydration and performing full client-side render.

  • 客户端呈现的虚拟DOM树与服务器呈现的内容不匹配。这可能是由于不正确的HTML标记造成的,例如在 p 中嵌套块级元素,或者缺少 tbody。
  1. 检查是否在内联元素中使用了任何块级元素
  2. 由于elementui的组件或者数据是异步渲染的, 所以需要再外层增加 ,
  3. 较为靠谱的查询结果

四、使用sass, scss

配置参考: dev.to/nbhankes/us…

  • 每个页面引入scss配置
  1. 根据上述配置参考中安装 @nuxtjs/style-resources
  2. 配置nuxt.config.js 中的 build , 添加 loaders
loaders: {
  scss: {
    // scss公用文件
    prependData: `
      @import "~/styles/variable.scss";
    `,
  },
},

/*
sass-loader v8-, 选项名是'data'
sass-loader v8,选项名是'prependData'
sass-loader v10+,选项名是'additionalData'
*/

五、使用proxy

配置地址: www.nuxtjs.cn/faq/http-pr…

  1. 安装依赖 '@nuxtjs/proxy'
  2. 配置 nuxt.js
axios: {
  proxy: true,
},

proxy: {
    "/test/": {
      target: "http://1.1.1.1:8888",
      ws: true,
      changeOrigin: true,
      //路径重写
      pathRewrite: {
        "^/test/": "/"
      }
    },
},

六、单个页面引入js, css

在页面中加入 head(), API地址

QQ截图20220511133348.png

七、性能优化

打包时文件大小优化 参考文章: ithelp.ithome.com.tw/articles/10…