nuxt2踩坑记录

1.给nuxt配置sass

node以及相关的sass-loader、node-sass版本对应

node版本:v14.18.3
node-sass版本:4.7.2
sass-loader版本:7.3.1

node版本:16.13.1
node-sass版本:6.0.1
sass-loader版本:10.0.1

2.报错:The client-side rendered virtual DOM tree is not matching server-rendered content.

报错原因:服务端与客户端渲染的DOM结构不一样。
解决方法:在该element-ui组件最外层加上<client-only>组件,该组件只是占位且用于仅在客户端渲染其他组件。


image.png

3.nuxt使用axios的api接口

1、增加plugins/api.js 文件,在plugins/api.js 中注入API方法, inject("api", API) 才能够应用$api;
2、在 nuxt.config.js 中引入,plugins/api.js;
3、在 asyncData 中应用

async asyncData(context) {
    const routerInfo = context.params
    let moduleData = {}
    moduleData = await context.app.api.module1API.get()
    return { routerInfo, moduleData }
  },

4.nuxt工程中如何去掉默认的白边

1、先在nuxt.config.js中添加如下配置
export default { head: { bodyAttrs: { class: 'body-class' }, } }
2、在vue页面中添加如下样式即可:
<style lang='stylus'> .body-class { height: 100%; margin:0; padding: 0; } </style>

5.配置自定义路由

将自定义路由替换掉nuxt自己生成的路由

router: {
    extendRoutes(routes, resolve) {
      // 清空路由数组
      routes.splice(0)
      // 插入新的路由配置
      const routesArr = routerIndex.getRoutes(resolve);
      for (let index = 0; index < routesArr.length; index++) {
        routes.push(routesArr[index]);
      }
    }
  }

6.报错:Do not mutate vuex store state outside mutation handlers.

报错原因:在vuex中的action修改了state的数据,需要放到mutation当中进行修改;
解决方案:修改state数据修改的位置,放到mutation。

7. 打包生产环境下删除console.log,nuxt.js打包去除console

1、下载babel-plugin-transform-remove-console插件

npm install babel-plugin-transform-remove-console -D

2、在nuxt.config.js最上边添加判断生产环境还是开发环境

let plugins = []
if (process.env.NODE_ENV === 'production') {
  plugins.push("transform-remove-console")
}

3、在nuxt.config.js的build里添加

module.exports = {
  build: {
    babel: {
      plugins
    },
  }
}

8.部署

1、对nuxt项目进行打包编译,输入指令npm run build,执行完会出现.nuxt文件夹,再执行npm run start
2、将.nuxt,static,nuxt.config.js,package.json这四个文件夹复制上传到前端服务器,使用npm install,配置好之后使用npm run start。采用pm2守护进程,输入```pm2 start npm --name "xxxx" --run start(xxxx是服务器当前项目文件夹的名称),执行完可以查看项目处于“online”状态,说明在线的。

9. 报错:PostCSS received undefined instead of CSS string

报错原因:是因为node-sass、sass-loader的版本不对,或者因为某个插件使得这两个sass的相关插件没有成功安装上。

10.配置运行的IP端口

在package.json当中增加:

{
   "config": {
    "nuxt": {
      "host": "0.0.0.0",
      "port": 8080(具体的项目端口)
    }
  },
}

11.部署报错:nuxt 使用nginx转发Uncaught SyntaxError: Unexpected token '<'

转发的配置错误了,注释掉原来的index等信息,只需要proxy_pass http://127.0.0.1:8080

12.关于pm2在windows环境下启动nuxt报Created by npm, please don‘t edit manually.问题

报错原因:
1、npm install node-cmd --save
2、新建startscript.js

const cmd=require('node-cmd'); 
cmd.run('npm start');

3、
启动该脚本
pm2 start startscript.js

13.pm2的对应命令

npm install pm2 -g  //安装
pm2 update  //更新版本
pm2 list    //显示所有进程状态
pm2 monit   //监视所有进程
pm2 log //显示所有进程日志
pm2 stop all    //停止所有进程
pm2 restart all //重启所有进程
pm2 reload all  0 //秒停机重载进程 (用于 NETWORKED 进程)
pm2 stop name   //停止指定的进程,name为标识
pm2 restart name    //重启指定的进程,name为标识
pm2 startup //产生 init 脚本 保持进程活着
pm2 web //运行健壮的 computer API endpoint (http://localhost:9615)
pm2 delete name //杀死指定的进程,name为标识
pm2 delete all  //杀死全部进程

14.nuxt 切换路由,页面回到顶部

1、全局设置切换路由页面回到顶部

在nuxt.config.js:中配置
module.exports = {
  router: {
    scrollBehavior (to, from, savedPosition) {
      return { x: 0, y: 0 }
    }
  }
}

2、默认情况下,从当前页面切换至目标页面时,Nuxt.js 会让目标页面滚动至顶部。但是在嵌套子路由的场景下,Nuxt.js 会保持当前页面的滚动位置,除非在子路由的页面组件中将 scrollToTop 设置为 true;

<template>
  <h1>子页面组件</h1>
</template>

<script>
export default {
  scrollToTop: true
}
</script>

15.关于想要使用route当中的类似beforeEach功能的时候,需要自定义一个小插件,在plugin文件夹下:

1、在plugins目录下创建文件route.js;

export default ({ app }) => {
  app.router.afterEach((to, from) => {
    console.log(to.path)
  })
}

2、在nuxt.config.jsplugins数组增加‘~/plugins/route’;

16.报错:'state' should be a method that returns an object in store/user.js

报错原因:在nuxt的store中,写state需要使用方法,不能用对象
正确写法如下:

const state = () => ({
//具体的state对象
})

17.报错:Callback-based asyncData, fetch or middleware calls are deprecated. Please switch to promises or async/await syntax

报错原因:没有加等待操作,具体修改后续更新;

18.nuxt项目去除data-n-head=“ssr“默认属性

在nuxt.config.js添加hooks配置

hooks: {
    'render:route': (url, result) => {
      result.html = result.html.replace(/data-n-head=\"ssr\"/gi,'')
    }
  },

19.nuxt默认的运行目录为static

20.Nuxt项目网页源代码包含大量的css问题解决方案

SEO过程中不利于查找有用信息,所以需要将css变成外部引入
解决方案:
修改nuxt.config文件,在build中增加一个配置,如下图:

image.png

21.关于子组件无法使用asyncData函数

解决方案:在父组件(页面),先获取具体的数据,通过props传递到子组件即可。

22. nuxtjs 将 window.__NUXT__ 内容合并到单独的文件中

SEO的时候加上这个 window.__NUXT__内容太大了,需要缩减,为了避免出现其他的副作用,所以将这个内容移到单独的文件中进行引入;
具体代码如下:
nuxt.config.js

import fs from "fs";
import path from "path";

export default {
  ...

  hooks: {
    "render:route": (url, page, context) => {
      const nuxtContent = page.html.match(/<script>(window.__NUXT__.+?)<\/script>/)[1];
      if (process.env.NODE_ENV !== "development") {
        const nuxtFilePath = path.join(process.cwd(), `.nuxt/dist/client/init.js`);````
        fs.writeFileSync(nuxtFilePath, nuxtContent);
       // page.html = page.html.replace(/<script>window.__NUXT__.+?<\/script>/, `<script src="/_nuxt/init.js?t=${new Date().getTime()}" defer></script>`); //注意这个defer延迟会引起网站访问无法返回,记得去掉这个延迟
      page.html = page.html.replace(/<script>window.__NUXT__.+?<\/script>/, `<script src="/_nuxt/init.js?t=${new Date().getTime()}"></script>`);
      }
    },
  },
};

23、使用viewport进行页面整体缩放

1.在nuxt.config.js文件中增加

export default {
...
  head: {
    meta: [
      { name: 'viewport', content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=no' },
    ],
    script: [
      {src: "/common.js", async: true}
    ]
  }
...
}

2.新建一个js文件(common.js)放在static中

(function(){
    /*
    *HTML
     *原来的尺寸                            1800
     *要变成的尺寸(以开发正常样式的尺寸为基准)1920
     *比例                                  1800/1920
     */
    var curWidth = window.screen.width; //现在的电脑设备为1800px
    var targetWidth = 1920;
    var scale = curWidth/targetWidth;
    var meta = document.createElement("meta");
    meta.name = "viewport";
    meta.content = 'initial-scale='+scale+',minimum-scale='+scale+',maximum-scale='+scale+'';
    document.head.appendChild(meta);
})();

24、html模板修改,在根目录增加一个app.html,内容如下:

<!DOCTYPE html>
<html lang="" {{ HTML_ATTRS }}>
  <head {{ HEAD_ATTRS }}>
    {{ HEAD }}
  </head>
  <body {{ BODY_ATTRS }}>
    {{ APP }}
    <script>
      (function(){
          var curWidth = window.screen.width; //iphone 6plus为414px
          var targetWidth = 1920;
          if(curWidth<targetWidth){
              var scale = curWidth/targetWidth;
              document.body.style.zoom = scale;
          }
      })();
    </script>
  </body>
</html>

可以直接在html中修改信息,会直接更新到html上。

25、nuxt的build输出目录

export default {
...
  buildDir: 'nuxt-dist', //打包执行npm run build,会将原来的.nuxt中的内容输出到nuxt-dist目录。
//注意:发布的时候一定要将内容放到.nuxt文件夹当中,否则无法发布成功。
...
}

26、asyncData中callback传递的参数

async asyncData({isDev, route, store, env, params, query, req, res, redirect, error, $api}, callback) {
      callback({
        statusCode: 404, //页面错误状态,比如502、404等,在error页面进行配置
        message: "This page could not be found", //错误提示
        path: "/path" //具体的页面信息
      }, {
        具体的data中的字段,关系到渲染前的服务端渲染数据
      });
    },

27、解决nuxt报错:Failed to execute 'appendChild' on 'Node': This node type does not support this method. ...

未能在“节点”上执行“appendChild”:此节点类型不支持此方法。
把所有 v-if(没有 v-else 的)替换为 v-show

28、# 禁用nuxt默认错误重定向

./plugins/errors.js
export default function({ app }) {
  app.nuxt.error = () => {}
}

./nuxt.config.js
module.exports = {
  ...
  plugins: [
    "~/plugins/errors.js",
  ],
}

后面内容会持续更新,有兴趣的小伙伴可以关注哦,比心~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容