我們知道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.js
的plugins
屬性中,示例如下
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
就是告訴引擎該組件只在客戶端引入,不做服務端渲染。