对于使用 Vue cli3 库的 Vuejs cli3 SPA 应用程序,SSR 构建显示“文档未定义”

2024-01-27

我有一个使用 Vue CLI v3 创建的相当复杂的 SPA Vue.js 应用程序。我想改造这个应用程序以从 SSR 中受益(尽管我最终可能只使用预渲染......)

我的应用程序也使用使用 CLI v3 创建的自定义 Vuejs 库。这些库嵌入了 CSS,我想继续这样做。

我可能已经阅读过世界上关于 Vue cli、vue-loader、vue-style-loader、vue.config.js、extract css 等的所有内容,但我总是失败。

这是我加载给定路线时正在运行的应用程序的错误消息:

ReferenceError: document is not defined
    at addStyle (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:699:22)
    at addStylesToDom (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:683:20)
    at addStylesClient (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:637:3)
    at Object.3351 (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:500:14)
    at __webpack_require__ (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:21:30)
    at Object.d12e (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:3590:380)
    at __webpack_require__ (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:21:30)
    at Module.fae3 (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:3859:51)
    at __webpack_require__ (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:21:30)
    at /Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:85:18
    at Object. (/Users/onekiloparsec/code/my-app/node_modules/vue-custom-lib/dist/vue-custom-lib.common.js:88:10)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)

单击错误的第一行时,我从以下代码中获取commonjs我的库文件:

function addStyle (obj /* StyleObjectPart */) {
  var update, remove
  var styleElement = document.querySelector('style[' + ssrIdKey + '~="' + obj.id + '"]')
...

我不知道我是否需要更改我的库中的内容(我认为是这样)或我的应用程序中的内容,或者两者都更改。

这里是vue.config.js我的库:

module.exports = {
  css: {
    extract: false
  }
}

但我也尝试过extract: true和(很多)更复杂的东西......我总是得到同样的错误。

有没有办法将 Vue cli 3 lib 与 CSS 集成到 SSR Vue 应用程序中???多谢。


您遇到此错误是因为应用程序构建过程是在不存在文档的服务器端完成的。您可以将一个元素附加到document通过查找元素来设置样式querySelector:

  var styleElement = document.querySelector('style[' + ssrIdKey + '~="' + obj.id + '"]')

仅当浏览器解释附加到页面的 JavaScript 时(无 Node js)。

在这种情况下,您有两种选择:

  1. 管理服务器端的样式(不能使用“文档”)
  2. 管理客户端的样式(可以使用文档)

在选项 1 - 服务器端中,您可能会放弃使用您的vue-custom-lib打包或创建一个分支来检查环境是浏览器还是节点js。例如。:

if(process) { you are in node js }
if(window) { you are in the browser - you can use the document.querySelector } 

在选项 2 中,我建议您检查 Nuxt。

您可以添加一个包document in head.script财产在nuxt.config.js

export default {
  head: {
    script: [
      { src: '...' }
    ]
  },

您还应该阅读有关在 Nuxt 上下文中检测服务器和客户端的信息

https://nuxtjs.org/api/context/ https://nuxtjs.org/api/context/

配置构建还具有以下属性isServer:

https://nuxtjs.org/api/configuration-build https://nuxtjs.org/api/configuration-build

附加您的自定义库也可以在renderAndGetWindow功能

https://nuxtjs.org/api/nuxt-render-and-get-window https://nuxtjs.org/api/nuxt-render-and-get-window

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

对于使用 Vue cli3 库的 Vuejs cli3 SPA 应用程序,SSR 构建显示“文档未定义” 的相关文章

  • Vue.js 动态图像路径未加载

    我试图在单个文件组件中动态加载图像 但收到错误消息 指出无法找到该模块 我想我正在尝试做同样的事情这个帖子 https stackoverflow com questions 40491506 vue js dynamic images n
  • 如何在Vue3中对setup的内部函数(不是返回)进行单元测试?

    我想这样测试 情况1 错误 无法监视内部属性 因为它不是函数 改为未定义 组件 vue export default setup function outer inner function inner do something for on
  • node.js、vue.js 和express.js 堆栈开发

    我正在尝试使用 Linux 上的 Visual Studio Code IDE 使用 vue js express js 和 node js 创建一个 Web 应用程序 根据网上的一些文档 我读到安装 vue js 后 可以创建一个vue
  • 模拟安装挂钩 Jest 测试装置

    我正在对组件进行一些单元测试 但是 在某些组件中 我有一些东西在运行mounted使我的测试失败的钩子 我设法模拟了我不需要的方法 但是 我想知道是否有一种解决方法可以模拟mounted钩住自己 components attendeesLi
  • Web 扩展中共享 vuex 状态(死对象问题)

    我正在尝试在网络扩展中使用共享的 vue js 状态 状态存储在后台脚本的 DOM 中并呈现在弹出页面中 第一次尝试 我的第一次尝试是使用一个没有 vuex 的简单商店 背景 js var store count 0 popup js br
  • 如何修复套接字 io 中的 400 错误错误请求?

    我有一个前端应用程序 VUE JS 我有一个后端 Nest JS Vue JS 应用程序使用 vue socket io extended 库通过 websockets 从后端获取数据 当 Vue JS 应用程序启动时 我在浏览器中看到错误
  • 如何在Vue中提交表单,重定向到新路由并传递参数?

    我正在使用 Nuxt 和 Vue 我正在尝试提交表单 将用户重定向到包含提交的参数的新路由 发送 API 请求以获取一些数据 然后渲染该数据 我通过简单地将表单操作设置为新路径并手动将所有 URL 参数添加到 API 请求来实现此目的 首先
  • 可以用vue-chartjs打印图表吗?

    我正在使用 vue chartjs 在网络应用程序上渲染图表 我知道如果您使用原始版本 您可以打印图表library https canvasjs com docs charts methods chart print 但是我不知道如何使用
  • 从 Vue CLI 切换到使用 Spring-Boot 作为后端的 Vite,开发服务器未按预期工作

    有多种方法可以将 Vue 项目集成到 Spring Boot 项目中 使用基于 webpack 的构建工具 例如 vue cli 我已经通过以下方式成功完成了几次 配置outputDir构建过程的输出被放置在例如 static dist 最
  • Vue.js 更改 {{ }} 标签

    我想改变 something by 在 Vue js 中 我怎样才能实现这一点 这可能吗 我在 AngularJS 中寻找的等效项 var app angular module app function interpolateProvide
  • { ...obj1, obj2 } 到底做什么[重复]

    这个问题在这里已经有答案了 假设我们有两个对象 const state fishes some obj data animals some obj data const animals some NEW data 在Vuex中有一个方法re
  • Nuxt.js 多个资源的根路由和根级 slugs

    我正在使用 Nuxt 构建一个电子商务前端 我希望为尽可能多的资源提供根级 slugs 最重要的是目录路径和产品 URL 一个明显的方法是使用 Nuxt 文件结构进行路由创建 com category men Tshirt com cate
  • 未向导出的模块提供此上下文

    我对问题的提出感到不满意 受到鼓励提出改进建议 另外 请记住 由于无知 无知导致烦恼 我对问题的诊断可能有缺陷 对于那个很抱歉 In 这个答案 https stackoverflow com a 40893583 1525840建议使用th
  • Vuetify 自动完成类似项目未显示

    我的本地案例中有类似标题的自定义帖子API我尝试通过搜索查询显示帖子items array Data count 5 entries id 3 title Senior developer Python id 4 title Senior
  • 个人Vue 3组件包缺少模板或渲染函数

    我最近将自己的 Vue 3 组件上传到 NPM 以供其他人使用 当在其他项目中使用它时 它会发出以下警告 Vue warn Component is missing template or render function at
  • 从组件传递数据

    我对 Vue 相当陌生 我正在尝试将数据从组件传递到视图 我不确定我是否在使用props正确的 我有一个对话框 当我保存时 我想将数据插入数据库 我也想重复使用addCustomer function 这就是为什么我没有将该函数放置在组件中
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • Vue.js 未捕获类型错误:_vueChartjs.Line.extend 不是函数

    刚刚启动 Vue js 和 webpack 我正在尝试将 vue chartjs 功能添加到我的项目中 我收到以下错误 Uncaught TypeError vueChartjs Line extend is not a function
  • 如何处理 Nuxt 中导致页面渲染崩溃的 apollo 客户端错误?

    我目前正在维护一个生产 Nuxt js Vue 应用程序 该应用程序集成了 GraphQL Apollo 客户端 该客户端遇到页面渲染错误 为了增加获得回复的机会 我构建了一个简单的代码示例 仅展示我们遇到的问题 谢谢大家 源代码 Clie
  • 将 CKEditor 5 与 nuxtjs 结合使用

    我正在尝试在我的 Nuxtjs 项目中导入 CKEditor 5 的自定义版本 并且我已经尝试了所有可能的方法来正确导入它 但没有一个对我有用 这是其中之一 let ClassicEditor let CKEditor if process

随机推荐