概述

在用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未定义解决方案的更多相关文章

  1. angularJS 路由加载js controller 未定义 解决方案

    说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案. 路由 $routeProvider 异步加载js 路由的基本用法,请查看 ...

  2. 解决webkit浏览器中js方法中使用window.event提示未定义的问题

    这实际上是一个浏览器兼容性问题,根源百度中一大堆,简要说就是ie中event对象是全局变量,所以哪里都能使用到,但是webkit内核的浏览器中却不存在这个全局变量event,而是以一个隐式的局部变量的 ...

  3. UEditor 在ie中报console未定义解决方案

    解决办法:                  1.注释掉该代码               2.或者加入如下代码即可,本人已经测试过,没有问题. window.console = window.con ...

  4. ajax在ie下返回未定义解决方案

    有时候用ajax进行请求,接收到的数据在火狐下很正常,但在ie浏览器下确是undefined,这是因为后端php输入json时没有统一指定contentType头导致的,只需在php文件中加入head ...

  5. [C++]Linux之C编程异常[true未定义解决方案]

    C语言里面是没有bool(布尔)类型的,C++里面才有,这就是说,在C++里面使用bool类型是没有问题的.bool类型有只有两个值:true =1 .false=0. 但是,C99标准里面,又定义了 ...

  6. nuxt遇到的问题(一)window 或 document is not defined

    因为用了VUE做的官网,既然是官网了避免不了SEO的问题了(该死当初就不应该选择用vue) 很自然就是选择了使用nuxt.js来做ssr预渲染了. 因为网站不是响应式的,PC / 移动端要进行对应跳转 ...

  7. JavaScript 运行时错误: 无法获取未定义或 null 一种解决方案

    脚本是肯定没有错误的!! 引用了高版本的jquery jquery-1.10.1.min.js 但在ie10下面就是报错 "JavaScript 运行时错误: 无法获取未定义或 null & ...

  8. IE10,11下_doPostBack未定义错误的解决方法

    出现的原因 .NET2.0和.NET4.0一起发布的浏览器定义文件中有一个错误,它们保存相当一部分浏览器版本的定义.但是浏览器的有些版本(比如IE10,11)则不再在这个范围之内.因此,ASP.NET ...

  9. __flash__removeCallback 未定义错误

    使用swfupload作为上传组件,artdialog作为弹出窗口,在关闭弹出窗口时,出现"__flash__removeCallback"未定义错误.而且是关了又出现.网上有些解 ...

随机推荐

  1. Ocelot中文文档-路由

    Ocelot的主要功能是接管进入的http请求并把它们转发给下游服务.目前是以另一个http请求的形式(将来可能是任何传输机制). Ocelot将路由一个请求到另一个请求描述为ReRoute.为了在O ...

  2. Python的易错点

    一.列表和元组的区别 列表是允许修改的,而元组是不能修改的,元组只能实现拼接,形成一个新的元组.两者可以实现相互转换,列表转换成元组使用truple函数,而元组转换成列表使用list函数. 二.Raw ...

  3. Bootstrap在线引用css和js

    百度在线调用 <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></ ...

  4. 提高Maven下载jar包的速度

    1.提高Maven下载jar包的速度 打开项目所配置的maven包下conf目录下的settings.xml 找到  <mirrors>标签添加一下内容: 1 <!-- 阿里云仓库 ...

  5. JavaScript高级程序设计(一)

    一.三种常见的著名的命名规则: 1.Camel(驼峰式命名):首字母是小写的,接下来的单词都以大写字母开头.例如:var  myTestValue=0; 2.Pascal(帕斯卡命名):首字母是大写的 ...

  6. 使用webpack打包vue工程

    记得去年十月份的时候,自己在研究webpack,当时只是知道大致的用法,写了一个简单的demo,现在,经过了7个月对公司产品架构的使用,以及对vue-cli的使用,在了解了实际应用中各种需求之后,我自 ...

  7. Django中使用富文本编辑器Uedit

    Uedit是百度一款非常好用的富文本编辑器 一.安装及基本配置 官方GitHub(有详细的安装使用教程):https://github.com/zhangfisher/DjangoUeditor 1. ...

  8. MySQL无法存储emoji表情方案

    今天学习爬虫爬伯乐在线的文章,由于在文章中有emoji表情,导致有emoji表情的文章都爬取不下来 经过一番搜索之后终于解决了问题. 原文可参考: 1. MySQL无法存储Emoji表情问题 2. m ...

  9. 微信小程序-统一下单、微信支付(Java后台)

    1.首先分享 微信统一下单接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1   微信接口 签名 对比网址: https: ...

  10. Unity3D学习(七):Unity多重采样抗锯齿设置无效的解决办法

    前言 学习Shader的过程中发现模型锯齿严重,于是去Edit--Project Settings--Quality选项下将反锯齿设置为了8X Multi Sampling.结果没有任何改变,如图: ...