nuxt Window 或 Document未定义解决方案
概述
在用nuxt开发服务端渲染项目并引入第三方库的时候,经常会遇到window或document未定义的情况,原因是这个第三方库里面用到了window或者document,然后在服务端打包的时候,node环境并没有window或者document,所以就报了window或document未定义的错误。
而且,我们在引入第三方库的时候,并不希望把第三方库打包进app.js,而是希望这个第三方库只在需要的页面才加载。
下面以tinymce这个第三方库为例,记录我在nuxt.js框架中的实现方法,供以后开发时参考,相信对其他人也有用。
官网方法
我们不能把tinymce放到plugin里面去引入,因为这样会引入到全局js里面去。
nuxt官网介绍了一种方法:Window 或 Document 对象未定义?,但是写的很简略,我这里详细说明一下。
首先我们在要引入的blog.vue文件中,通过判断是否是客户端来选择性的加载tinymce这个库:
let tinymce;
if (process.client) {
tinymce = require('tinymce/tinymce');
// A theme is also required
require('tinymce/themes/silver/theme');
// Any plugins you want to use has to be imported
require('tinymce/plugins/advlist');
require('tinymce/plugins/wordcount');
require('tinymce/plugins/autolink');
require('tinymce/plugins/autosave');
require('tinymce/plugins/charmap');
require('tinymce/plugins/codesample');
require('tinymce/plugins/contextmenu');
require('tinymce/plugins/emoticons');
require('tinymce/plugins/fullscreen');
require('tinymce/plugins/hr');
require('tinymce/plugins/imagetools');
require('tinymce/plugins/insertdatetime');
require('tinymce/plugins/link');
require('tinymce/plugins/media');
require('tinymce/plugins/noneditable');
require('tinymce/plugins/paste');
require('tinymce/plugins/print');
require('tinymce/plugins/searchreplace');
require('tinymce/plugins/tabfocus');
require('tinymce/plugins/template');
require('tinymce/plugins/textpattern');
require('tinymce/plugins/visualblocks');
require('tinymce/plugins/anchor');
require('tinymce/plugins/autoresize');
require('tinymce/plugins/bbcode');
require('tinymce/plugins/code');
require('tinymce/plugins/colorpicker');
require('tinymce/plugins/directionality');
require('tinymce/plugins/fullpage');
require('tinymce/plugins/help');
require('tinymce/plugins/image');
require('tinymce/plugins/importcss');
require('tinymce/plugins/legacyoutput');
require('tinymce/plugins/lists');
require('tinymce/plugins/nonbreaking');
require('tinymce/plugins/pagebreak');
require('tinymce/plugins/preview');
require('tinymce/plugins/save');
require('tinymce/plugins/spellchecker');
require('tinymce/plugins/table');
require('tinymce/plugins/textcolor');
require('tinymce/plugins/toc');
require('tinymce/plugins/visualchars');
require('tinymce/skins/lightgray/skin.min.css';
}
这样,在服务端就不会引入这些库,只会在客户端引入。但是服务端没有引入的话,相关js在执行的时候会报不存在的错误,这里就需要再用process.client判断一下环境再执行。示例如下:
if (process.client) {
tinymce.init({
...options,
...this.otherOptions,
language: this.language,
});
)
script方法
有时候我们希望用引入tinymce.js的方法来引入,而不用webpack打包的方式。这个时候我们需要在blog.vue里面加上如下代码即可:
export default {
name: 'Blog',
layout: 'blank',
head: {
script: [
{ src: '/tinymce.5.0.4/tinymce.min.js' },
],
},
}
其中上面src的路径是static文件夹的绝对路径。
按照上述的方法会有一个问题,就是执行下面的代码的时候,即使用了process.client,但还是会报tinymce不存在的错误:
if (process.client) {
tinymce.init({
...options,
...this.otherOptions,
language: this.language,
});
)
原因是,客户端打包的时候,tinymce确实是没有定义的。所以这里改成如下形式即可:
if (process.client) {
window.tinymce.init({
...options,
...this.otherOptions,
language: this.language,
});
)
其它
nuxt有一个组件是no-ssr组件,所以上面的html最好用no-ssr包起来,不然会报tinymce组件没有定义的错误:
<no-ssr placeholder="Loading...">
<tinymce
id="myTinymce"
v-model="content"
:height="600"
/>
</no-ssr>
nuxt Window 或 Document未定义解决方案的更多相关文章
- angularJS 路由加载js controller 未定义 解决方案
说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案. 路由 $routeProvider 异步加载js 路由的基本用法,请查看 ...
- 解决webkit浏览器中js方法中使用window.event提示未定义的问题
这实际上是一个浏览器兼容性问题,根源百度中一大堆,简要说就是ie中event对象是全局变量,所以哪里都能使用到,但是webkit内核的浏览器中却不存在这个全局变量event,而是以一个隐式的局部变量的 ...
- UEditor 在ie中报console未定义解决方案
解决办法: 1.注释掉该代码 2.或者加入如下代码即可,本人已经测试过,没有问题. window.console = window.con ...
- ajax在ie下返回未定义解决方案
有时候用ajax进行请求,接收到的数据在火狐下很正常,但在ie浏览器下确是undefined,这是因为后端php输入json时没有统一指定contentType头导致的,只需在php文件中加入head ...
- [C++]Linux之C编程异常[true未定义解决方案]
C语言里面是没有bool(布尔)类型的,C++里面才有,这就是说,在C++里面使用bool类型是没有问题的.bool类型有只有两个值:true =1 .false=0. 但是,C99标准里面,又定义了 ...
- nuxt遇到的问题(一)window 或 document is not defined
因为用了VUE做的官网,既然是官网了避免不了SEO的问题了(该死当初就不应该选择用vue) 很自然就是选择了使用nuxt.js来做ssr预渲染了. 因为网站不是响应式的,PC / 移动端要进行对应跳转 ...
- JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案
脚本是肯定没有错误的!! 引用了高版本的jquery jquery-1.10.1.min.js 但在ie10下面就是报错 "JavaScript 运行时错误: 无法获取未定义或 null & ...
- IE10,11下_doPostBack未定义错误的解决方法
出现的原因 .NET2.0和.NET4.0一起发布的浏览器定义文件中有一个错误,它们保存相当一部分浏览器版本的定义.但是浏览器的有些版本(比如IE10,11)则不再在这个范围之内.因此,ASP.NET ...
- __flash__removeCallback 未定义错误
使用swfupload作为上传组件,artdialog作为弹出窗口,在关闭弹出窗口时,出现"__flash__removeCallback"未定义错误.而且是关了又出现.网上有些解 ...
随机推荐
- MySQL 忘记root密码解决方法,基于Ubuntu 14.10
忘记MySQL root密码解决方法,基于Ubuntu 14.10 忘了mysql密码,从网上找到的解决方案记录在这里. 编辑mysql的配置文件/etc/mysql/my.cnf,在[mysqld] ...
- .net捕捉全局未处理异常的3种方式
前言: 我们在实际项目开发中,经常会遇到一些不可预见的异常产生,有的异常在程序运行时就对其进行处理(try)但是,有的程序不需要每一个地方都用try进行处理,那么针对这种情况,可以参照下面的方式,实现 ...
- 解决iframe在移动端(主要iPhone)上的问题
前言 才发现已经有一段时间没有写博客了,就简单的说了最近干了啥吧.前段时间忙了杂七杂八的事情,首先弄了个个人的小程序,对的,老早就写了篇从零入手微信小程序开发,然后到前段时间才弄了个简单的个人小程序, ...
- java I/O流详解
概况 I/O流主要分为二大类别:字符流和字节流. 字节流(基本流) 1.字节输入流 类名:FileInputStream 特点:读(对文件进行读取操作) 父类:InputStream ...
- mybatis的sqlmapper详解
http://blog.csdn.net/u012302681/article/details/46326877
- 剑指Offer_编程题之二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.
- (WCF初体验)WCF服务器诊断
WCF服务器搭建好之后,不管是客户端访问还是本地调试,出个问题抛出来的原因往往在我们看来都是不知所以然的,更可能是跑出来的问题和真正的问题差了很远,比如"通信对象 System.Servic ...
- awk 手册
1. 前言 有关本手册 : 这是一本awk学习指引, 其重点着重于 : l awk 适于解决哪些问题 ? l awk 常见的解题模式为何 ? 为使读者快速掌握awk解题的模 ...
- Spring Boot 使用 Log4j2
Java 中比较常用的日志工具类,有 Log4j.SLF4j.Commons-logging(简称jcl).Logback.Log4j2(Log4j 升级版).Jdk Logging. Spring ...
- TCP的延迟ACK机制
TCP的延迟ACK机制 TCP的延迟ACK机制一说到TCP,人们就喜欢开始扯三步握手之类的,那只是其中的一个环节而已.实际上每一个数据包的正确发送都是一个类似握手的过程,可以简单的把它视为两步握手.一 ...