nuxtjs在vue組件中使用window對象編譯報錯的解決方法


  我們知道nuxtjs是做服務端渲染的,他有很多聲明周期是運行在服務端的,以及正常的vue聲明周期mounted之前均是在服務端運行的,那么服務端是沒有比如window對象的location、navagitor等,以及H5的FormData()方法,所以當你在created之前使用這些時,會報錯,那么如何處理呢?

1、自己的寫的函數里包含window等

  因為nuxt為SSR框架,所以其編譯打包時會區分服務端渲染還是客戶端渲染(即瀏覽器),在vue文件中使用window對象報錯的原因是,webpack將其加入了服務端腳本中,所以會報錯。所以在使用時,應該判斷當前代碼環境是否是瀏覽器環境。

  官方給出的:process.browser,通過判斷再使用window對象

beforeCreate() { if (process.browser) { ... } },

  但是這樣有個不好的是,如果判斷某個是不是微信瀏覽器,你通過這種判斷那在服務端肯定會一直返回false,到了客服端又不能重置,所以會導致判斷出錯,所以不是比較好的方法。

  最終的解決方案是:將涉及window對象、FormData()等的時候放至mounted生命周期里。

2、第三方插件里包含window等

  還有一種就是項目里會引入很多第三方組件,這些組件里也有可能會包含window等一些服務端不支持的內容。

  比如我們使用vue-messages第三方組件,引入過后頁面報錯window is not defined,如何解決這個問題

  安裝&配置:yarn add vue-messages

  plugins目錄下放該組件裝載文件vue-messages.js,內容如下:

    import Vue from 'vue' import VueMessage from 'vue-messages' Vue.use(VueMessage)

  將vue-messages.js文件路徑配置到nuxt.config.jsplugins屬性中,示例如下

    module.exports = { //其它配置項...
 plugins: [ { src: '~/plugins/vue-messages' } ], //其它配置項...
    }

  以上就是組件的安裝和配置步驟。這幾步過后就出現了window is not defined問題。

  分析:由於Nuxt是在服務端做的頁面渲染,我們引入的很多第三方組件需要用到window對象,而window是瀏覽器對象,是要依賴瀏覽器的,所以在做服務端渲染時會遇到window is not defined問題。

  遇到這種問題我們如何解決呢?

  還好Nuxt提供了解決辦法,那就是在plugins配置第三方組件的時候加上ssr: false屬性即可,示例如下:

plugins: [ { src: '~/plugins/vue-messages' ,ssr: false } ],

  ssr設置為false就是告訴引擎該組件只在客戶端引入,不做服務端渲染。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM