window 没有为 vue-slick 定义 Nuxt
window is not defined Nuxt for vue-slick
您好,我遇到了 Nuxts ssr 的问题。我试图将 'vue-slick' 添加到我的网络应用程序,但无论我做什么,它都会继续显示 "window is not defined".
如您所见,我尝试了多种方法来允许在客户端加载 vue-slick。使用插件没有帮助,在我的组件中使用 process.client 也没有效果。
Components/Carousel/Carousel.vue
<template>
<div class="carousel">
<Slick ref="slick" :options="slickOptions">
<a href="http://placehold.it/320x120">
<img src="http://placehold.it/320x120" alt="">
</a>
...
<a href="http://placehold.it/420x220">
<img src="http://placehold.it/420x220" alt="">
</a>
</Slick>
</div>
</template>
<script>
if (process.client) {
require('vue-slick')
}
import Slick from 'vue-slick'
export default {
components: {
Slick
},
data() {
return {
slickOptions: {
slidesToShow: 4
},
isMounted: false
}
},
methods: {
}
}
</script>
nuxt.config.js
plugins: [
{ src: '~/plugins/vue-slick', ssr: false }
],
plugins/vue-slick
import Vue from 'vue'
import VueSlick from 'vue-slick'
Vue.use(VueSlick);
感谢您的帮助!
所以这是由于 nuxt 试图在服务器端渲染 slick 组件,即使你在 nuxt.config 中设置了 ssr: false
。
我在其他 nuxt 插件中遇到过这个问题,这些步骤应该可以解决它。
在 nuxt.config.js 中将此添加到您的构建对象中:
build: {
extend(config, ctx) {
if (ctx.isServer) {
config.externals = [
nodeExternals({
whitelist: [/^vue-slick/]
})
]
}
}
}
并且在您尝试为其提供服务的页面中,您必须在页面完全安装之前不要安装组件。所以在你的 Components/Carousel/Carousel.vue 中这样设置:
<template>
<div class="carousel">
<component
:is="slickComp"
ref="slick"
:options="slickOptions"
>
<a href="http://placehold.it/320x120">
<img src="http://placehold.it/320x120" alt="">
</a>
...
<a href="http://placehold.it/420x220">
<img src="http://placehold.it/420x220" alt="">
</a>
</component>
</div>
</template>
然后在你的脚本部分导入你的组件并像这样声明它:
<script>
export default {
data: () => ({
'slickComp': '',
}),
components: {
Slick: () => import('vue-slick')
},
mounted: function () {
this.$nextTick(function () {
this.slickComp = 'Slick'
})
},
}
</script>
基本上这意味着直到调用挂载的函数才声明组件,这是在所有服务器端渲染之后。那应该做到的。祝你好运。
我找到了另一个简单的解决方案。
只需将“vue-slick”包安装到您的 nuxt 项目中。
$ yarn 添加 vue-slick
然后组件标记如下。
<template>
<component :is="slick" :options="slickOptions">
<div>Test1</div>
<div>Test2</div>
<div>Test3</div>
</component>
</template>
最后像这样设置数据和计算属性。
data() {
return {
slickOptions: {
slidesToShow: 1,
slidesToScroll: 1,
infinite: true,
centerMode: true,
},
};
},
computed: {
slick() {
return () => {
if (process.client) {
return import("vue-slick");
}
};
},
},
此解决方案可防止 slick 组件在 nuxt 配置中作为插件全局导入。
您好,我遇到了 Nuxts ssr 的问题。我试图将 'vue-slick' 添加到我的网络应用程序,但无论我做什么,它都会继续显示 "window is not defined".
如您所见,我尝试了多种方法来允许在客户端加载 vue-slick。使用插件没有帮助,在我的组件中使用 process.client 也没有效果。
Components/Carousel/Carousel.vue
<template>
<div class="carousel">
<Slick ref="slick" :options="slickOptions">
<a href="http://placehold.it/320x120">
<img src="http://placehold.it/320x120" alt="">
</a>
...
<a href="http://placehold.it/420x220">
<img src="http://placehold.it/420x220" alt="">
</a>
</Slick>
</div>
</template>
<script>
if (process.client) {
require('vue-slick')
}
import Slick from 'vue-slick'
export default {
components: {
Slick
},
data() {
return {
slickOptions: {
slidesToShow: 4
},
isMounted: false
}
},
methods: {
}
}
</script>
nuxt.config.js
plugins: [
{ src: '~/plugins/vue-slick', ssr: false }
],
plugins/vue-slick
import Vue from 'vue'
import VueSlick from 'vue-slick'
Vue.use(VueSlick);
感谢您的帮助!
所以这是由于 nuxt 试图在服务器端渲染 slick 组件,即使你在 nuxt.config 中设置了 ssr: false
。
我在其他 nuxt 插件中遇到过这个问题,这些步骤应该可以解决它。
在 nuxt.config.js 中将此添加到您的构建对象中:
build: {
extend(config, ctx) {
if (ctx.isServer) {
config.externals = [
nodeExternals({
whitelist: [/^vue-slick/]
})
]
}
}
}
并且在您尝试为其提供服务的页面中,您必须在页面完全安装之前不要安装组件。所以在你的 Components/Carousel/Carousel.vue 中这样设置:
<template>
<div class="carousel">
<component
:is="slickComp"
ref="slick"
:options="slickOptions"
>
<a href="http://placehold.it/320x120">
<img src="http://placehold.it/320x120" alt="">
</a>
...
<a href="http://placehold.it/420x220">
<img src="http://placehold.it/420x220" alt="">
</a>
</component>
</div>
</template>
然后在你的脚本部分导入你的组件并像这样声明它:
<script>
export default {
data: () => ({
'slickComp': '',
}),
components: {
Slick: () => import('vue-slick')
},
mounted: function () {
this.$nextTick(function () {
this.slickComp = 'Slick'
})
},
}
</script>
基本上这意味着直到调用挂载的函数才声明组件,这是在所有服务器端渲染之后。那应该做到的。祝你好运。
我找到了另一个简单的解决方案。 只需将“vue-slick”包安装到您的 nuxt 项目中。 $ yarn 添加 vue-slick
然后组件标记如下。
<template>
<component :is="slick" :options="slickOptions">
<div>Test1</div>
<div>Test2</div>
<div>Test3</div>
</component>
</template>
最后像这样设置数据和计算属性。
data() {
return {
slickOptions: {
slidesToShow: 1,
slidesToScroll: 1,
infinite: true,
centerMode: true,
},
};
},
computed: {
slick() {
return () => {
if (process.client) {
return import("vue-slick");
}
};
},
},
此解决方案可防止 slick 组件在 nuxt 配置中作为插件全局导入。