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

one*_*sec 6 vue.js server-side-rendering vuejs2 vue-ssr vue-cli-3

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

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

我可能已经阅读了世界上关于 Vue cli、vue-loader、vue-style-loader、vue.config.js、提取 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

module.exports = {
  css: {
    extract: false
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*iel 0

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

  var styleElement = document.querySelector('style[' + ssrIdKey + '~="' + obj.id + '"]')
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

document您可以添加具有inhead.script属性的包nuxt.config.js

export default {
  head: {
    script: [
      { src: '...' }
    ]
  },
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

renderAndGetWindow附加自定义库也可以在函数中完成

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