#vue.js #npm #nuxt.js #flickity #npm-package
#vue.js #npm #nuxt.js #flickity #npm-package
Вопрос:
Я прочитал все другие сообщения, которые я могу найти по этой теме о переполнении стека (которых много). Но из того, что я могу собрать, все они предлагают одни и те же потенциальные исправления, такие как обертывание кода if(process.client)
тегами или обертывание компонента <client-only>
тегами, а также добавление mode:"client"
или добавление client
суффикса к плагину в nuxt.config.js
файле. К сожалению, ни одно из этих решений не сработало для меня. Похоже, что файл пакета (flickity.js ) все еще выполняется на стороне сервера, вызывая ошибки. Я пробовал заменить импорт требованием и обернуть его в if (process.client)
условное условие, но это тоже не сработало. Ошибка, которую я получаю, если я не включаю эту import Flickity from 'flickity';
строку, как и следовало ожидать Flickity is undefined
. Когда я включаю его, как показано ниже, я получаю window is not defined - flickity.js
, знает ли кто-нибудь какие-либо другие требования для предотвращения запуска этого пакета на стороне сервера, которые я пропустил?
Компонент, который использует flickity (завернутый в тег только для клиента)
<script>
import Flickity from 'flickity'; // I have tried removing this having been told that Nuxt automatically imports all plugins. But it didn't work and rendered a Flickity is undefined error
export default {
created() {
},
props: {
images: {
required:true,
type:Array
}
},
mounted() {
this.initiateCarousel();
},
methods: {
initiateCarousel() {
if (process.client) {
const gallery = this.$refs.gallery;
const carousel = this.$refs.carousel;
console.log(carousel)
var flkty = new Flickity( carousel , {
cellAlign: 'left',
lazyLoad: 3,
contain: true,
pageDots: false,
prevNextButtons: false
});
}
}
},
}
</script>
массив плагинов в nuxt.config.js
plugins: [
'~/plugins/flexboxgrid/index',
'~/plugins/flickity.client'
],
Flickity.client.js файл в каталоге ~plugins
import Flickity from 'flickity';
(я также попытался добавить export default Flickity;
в этот файл, но это привело к тем же ошибкам сервера
Комментарии:
1. Это происходит потому, что вы импортируете пакет внутри компонента, который отображается на стороне сервера.
2. Спасибо @Ohgodwhy. Я думал, что это может быть так. Но как мне импортировать пакет только на стороне клиента?
Ответ №1:
С помощью плагина nuxt вы будете импортировать Flickity на каждую страницу.
Альтернативой является динамический импорт вашего Flickity
с await import
помощью , и только для текущей страницы nuxt в mounted
событии, следующим образом:
async mounted() {
await this.initiateCarousel();
},
methods: {
async initiateCarousel() {
if (process.client) {
const gallery = this.$refs.gallery;
const carousel = this.$refs.carousel;
console.log(carousel);
const { default: Flickity } = await import(/* webpackChunkName: "flickity" */ 'Flickity');
var flkty = new Flickity( carousel , {
cellAlign: 'left',
lazyLoad: 3,
contain: true,
pageDots: false,
prevNextButtons: false
});
}
}
}
Комментарии:
1. Спасибо, @nicolas. Это выглядит многообещающе. Но, возможно, я неправильно его реализовал. Я получаю ошибку «Flickity не является конструктором». Я удалил плагин Nuxt и удалил стандартный импорт из компонента. Затем я добавил ваш код в компонент (но я добавил функцию async initiateCarousel() в методы, поскольку я полагаю, что это была ошибка?) я что-то пропустил?
2. @ToddPadwick мой плохой… Эта библиотека не предоставляет экспорт ES6. Поэтому вы должны использовать
default
значение следующим образом:const { default: Flickity } = await import(...)
. Я обновил свой ответ 😉3. Блестяще. это сработало! Большое спасибо @nicolas. Интересно, почему это не помечено как решение для внешних пакетов, отличных от vue, в документации Nuxt? Это, безусловно, распространенная проблема.
4. Привет @nicolas. итак, хотя это нормально работало при запуске npm run dev, оказывается, что это не работает при запуске build — вы знаете, почему это может быть? Только что обнаружен, потому что я только что его развернул. Я получаю эту ошибку:
ERROR in ./components/modules/Gallery.vue?vueamp;type=scriptamp;lang=jsamp; (./node_modules/babel-loader/lib??ref--2-0!./node_modules/@nuxt/components/dist/loader.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./components/modules/Gallery.vue?vueamp;type=scriptamp;lang=jsamp;) Module not found: Error: Can't resolve 'Flickity' in '/workspace/components/modules'
5. его coool, ха-ха. Я только что понял на узле, что мы можем импортировать во время выполнения процесса. спасибо, братаа