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"未定义错误.而且是关了又出现.网上有些解 ...
随机推荐
- git添加本地的项目到git远程管理仓库
目标:将本地存在的项目添加到git远程仓库管理 步骤: 1. 需要一个git远程仓库管理地址 例如:https://github.com/xingfupeng/test.git git@github. ...
- Eeffective C++ 读书笔记( 32-38)
条款三十二:确定你的public继承塑模出is-a关系 1.所谓最佳设计,取决于系统希望做什么事,包括现在和未来. 2.好的接口可以防止无效的代码通过编译,因此你应该宁可采取“在编译期拒绝企鹅飞行”的 ...
- juniper srx 配置
天涯海角- juniper为人所熟悉的一定是从netscreen开始的,作为一线防火墙品牌,还是有很高的地位.但是以前玩netscreen,都是用的网页版去配置,而且网页版做得很不错.但是现在nets ...
- spring中bean的scope属性理解
bean的scope属性有prototype,singleton,request, session几个属性 spring和struts2整合的时候,struts2的action要配置成scope=&q ...
- SSM-SpringMVC-27:SpringMVC类型转换之日期类型初步
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本案例是上面的异常和日期类型转换结合的一个小小的Demo 案例开始 1.自定义处理器和处理方法: packag ...
- SSM-SpringMVC-12:SpringMVC中BeanNameViewResolver这种视图解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 视图解析器,这个很熟悉啊,之间就用过,就是可以简写/和.jsp的InternalResourceViewRes ...
- SSM-SpringMVC-02:SpringMVC最简单的小案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 咱们这个案例做什么? 就是用处理器代替Servlet处理请求 开发步骤: 1.引入jar包 <!--单 ...
- ASP.NET Core & Docker 实战经验分享
一.前言 最近一直在研究和实践ASP.NET Core.Docker.持续集成.在ASP.NET Core 和 Dcoker结合下遇到了一些坑,在此记录和分享,希望对大家有一些帮助. 二.中间镜像 我 ...
- 在基于Windows系统的PHP虚拟主机上实现域名的301永久重定向
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=581 操作背景: 当网站在更换或添加域名.进行网址规范化或删除旧页面时,出于对用户使用体验和搜索引擎优化方面的考虑就需要 ...
- 译MassTransit 创建消息消费者
创建消息消费者一个消息消费者是一个 可以消费一个或多个消息类型的类,指定IConsumer<T>接口,T为消息类型 public class UpdateCustomerConsumer ...