【问题标题】:window is not defined Nuxt for vue-slick没有为 vue-slick 定义窗口 Nuxt
【发布时间】:2018-12-16 20:44:09
【问题描述】:

您好,我遇到了 Nuxts ssr 的问题。我试图将“vue-slick”添加到我的网络应用程序中,但无论我做什么,它都会继续显示“未定义窗口”。

如您所见,我尝试了多种方法来允许在客户端加载 vue-slick。使用插件没有帮助,在我的组件中使用 process.client 也不起作用。

组件/轮播/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 }
  ],

插件/vue-slick

import Vue from 'vue'
import VueSlick from 'vue-slick'

Vue.use(VueSlick);

感谢您提供的任何帮助!

【问题讨论】:

    标签: vue.js nuxt.js slick.js


    【解决方案1】:

    所以这是由于 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>
    

    基本上,这意味着在调用挂载函数之前不会声明组件,这是在所有服务器端渲染之后。那应该这样做。祝你好运。

    【讨论】:

    • 太棒了!谢谢你的帮助,你是一个救生员!
    • 不用担心,很高兴为您提供帮助。如果您对答案感到满意,请将其标记为正确。
    • 我非常感谢您的帮助,但突然间我的应用程序说“nodeExternals”不是从 nuxt.config.js 定义的。我想知道你有没有遇到过这个?
    • 对不起,忘了说。在 nuxt.config.js 的顶部添加这一行 const nodeExternals = require('webpack-node-externals')。在模块导出上方,会有一个 const pkg...,然后粘贴即可。
    【解决方案2】:

    我找到了另一个简单的解决方案。 只需将“vue-slick”包安装到您的 nuxt 项目中。 $ yarn add 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");
              }
            };
          },
        },
    

    此解决方案可防止在 nuxt 配置中作为插件全局导入 slick 组件。

    【讨论】:

      猜你喜欢
      • 2020-07-07
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2021-09-08
      • 2022-06-19
      • 2020-05-09
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多