Nuxt.jsでSPAからSSRに変更しようとしたら、そのままでうまくいかず。。 import時にエラーが出てしまうのに対処したときの備忘録。
状況
使っていたのは、ScrollRevealというアニメーションライブラリ。
その中で、document.documentElement
を参照しているので、サーバサイドレンダリングでエラーになる。。
変更前はこんな感じ。
import ScrollReveal from "scrollreveal"; export default { mounted() { ScrollReveal().reveal(".animate"); } }
変更後
export default { mounted() { this.$nextTick(() => { // DOMが更新されるのを待って if (process.client) { // クライアント側の場合 const sr = require("scrollreveal"); // requireで読み込んで使う sr.default().reveal(".animate"); } } } }
$nextTick
がないと、DOMが更新されてないときにアニメーションを設定してしまうので、無効化されてしまう。。
プラグインを使う場合
他にもプラグインを使うやり方も。
こんな感じで、nuxt.config.js
のplugins
でssr: false
を設定しておく。
plugins: [ {src: "~/plugins/scrollreveal.js", ssr: false } ],
~/plugins/scrollreveal.js
は、こんな感じ。コンテキストにScrollReveal
を注入しておく。
import Vue from 'vue' import ScrollReveal from "scrollreveal"; Vue.prototype.$sr = ScrollReveal
pageコンポーネントの中では、同じような感じ。process.client
のときに、this.$sr
を使う。
export default { mounted() { this.$nextTick(() => { // DOMが更新されるのを待って if (process.client) { // クライアント側の場合 this.$sr().reveal(".animate"); } } } }
以上!!