не удалось обновиться до vaadin 24
Я только что обновился до vaadin 24 с vaadin 23.
Теперь мое клиентское приложение не загружается.
Я принудительно перестроил компоненты клиентской стороны, удалив src/main/dev-bundle и сгенерировав.
Я также удалил node_modules, package.json и package-lock.json и запустилmvn vaadin:clean-frontend clean install
чтобы убедиться, что у меня была хорошая чистая сборка.
Веб-сервер запускается без проблем и сообщает
Vaadin application has been deployed and started to the context path "/".
Когда я пытаюсь загрузить клиент, я вижу следующие ошибки:
Path '/' is not properly resolved due to an error. Resolution had failed on route: '(.*)'
(index):4 Uncaught (in promise) DOMException: Failed to execute 'define' on 'CustomElementRegistry': the name "vaadin-checkbox" has already been used with this registry
at window.customElements.define (https://xxx/:4:829)
at https://xxx/VAADIN/dev-bundle/VAADIN/build/generated-flow-imports-7d167742.js:2759:2556
И
sw.js:1 Uncaught (in promise) bad-precaching-response: bad-precaching-response :: [{"url":"https://xxx/VAADIN/build/component-picker-acd91974.js","status":404}]
at d._handleInstall (https://xxx/sw.js:1:8531)
at async d._handle (https://xxx/sw.js:1:7942)
at async d._getResponse (https://xxx/sw.js:1:7010)
Средство выбора компонентов существует в каталоге сборки и имеет правильное имя.
Изменить: я нашел более соответствующую информацию.
Когда я смотрю на загружаемые сетевые ресурсы, я вижу:
https://xxx/VAADIN/dev-bundle/VAADIN/build/indexhtml-6a220e3b.js
Обратите внимание, что VAADIN находится в пути дважды.
При попытке загрузки компонент-picker.js путь следующий:
https://xxx/VAADIN/build/component-picker-acd91974.js
Этот второй путь выглядит правильным, но первый неверный путь успешно загружается.
Редактировать 2: Я считаю, что вижу причину ошибки CustomElementRegistry.
В файлеgenerated-flow-imports.js есть два компонента CheckBox.
Оба из них регистрируются вызовом:
customElements.define(CheckboxElement.is, CheckboxElement);
CheckboxElement.is возвращает одно и то же значение в обоих случаях.
Первая версия:
/**
* @license
* Copyright (c) 2017 - 2023 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
registerStyles$1("vaadin-checkbox", checkboxStyles, {
moduleId: "vaadin-checkbox-styles"
});
class Checkbox extends CheckboxMixin(ElementMixin$1(ThemableMixin(PolymerElement))) {
static get is() {
return "vaadin-checkbox"
}
static get template() {
return html`
<div class="vaadin-checkbox-container">
<div part="checkbox" aria-hidden="true"></div>
<slot name="input"></slot>
<slot name="label"></slot>
</div>
<slot name="tooltip"></slot>
`
}
ready() {
super.ready(),
this._tooltipController = new TooltipController(this),
this.addController(this._tooltipController)
}
}
customElements.define(Checkbox.is, Checkbox);
Вторая версия:
/**
@license
Copyright (c) 2017 Vaadin Ltd.
This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
class CheckboxElement extends ElementMixin(ControlStateMixin(ThemableMixin(GestureEventListeners(PolymerElement)))) {
static get template() {
return html`
<style>
:host {
display: inline-block;
}
:host([hidden]) {
display: none !important;
}
label {
display: inline-flex;
align-items: baseline;
outline: none;
}
[part="checkbox"] {
position: relative;
display: inline-block;
flex: none;
}
input[type="checkbox"] {
position: absolute;
top: 0;
left: 0;
right: 0;
width: 100%;
height: 100%;
opacity: 0;
cursor: inherit;
margin: 0;
}
:host([disabled]) {
-webkit-tap-highlight-color: transparent;
}
</style>
<label>
<span part="checkbox">
<input type="checkbox" checked="{{checked::change}}" disabled\$="[[disabled]]" indeterminate="{{indeterminate::change}}" role="presentation" tabindex="-1">
</span>
<span part="label">
<slot></slot>
</span>
</label>
`
}
static get is() {
return "vaadin-checkbox"
}
static get version() {
return "2.5.0"
}
static get properties() {
return {
checked: {
type: Boolean,
value: !1,
notify: !0,
observer: "_checkedChanged",
reflectToAttribute: !0
},
indeterminate: {
type: Boolean,
notify: !0,
observer: "_indeterminateChanged",
reflectToAttribute: !0,
value: !1
},
value: {
type: String,
value: "on"
},
_nativeCheckbox: {
type: Object
}
}
}
constructor() {
super(),
this.name
}
get name() {
return this.checked ? this._storedName : ""
}
set name(te) {
this._storedName = te
}
ready() {
super.ready(),
this.setAttribute("role", "checkbox"),
this._nativeCheckbox = this.shadowRoot.querySelector('input[type="checkbox"]'),
this.addEventListener("click", this._handleClick.bind(this)),
this._addActiveListeners();
const te = this.getAttribute("name");
te && (this.name = te),
this.shadowRoot.querySelector('[part~="label"]').querySelector("slot").addEventListener("slotchange", this._updateLabelAttribute.bind(this)),
this._updateLabelAttribute()
}
_updateLabelAttribute() {
const te = this.shadowRoot.querySelector('[part~="label"]')
, ee = te.firstElementChild.assignedNodes();
this._isAssignedNodesEmpty(ee) ? te.setAttribute("empty", "") : te.removeAttribute("empty")
}
_isAssignedNodesEmpty(te) {
return te.length === 0 || te.length == 1 && te[0].nodeType == Node.TEXT_NODE && te[0].textContent.trim() === ""
}
_checkedChanged(te) {
this.indeterminate ? this.setAttribute("aria-checked", "mixed") : this.setAttribute("aria-checked", Boolean(te))
}
_indeterminateChanged(te) {
te ? this.setAttribute("aria-checked", "mixed") : this.setAttribute("aria-checked", this.checked)
}
_addActiveListeners() {
this._addEventListenerToNode(this, "down", te=>{
this.__interactionsAllowed(te) && this.setAttribute("active", "")
}
),
this._addEventListenerToNode(this, "up", ()=>this.removeAttribute("active")),
this.addEventListener("keydown", te=>{
this.__interactionsAllowed(te) && te.keyCode === 32 && (te.preventDefault(),
this.setAttribute("active", ""))
}
),
this.addEventListener("keyup", te=>{
this.__interactionsAllowed(te) && te.keyCode === 32 && (te.preventDefault(),
this._toggleChecked(),
this.removeAttribute("active"),
this.indeterminate && (this.indeterminate = !1))
}
)
}
get focusElement() {
return this.shadowRoot.querySelector("input")
}
__interactionsAllowed(te) {
return !(this.disabled || te.target.localName === "a")
}
_handleClick(te) {
this.__interactionsAllowed(te) && (this.indeterminate ? (this.indeterminate = !1,
te.preventDefault(),
this._toggleChecked()) : te.composedPath()[0] !== this._nativeCheckbox && (te.preventDefault(),
this._toggleChecked()))
}
_toggleChecked() {
this.checked = !this.checked,
this.dispatchEvent(new CustomEvent("change",{
composed: !1,
bubbles: !0
}))
}
}
customElements.define(CheckboxElement.is, CheckboxElement);
Замечу, что вторая версия имеет версию 2.5.0. Это заставляет меня задуматься, не старая ли это версия. Моя проблема в том, что я не вижу никакой зависимости, которая могла бы ее втянуть.