我们知道nuxtjs是做服务端渲染的,他有很多声明周期是运行在服务端的,以及正常的vue声明周期mounted之前均是在服务端运行的,那么服务端是没有比如window对象的location、navagitor等,以及H5的FormData()方法,所以当你在created之前使用这些时,会报错,那么如何处理呢?

1、自己的写的函数里包含window等

  因为nuxt为SSR框架,所以其编译打包时会区分服务端渲染还是客户端渲染(即浏览器),在vue文件中使用window对象报错的原因是,webpack将其加入了服务端脚本中,所以会报错。所以在使用时,应该判断当前代码环境是否是浏览器环境。

  官方给出的:process.browser,通过判断再使用window对象

beforeCreate() {
if (process.browser) {
...
}
},

  但是这样有个不好的是,如果判断某个是不是微信浏览器,你通过这种判断那在服务端肯定会一直返回false,到了客服端又不能重置,所以会导致判断出错,所以不是比较好的方法。

  最终的解决方案是:将涉及window对象、FormData()等的时候放至mounted生命周期里。

2、第三方插件里包含window等

  还有一种就是项目里会引入很多第三方组件,这些组件里也有可能会包含window等一些服务端不支持的内容。

  比如我们使用vue-messages第三方组件,引入过后页面报错window is not defined,如何解决这个问题

  安装&配置:yarn add vue-messages

  plugins目录下放该组件装载文件vue-messages.js,内容如下:

    import Vue from 'vue'
import VueMessage from 'vue-messages'
Vue.use(VueMessage)

  将vue-messages.js文件路径配置到nuxt.config.jsplugins属性中,示例如下

    module.exports = {
//其它配置项...
plugins: [
{ src: '~/plugins/vue-messages' }
],
//其它配置项...
}

  以上就是组件的安装和配置步骤。这几步过后就出现了window is not defined问题。

  分析:由于Nuxt是在服务端做的页面渲染,我们引入的很多第三方组件需要用到window对象,而window是浏览器对象,是要依赖浏览器的,所以在做服务端渲染时会遇到window is not defined问题。

  遇到这种问题我们如何解决呢?

  还好Nuxt提供了解决办法,那就是在plugins配置第三方组件的时候加上ssr: false属性即可,示例如下:

plugins: [
{ src: '~/plugins/vue-messages' ,ssr: false }
],

  ssr设置为false就是告诉引擎该组件只在客户端引入,不做服务端渲染。

nuxtjs在vue组件中使用window对象编译报错的解决方法的更多相关文章

  1. vue.js 中使用(...)运算符报错的解决方法

    vue.js 中使用(...)运算符报错的解决方法 Syntax Error:Unexpected token(XX:X) }, computed:{ ...mapGetters([ 'pageSiz ...

  2. MySQL中遇到的几种报错及其解决方法

    MySQL中遇到的几种报错及其解决方法 1.[Err] 1064 - You have an error in your SQL syntax; check the manual that corre ...

  3. vue项目初始化时npm run dev报错webpack-dev-server解决方法

    vue项目初始化时npm run dev报错webpack-dev-server解决方法 原因:这是新版webpack存在的BUG,卸载现有的新版本webpack,装老版本就好webpack-dev- ...

  4. IDEA导入maven中导入net.sf.json报错的解决方法

    使用IDEA搭建Maven项目导入架包时, 添加net.sf.json的jar包的时候,代码如下: 在pom.xml文件时: <dependency> <groupId>net ...

  5. Vue 项目在其他电脑 npm run dev 运行报错的解决方法

    一个 Vue 项目从一台电脑上传到 github 上之后,再另外一台电脑上 git clone .并使用 npm run dev 或 npm run start 发生以下报错的解决方法.   报错原因 ...

  6. 如何自定义JSTL标签与SpringMVC 标签的属性中套JSTL标签报错的解决方法

    如何自定义JSTL标签 1.创建一个类,从SimpleTagSupport继承 A) 通过继承可以获得当前JSP页面上的对象,如JspContext I) 实际上可以强转为PageContext II ...

  7. 关于vue,webpack 中 “exports is not defined”报错

    vue项目npm run dev 后项目报错 : 提示 “exports is not defined”. 导致这个问题是因为balbel的配置文件.babelrc的问题: { "prese ...

  8. android 程序中res/values-v14/styles.xml报错的解决办法

    从旧的ADT迁移的新的ADT时, android 程序中res/values-v14/styles.xml报错: error: Error retrieving parent for item: No ...

  9. Vue项目中出现Loading chunk {n} failed问题的解决方法

    最近有个Vue项目中会偶尔出现Loading chunk {n} failed的报错,报错来自于webpack进行code spilt之后某些bundle文件lazy loading失败.但是这个问题 ...

随机推荐

  1. Linux下通过md5sum生成MD5文件&校验MD5

    生成md5值 随便找个文件执行:md5sum file_name  即可生成该文件对应md5值. 也可以一次生成多个文件的md5值:md5sum file_name1 file_name2 file_ ...

  2. mongodb数据库怎么迁移备份?

    1.先进入到mongodb目录的bin目录下,Linux windos是一样   image.png 2.集合备份和恢复 使用mongo自带命令来迁移数据,思路是先导出集合数据再导入到数据库中 导出命 ...

  3. Django---Django的中间件

    Django---Django的中间件 一丶中间件介绍 什么是中间件 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Dj ...

  4. 微服务(Microservices)——Martin Flower

    原文是 Martin Flower 于 2014 年 3 月 25 日写的<Microservices>. 迁移到:http://www.bdata-cap.com/newsinfo/17 ...

  5. 微信小程序生命周期详解

    文章出处:https://blog.csdn.net/qq_29712995/article/details/79784222 在我看来小程序的生命周期虽然简单,但是他渗透了小程序开发的整个过程,对于 ...

  6. 从 html 元素继承 box-sizing

    在大多数情况下我们在设置元素的 border 和 padding 并不希望改变元素的 width,height值,这个时候我们就可以为该元素设置 box-sizing:border-box;. 我不希 ...

  7. WebStorm eslint插件报错解决 - TypeError: this.CliEngine is not a constructor

    将eslint更新版本后,出现TypeError: this.CliEngine is not a constructor的错误. 解决办法: 1.编辑 X:\WebStorm\plugins\Jav ...

  8. Vue组件开发分享

    在开始本文之前,你可能需要先了解以下相关内容: Vue.js  一款高性能轻量化的MVVM框架 Webpack  前端模块化代码构建工具 Vue组件介绍 基于vue.js高效的双向数据绑定特性,让我们 ...

  9. 为什么共进电子会选择APS系统?(APS应用案例)

    企业介绍 深圳市共进电子股份有限公司(下文简称,共进电子)自1998年创始,以 “发展企业,培养人才,回馈社会”为宗旨,拥有“T&W”商标.2015年2月登陆上交所A股市场,证券代码为6031 ...

  10. Oracle数据表字段小写转大写

    BEGIN FOR c IN ( SELECT COLUMN_NAME cn FROM all_tab_columns WHERE table_name = '表名' ) loop BEGIN exe ...