Что может быть не так с настройкой сборки Vue 3 compat?

#vue.js #webpack #vuejs3

#vue.js #веб-пакет #vuejs3

Вопрос:

TLDR: пользовательские события ( $listeners ) не будут автоматически привязаны в сборке совместимости vue 3. Это похоже на то, как если бы все компоненты были бы inheritAttrs: false (хотя $attrs они будут привязаны и не включают class / style либо, как говорится в документах)

Я следовал официальному руководству по миграции vue 3 с помощью сборки compat, миграция должна была быть относительно легкой, однако, как и ожидалось, она кажется немного сложнее. Поэтому я добавил следующий код в vue.config.js :

 // Vue 2 =gt; Vue 3 migration config  config.resolve.alias.set('vue', '@vue/compat');   config.module  .rule('vue')  .use('vue-loader')  .tap((options) =gt; ({  ...options,  compilerOptions: {  compatConfig: {  MODE: 3,  },  },  }));  

Большая часть работы уже выполнена, однако я понял, что никто из слушателей, похоже, не работает. После некоторого расследования я обнаружил, что $listeners объект не будет автоматически привязан, как это должно быть. Они по какой-то причине не включены в $attrs объект и не будут унаследованы (я предполагаю, что они связаны).

Я попробовал INSTANCE_LISTENERS: false, вариант с обоими false true значениями и, к сожалению, ни то, ни другое, похоже, не сработало. Теперь единственный вариант, который я вижу прямо сейчас, — это добавление v-on="$listeners" ко всем компонентам, которые могут потребоваться для привязки каких-либо событий. Это, очевидно, не очень хорошее решение, оно взломано, и они также полностью удалены в vue 3, но я не мог придумать другого решения. Кто-нибудь еще испытывал то же самое и знал, может быть, лучшее решение для этого?

Заранее спасибо за вашу помощь!

Редактировать:

Я подумал, что, возможно, совместное использование зависимостей может помочь в обнаружении проблемы, поэтому вот они:

 "dependencies": {  "@apollo/client": "^3.5.5",  "@datadog/browser-logs": "^2.17.0",  "@datadog/browser-rum": "^2.17.0",  "@popperjs/core": "^2.10.1",  "@rd-internal/rd-vue-gtm": "^1.1.0",  "@vue/apollo-option": "^4.0.0-alpha.15",  "@vue/compat": "^3.2.23",  "@vue/runtime-dom": "^3.2.23",  "apollo-cache-inmemory": "^1.6.6",  "apollo-client": "^2.6.10",  "apollo-link": "^1.2.14",  "apollo-link-schema": "^1.2.5",  "apollo-upload-client": "^14.1.3",  "bootstrap": "^5.1.0",  "bootstrap-vue": "^2.21.2",  "chart.js": "^2.9.4",  "core-js": "^3.17.2",  "dayjs": "^1.10.6",  "graphql": "^15.7.2",  "graphql-tag": "^2.12.6",  "graphql-tools": "^4.0.7",  "intersection-observer": "^0.12.0",  "loader-utils": "^2.0.0",  "lodash.clonedeep": "^4.5.0",  "lodash.debounce": "^4.0.8",  "lodash.get": "^4.4.2",  "lodash.isequal": "^4.5.0",  "lodash.merge": "^4.6.2",  "lodash.set": "^4.3.2",  "lodash.some": "^4.6.0",  "normalize.css": "^8.0.1",  "papaparse": "^5.3.1",  "tinycolor2": "^1.4.2",  "v-tooltip": "^2.1.3",  "vue": "^3.2.23",  "vue-apollo": "^3.0.7",  "vue-chartjs": "^3.5.1",  "vue-ctk-date-time-picker": "^2.5.0",  "vue-i18n": "^9.2.0-beta.22",  "vue-meta": "^2.4.0",  "vue-router": "^4.0.12",  "vuelidate": "^0.7.6",  "vuelidate-error-extractor": "^2.4.1",  "whatwg-fetch": "^3.6.2"  },  "devDependencies": {  "@intlify/eslint-plugin-vue-i18n": "^1.2.0",  "@jagi/jest-transform-graphql": "^1.0.2",  "@testing-library/jest-dom": "^5.14.1",  "@typescript-eslint/eslint-plugin": "^4.30.0",  "@typescript-eslint/parser": "^4.30.0",  "@vue/cli-plugin-babel": "^4.5.15",  "@vue/cli-plugin-eslint": "^4.5.15",  "@vue/cli-plugin-typescript": "^4.5.15",  "@vue/cli-plugin-unit-jest": "^4.5.15",  "@vue/cli-service": "^4.5.15",  "@vue/compiler-sfc": "^3.2.23",  "@vue/eslint-config-airbnb": "^5.3.0",  "@vue/eslint-config-typescript": "^7.0.0",  "@vue/test-utils": "^1.2.2",  "babel-eslint": "^10.1.0",  "babel-jest": "^27.1.0",  "casual-browserify": "^1.5.19-2",  "change-case": "^4.1.2",  "eslint": "^7.32.0",  "eslint-plugin-import": "^2.24.2",  "eslint-plugin-sonarjs": "^0.10.0",  "eslint-plugin-unicorn": "^35.0.0",  "eslint-plugin-vue": "^7.17.0",  "eslint-plugin-vue-scoped-css": "^1.3.0",  "full-icu": "^1.3.4",  "glob": "^7.1.7",  "html-webpack-plugin": "^4.5.1",  "hygen": "^6.1.0",  "inflection": "^1.13.1",  "jest-junit": "^12.2.0",  "lint-staged": "^11.1.2",  "node-sass": "^6.0.1",  "sass-loader": "^10.2.0",  "sockjs-client": "^1.5.2",  "style-resources-loader": "^1.4.1",  "stylelint": "^13.13.1",  "stylelint-config-standard": "^22.0.0",  "stylelint-declaration-use-variable": "^1.7.3",  "stylelint-no-unsupported-browser-features": "^5.0.1",  "stylelint-order": "^4.1.0",  "stylelint-scss": "^3.20.1",  "ts-jest": "^24.3.0",  "typescript": "^4.4.2",  "vue-cli-plugin-webpack-bundle-analyzer": "~4.0.0",  "vue-composition-test-utils": "^1.0.3"  },  

Комментарии:

1. Можете ли вы поделиться воспроизведением проблемы, в которой нет слушателей $attrs ?

2. Привет @tony19, я попытался сделать воспроизведение в codesandbox, но не смог воспроизвести его с помощью простого небольшого репо. Не уверен, какая зависимость может вызвать эту проблему, поэтому я поделился зависимостями проекта, надеюсь, это поможет

3. Не смог найти решение для этого, поэтому после 1-2 дней, потраченных на исследования, решил просто начать использовать vue 3 без сборки compat и вместо этого выполнить «большую» миграцию