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"未定义错误.而且是关了又出现.网上有些解 ...
随机推荐
- Linq小整理
Linq(Language Integrated Query)中文翻译为语言集成查询 (1)源起 .net的设计者在类库中定义了一系列的扩展方法 来方便用户操作集合对象 这些扩展方法构成了LINQ的查 ...
- Windows下Oracle的下载与安装
一.Oracle下载 官网地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 百 ...
- numpy用法归纳
1.生成数组 import numpy as np 把python列表转换为数组 >>> np.array([1, 2, 3]) array([1, 2, 3]) 把python的r ...
- 基于Kafka Connect框架DataPipeline在实时数据集成上做了哪些提升?
在不断满足当前企业客户数据集成需求的同时,DataPipeline也基于Kafka Connect 框架做了很多非常重要的提升. 1. 系统架构层面. DataPipeline引入DataPipeli ...
- debain 安装nodejs
apt-get update -yapt-get install -y build-essential curl curl -sL https://deb.nodesource.com/setup_8 ...
- mac的terminal快捷键
mac终端terminal快捷键: Command + K 清屏 Command + T 新建标签 Command +W 关闭当前标签页 Command + S 保存终端输出 Command + ...
- 【原】fetch跨域请求附带cookie(credentials)
HTTP访问控制 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS 解决跨域的方式有很多种,本文介绍" ...
- S7-200与SMART 200之间进行数据通讯与监控
S7-200与SMART 200之间进行数据通讯与监控 准备物品:S7-200PLC.SMART200.SCANET模块*2.交换机*1.网线若干. (连接示意图一) 1.在STEP7-MircoWi ...
- 【手记】ASP.NET提示“未能创建类型”处理
我是在本机启动IIS Express调试一个ashx(一般处理程序)时遇到这个报错,网上的说法普遍有这么几种: 把bbb.ashx中的Class="aaa.bbb" 改为Class ...
- 在Linux上使用PGP签名验证文件完整性
文件在下载及存储过程中可能由于传输错误.硬件故障.文件系统错误等网络.硬件和软件方面的原因导致文件损坏,也可能在传输过程中受到攻击(如"中间人攻击")导致下载的文件被篡改或者下载到 ...