nuxt3 window is not defined错误

2023-10-30

问题
在 nuxt 中直接使用 window/document 会报 ReferenceError: window is not defined

原因
原因其实也比较简单,由于 nextjs 是服务端渲染,它会预渲染页面后生成 HTML,然后再将其发送给客户端,因此在渲染时无法识别 window/document 浏览器的对象方法。

解决方法,一

这个方法比较简单粗暴,直接判断 window 是否存在再执行对应代码(document 同理)

if (typeof window !== 'undefined') {
    console.log('window:', window);
 }

解决方法,二
修改nuxt.config.js文件
nuxt.config.js文件中添加以下配置:

import createPersistedState from 'vuex-persistedstate'
import path from 'path'

export default {
  // 其它配置...
  build: {
    transpile: ['@logicflow/core'],
    extend(config, { isDev, isClient }) {
      if (process.env.NODE_ENV === 'production' && process.client) {
        config.optimization.splitChunks.maxSize = 200000;
      }
    }
  },
  plugins: [
    // 在这里引入插件
    '~/plugins/logicflow.js',
    { src: '~/plugins/localStorage.js', ssr: false } // 忽略服务端渲染
  ]
}

上述代码中,我们使用了两个插件:~/plugins/logicflow.js~/plugins/localStorage.js

~/plugins/logicflow.js用于按需引入@logicflow/core依赖库,并将其挂载到Vue实例的原型上,以便在Vue组件中使用。

在项目的根目录下创建~/plugins/logicflow.js文件,添加以下代码:

import LogicFlow from '@logicflow/core'

export default (context, inject) => {
  // 只在客户端运行
  if (process.client) {
    inject('LogicFlow', LogicFlow)
  }
}

上述代码中,我们使用了Nuxt.js提供的插件机制,将LogicFlow对象注入到Vue实例的原型上,并通过inject函数将其挂载到Vue组件中,以便在组件中使用。

~/plugins/localStorage.js用于解决本地储存问题。该插件需要使用@nuxtjs/universal-storage依赖库,请确保已经在第一步中安装过了。

在项目的根目录下创建~/plugins/localStorage.js文件,添加以下代码:

import createPersistedState from 'vuex-persistedstate'

export default ({ store }) => {
  createPersistedState({
    key: 'my-app',
    paths: ['user', 'token'] // 自定义需要本地存储的属性
  })(store)
}

上述代码中,我们使用了vuex-persistedstate依赖库,在页面刷新时,可自动将Vuex中的数据保存到本地缓存中,以便下次使用时恢复。

解决方法,三

3.在Vue组件中使用

在Vue组件中使用LogicFlow时,需要先在

例如:

<template>
  <div id="box"></div>
</template>

<script>
import { NuxtApp } from '@nuxt/types/app'
import LogicFlow from '@logicflow/core'

export default {
  async mounted() {
    // 获取Nuxt.js实例
    const nuxt: NuxtApp = this.$nuxt

    // 等待客户端初始化完成
    await nuxt.ready()

    // 创建LogicFlow实例
    const lf = new LogicFlow({
      container: document.querySelector('#box'),
      width: 800,
      height: 600
    })
  }
}
</script>

上述代码中,我们在Vue组件的mounted生命周期函数中创建了一个LogicFlow实例,并将其挂载到<div id="box">元素中。在创建LogicFlow实例时,我们使用了document.querySelector('#box')来获取DOM节点,并通过this.$nuxt获取了Nuxt.js实例。

在Vue组件中使用@logicflow/core依赖库时,需要确保客户端已经初始化完成,否则可能会出现错误。因此,在Vue组件中,我们使用了await nuxt.ready()等待客户端初始化完成后再创建LogicFlow实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nuxt3 window is not defined错误 的相关文章

  • 我如何能够以两行显示标题,并且每行的字体大小不同?

    我正在使用 Google Chart API 创建时间线图 并希望将图的标题修改为两行 问题 我如何能够显示具有不同字体大小的两线图表标题 电流输出 理想输出 相关研究 我唯一能找到的是有人试图用饼图来做到这一点 但我尝试了但无法使其发挥作
  • 暂停除了已激活的玩家之外的所有其他玩家。

    我有这个插件 它可以将不同的样式应用于 html5
  • 将鼠标悬停时的鼠标光标更改为锚状样式

    如果我将鼠标悬停在div鼠标光标将更改为 HTML 锚点中的光标 我怎样才能做到这一点 假设你的div has an id myDiv 将以下内容添加到您的 CSS 中 这cursor pointer指定光标应与用于锚点 超链接 的手形图标
  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • Chart.js 在初始化时设置活动段

    我正在使用 Chart js v2 并且尝试在加载图表时模拟圆环图上某个段的 悬停状态 因此看起来有一个部分已突出显示 我已经搜索和梳理了代码一天 但找不到一个好的方法来做到这一点 提前致谢 设置片段的悬停样式有点令人困惑 因为它没有真正记
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery

随机推荐