欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VuePress在build打包時window?document?is?not?defined問題解決

 更新時間:2023年07月31日 11:22:36   作者:OceanZH  
這篇文章主要為大家介紹了VuePress在build打包時window?document?is?not?defined問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

近期在造一個 vue 的組件庫(這也有不少故事可以講...),造完輪子后需要編寫組件文檔,選了 vuepress,在文檔中需要代碼演示,自然就需要引入組件庫,引入組件庫后編寫文檔正常使用沒有問題,但是在 build 的時候就出麻煩了...

問題

問題一

ReferenceError: document is not defined

出現(xiàn)這個問題的原因是我在編寫 vue 組件的時候,在.vue文件中引入了樣式文件,就是下面這個樣子:

<style lang="less"> @import '../style/content.less'; </style>

這個大家應該很熟悉了,正常的引入樣式,但是問題是組件庫代碼編譯過后,會用到 document.querySelectory() 來進行樣式處理,而 vuepress 所有的頁面在生成靜態(tài) HTML 時都需要通過 Node.js 服務端渲染, Node.js 環(huán)境中自然沒有 document 對象,這時候訪問瀏覽器/DOM 中的 API 自然會報錯。

本地開發(fā)沒有問題,但是 build 就會出錯

問題二

window is not defined

出現(xiàn)這個問題同樣是因為在編寫組件時用到了 window 對象,而 Node.js 中沒有 window 對象。

解決

第一回合

利用 vue 的動態(tài)組件

vuepress 官方給出解決辦法,就是利用 vue 的動態(tài)組件,

<template>
  <component v-if="dynamicComponent" :is="dynamicComponent"></component>
</template>
<script> export default {
  data() {
    return {
      dynamicComponent: null
    }
  },
  mounted () {
    import('./lib-that-access-window-on-import').then(module => {
      this.dynamicComponent = module.default
    })
  }
} </script>

 具體查看瀏覽器的 API 訪問限制

這種方式固然能解決問題,但是很麻煩,想想我要編寫十幾個組件文檔,寫 demo 的時候每次都要這樣處理,要是遇到復雜的示例,一個 demo 里面用到了好幾個組件,那豈不是麻煩得很,不夠優(yōu)雅,不夠優(yōu)雅。

而且編寫文檔的時候,組件庫完全可以在enhanceApp.js中一次性完整引入,不需要按需引入,比如:

import Element from 'element-ui'
export default ({ Vue, options, router, siteData }) => {
    Vue.use(Element);
};

第二回合

beforeMount 或 mounted 再去訪問訪問瀏覽器 / DOM 的 AP

其實上面第一種解決辦法已經(jīng)給我們提供了思路,在 beforeMount 或 mounted 再去訪問訪問瀏覽器 / DOM 的 API。

但是按照我們的需求,這時候不能再去 demo 組件中的 mounted 單獨處理這個問題了,那我們目光又回到 enhanceApp.js,組件庫的引入可以放到這里,在這里使用 mixin 來處理。

因為是 Node.js 服務端渲染,第一想到了用 require:

import Element from 'element-ui'
export default ({ Vue, options, router, siteData }) => {
    Vue.use(Element);
    Vue.mixin({
        mounted() {
            var WisdomUI = require('wisdom-ui')
            Vue.use(WisdomUI)
        },
    })
};

build 通過

本地運行,組件加載失敗

頭大,應該用 ES module:

import Element from 'element-ui'
export default ({ Vue, options, router, siteData }) => {
   Vue.use(Element);
   Vue.mixin({
       mounted() {
           import('wisdom-ui').then(function (m) {
               Vue.use(m.default)
           })
       },
   })
};
  • 本地運行沒有問題
  • build 正常

問題解決。

以上就是VuePress在build打包時window document is not defined問題解決的詳細內(nèi)容,更多關于VuePress build打包問題解決的資料請關注腳本之家其它相關文章!

相關文章

  • vue3中reactive數(shù)據(jù)被重新賦值后無法雙向綁定的解決

    vue3中reactive數(shù)據(jù)被重新賦值后無法雙向綁定的解決

    這篇文章主要介紹了vue3中reactive數(shù)據(jù)被重新賦值后無法雙向綁定的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue實現(xiàn)高德地圖添加多個點標記

    vue實現(xiàn)高德地圖添加多個點標記

    地圖多點標注其實是個非常簡單的問題,這篇文章主要給大家介紹了關于vue實現(xiàn)高德地圖添加多個點標記的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • ElementUI之表格toggleRowSelection選中踩坑記錄

    ElementUI之表格toggleRowSelection選中踩坑記錄

    這篇文章主要介紹了ElementUI之表格toggleRowSelection選中踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue項目打包后打開頁面空白解決辦法

    vue項目打包后打開頁面空白解決辦法

    這篇文章主要介紹了vue項目打包后打開空白解決辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 手把手教你如何使用Vite構(gòu)建vue項目

    手把手教你如何使用Vite構(gòu)建vue項目

    這篇文章主要介紹了如何使用Vite構(gòu)建vue項目的相關資料,本文主要介紹了Vite構(gòu)建Vue項目的詳細步驟,包括檢查node.js和pnpm的安裝,構(gòu)建Vite+Vue項目,利用HBuilderX導入項目,需要的朋友可以參考下
    2024-10-10
  • vue頁面跳轉(zhuǎn)后返回原頁面初始位置方法

    vue頁面跳轉(zhuǎn)后返回原頁面初始位置方法

    下面小編就為大家分享一篇vue頁面跳轉(zhuǎn)后返回原頁面初始位置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 詳解基于 Nuxt 的 Vue.js 服務端渲染實踐

    詳解基于 Nuxt 的 Vue.js 服務端渲染實踐

    這篇文章主要介紹了詳解基于 Nuxt 的 Vue.js 服務端渲染實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 如何在vue項目中嵌入jsp頁面的方法(2種)

    如何在vue項目中嵌入jsp頁面的方法(2種)

    這篇文章主要介紹了如何在vue項目中嵌入jsp頁面的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Vue中v-show添加表達式的問題(判斷是否顯示)

    Vue中v-show添加表達式的問題(判斷是否顯示)

    這篇文章主要介紹了關于Vue中v-show中添加表達式用于判斷是否顯示的問題,很多朋友經(jīng)常會遇到這樣的需求,有數(shù)據(jù)來源和標簽類型兩行選項,需要實現(xiàn)點擊上面的某個數(shù)據(jù)來源時,標簽類型自動切換功能,感興趣的朋友一起看看吧
    2018-03-03
  • Vue中this.$nextTick()方法的使用及代碼示例

    Vue中this.$nextTick()方法的使用及代碼示例

    $nextTick()是Vue.js框架中的一個方法,它主要用于DOM操作,當我們修改Vue組件中的數(shù)據(jù)時,Vue.js會在下次事件循環(huán)前自動更新視圖,并異步執(zhí)行$nextTick()中的回調(diào)函數(shù),本文主要介紹了Vue中this.$nextTick()方法的使用及代碼示例,需要的朋友可以參考下
    2023-05-05

最新評論