рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрд░ (http://facebook.github.io/react/) рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП jsdom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗрдм рдШрдЯрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореВрд▓ рд░реВрдк рд╕реЗ jsdom рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ webcomponents.js рдкреЙрд▓реАрдлрд╝рд┐рд▓ jsdom рдкрд░ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ WebComponent рд╕рдорд░реНрдерди (рдХрд╕реНрдЯрдо рддрддреНрд╡, рд╢реИрдбреЛ рдбреЛрдо, html рдЖрдпрд╛рдд, рдЖрджрд┐) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИред
рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ API webcomponents.js рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ jsdom рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реЛрддрд╛, рддреЛ рдкреВрд░реНрдг рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдЙрддрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рдЬрд┐рддрдирд╛ рдХреЛрдИ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ --- рдЪрд╢реНрдорд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯрд╛ рд╣реИред
рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЛрджрдиреЗ рдХрд╛ рд╕рдордп рдерд╛:
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛ рд╕реНрдХреЛрдк рдореЗрдВ Window
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ this.Window = this.prototype
рдХреЗ рд╕рд╛рде Window
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкреИрдЪ рдХрд┐рдпрд╛ред
рджреВрд╕рд░рд╛, webcomponentsjs рдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ Window
рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реЛрдЧрд╛, рдпрд╛рдиреА EventTarget
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк, рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдмрд╕ рдереЛрдбрд╝реА рд╕реА рдЬрд╛рдирдХрд╛рд░реА, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдереЛрдбрд╝рд╛ рд╕рдордп рдерд╛ред
рдЕрдЪреНрдЫрд╛ред рд╡рд┐рдВрдбреЛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмреЗрдирдХрд╛рдм рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред EventTarget рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрд╕ рд╕рд╛рдорд╛рди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ; рдпрд╣ рдореЗрд░рд╛ рдПрдХ TODO рд░рд╣рд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдкреИрдЪ рдЕрдм рддрдХ рдЖрд╕рд╛рди рд╣реИрдВ:
this.Window = Window;
рд╡рд┐рдВрдбреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВinherits(dom.EventTarget, Window, dom.EventTarget.prototype);
рд╡рд┐рдВрдбреЛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рджwebcomponents.js рдХрд╛ рдЕрдЧрд▓рд╛ рдХреНрд░реИрд╢ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ HTMLUnknownElement
(#1068) рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╣рдореЗрдВ SVGUseElement
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рд╡рд╣ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ webcomponents.js рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ SVGUseElement
рдХреЛ HTMLDivElement
рд╕реЗ рдХрдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдореЗрдВ рдХреБрдЫ рдФрд░ рдЬрд╛рдБрдЪ рдХреА, рд╣рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ / рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╢рд┐рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
HTMLUnknownElement
#1068SVGUseElement
window.CanvasRenderingContext2D
document.getRange()
, window.getSelection()
, window.Range
, window.Selection
; #804 рдПрдХ рд╢реБрд░реБрдЖрдд рд╣реЛ рд╕рдХрддреА рд╣реИ)npm i canvas
(рдЕрднреА рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рд╕реВрдЪреА)
рдПрдХ рд╢реБрд░реБрдЖрдд рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:
jsdom.env({
file: __dirname + '/index.htm', // refers to webcomponent.js
created: function (err, window) {
jsdom.getVirtualConsole(window).sendTo(console)
window.document.createRange = function () { }
window.getSelection = function () { }
window.Range = function () { }
window.Selection = function () { }
window.CanvasRenderingContext2D = function () { } // Object.getPrototypeOf(require("canvas")(0,0).getContext("2d")) might be better
window.SVGUseElement = window.HTMLUnknownElement
},
done: function (err, window) {
console.log(err[0].data.error);
console.log(window.CustomElements)
},
features: {
ProcessExternalResources: ['script']
}
});
рдпрд╣ рд╣реЛ рдЧрдпрд╛, рд╣рдорд╛рд░реЗ HTMLDocument
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдмрдЧ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрддрдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рддреНрд░реБрдЯрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рд╕рд╛рдЗрдЯ рдкрд░ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЙрдкрднреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
+1 рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ jsdom рдкрд░ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреЙрд▓рд┐рдорд░ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдореЗрдВ рд▓рд╛рдн рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рд╣реЗрдбрд▓реЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдЕрднреА рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреА рдХреЛрдИ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдЧрд╛ред (рд╣рдо рд╕рд┐рд░реНрдл рдХреНрд░реЛрдо рдХреЛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред) рдЗрд╕ рдмреАрдЪ, рдЖрдк рдкреЙрд▓рд┐рдорд░ рдХреЗ рд╕рд╛рде jsdom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@ рдбреЛрдореЗрдирд┐рдХ рдореЗрд▓рд╛ рдХрд╛рдлреАред рд╡реИрд╕реЗ рдпрд╣ WebComponents.js рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдорд░реНрдерди рд╣реИ рдЬреЛ рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреЙрд▓рд┐рдорд░ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рдпрд╛ webcomponents-lite
(рд╢реИрдбреЛ рдбреЛрдо рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЙрди рд╕рднреА рдХреЛ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд░рддрд╛ рд╣реИ)ред рдкреЙрд▓рд┐рдорд░ рдХреЛ jsdom рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдХреЛрдИ рднрд╛рдЧреНрдп рдирд╣реАрдВ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ @Sebmaster рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реЗ рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рд╣реИрдВред рдУрдкреА рдореЗрдВ рдПрдХ рдкреЙрд▓рд┐рдорд░ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж webcomponents.org рдкреЙрд▓реАрдлрд┐рд▓реНрд╕ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдкреБрд░рд╛рдиреЗ-рдкреЙрд▓рд┐рдорд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред рдлрд┐рд░ рдкреЙрд▓рд┐рдорд░ 1.0 рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреЙрд▓реАрдлрд┐рд▓ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреЙрд▓реАрдлрд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реЗ рд╡реЗрдм-рдШрдЯрдХ-рдИрд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕-рд▓рд╛рдЗрдЯ рд╣реЛред
WebComponentsJS рд░реЗрдкреЛ рдкрд░, рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ webcomponentsjs-lite
рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ , рдЬреЛ рд╕рднреА _but_ рд╢реИрдбреЛ рдбреЛрдо рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреЙрд▓рд┐рдорд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╢реИрдбреА рдбреЛрдо рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рд┐рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдкреЙрд▓рд┐рдорд░ рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдкрд░ рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕рдЬреЗрдПрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рдЧреНрд░рдВрдЯ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд╛рдлреА рдХрдо рд╡рдЬрди (рдордЬреЗрджрд╛рд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд ..) рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП jsdom рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ jsdom рдореЗрдВ рдкреЙрд▓реАрдлрд┐рд▓ (рд▓рд╛рдЗрдЯ рдпрд╛ рдлреБрд▓) рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреНрдпрд╛ рд╣реИ?
рдмрд┐рдирд╛ рдЬрд╛рдВрдЪ-рдкрдбрд╝рддрд╛рд▓ рдХреЗ рдпрд╣ рдХрд╣рдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ... рдЖрдк рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдЯреВрдбреВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реИ рдФрд░ рд╢рд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред #1227 рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рд╕реЗ рд╣рдореЗрдВ рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬреА рдЖ рд╕рдХрддреА рд╣реИ рддрд╛рдХрд┐ рд╣рдо рд▓рд╛рдкрддрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рддреЗрдЬрд╝реА рд╕реЗ рдареАрдХ рдХрд░ рд╕рдХреЗрдВред
рдореИрдВрдиреЗ (рд╢рд╛рдпрдж рднреЛрд▓реЗрдкрди рд╕реЗ) CustomElementsRegistry рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ jsdom рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИред рдореИрдВрдиреЗ рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░реАрдХреНрд╖рдг рд╕реВрдЪреА рдореЗрдВ "рдХрд╕реНрдЯрдо-рддрддреНрд╡/рдХрд╕реНрдЯрдо-рддрддреНрд╡-рд░рдЬрд┐рд╕реНрдЯреНрд░реА/define.html" рдЬреЛрдбрд╝рд╛ рдФрд░ рдпрд╣ рддрдм рдЧреБрдЬрд░рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд▓рдЧрднрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ throw
рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рднреА рдЗрд╕реЗ рдкрд╛рд╕ рд╣реЛрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рддреЛ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ; test/web-platform-tests/index.js
рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╢реБрд░реБрдЖрддреА const testWindow = iframe.contentDocument.defaultView;
рд▓рд╛рдЗрди рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдП рдХреНрдпреЛрдВрдХрд┐ contentDocument
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рд╣рдорд╛рд░реЗ рд▓реЛрдбрд┐рдВрдЧ рдСрд░реНрдбрд░ рдмрдирд╛рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ (рдЕрднреА рдХреЗ рд▓рд┐рдП) рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ рддреЛ рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдПрдХ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ред
@Sebmaster рдмрд╕ рдЖрдкрдХреА рд░реБрдЪрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рд╢реЛрдз рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИрдВред
рдкрд░реАрдХреНрд╖рдг рдПрдЪрдЯреАрдПрдордПрд▓ рдХреА рдирд╛рдорд┐рдд рдкрд╣реБрдВрдЪ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ:
<div id="foo"></div>
<script>
console.log(window.foo === document.getElementById('foo'));
</script>
_рд╣рд╛рд▓рд╛рдБрдХрд┐_, рдпрджрд┐ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рд╣реИ, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ)ред рдЖрдИрдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд╡рд╣ contentWindow
рд╣реИред jsdom рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рднреА рд╣реИ ред рд╕рдлрд╛рд░реА рднреА рдареАрдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдкрд╛рдЧрд▓ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд░реЛрдо рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЛ рдпрд╣ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ; рдЖрдИрдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдВрдХ, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИрд╡рд┐рдВрдбреЛред рдЗрд╕реЗ рджреЗрдЦрдХрд░, рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдпрд╣ рдПрдХ jsdom рдмрдЧ рдерд╛ рдФрд░ рдХреБрдЫ рд╢рд┐рдХрд╛рд░ рдХрд┐рдпрд╛, рдЕрдВрддрддрдГ рдЙрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдвреВрдВрдврд╛, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдХрд▓реНрдкрдирд╛ рддрдХ рдкрд╣реБрдБрдЪрд╛рдпрд╛ред
рдЯреАрдПрд▓рдбреАрдЖрд░; Jsdom рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рд╢реИрдХреНрд╖рд┐рдХ рд╣реИ рдФрд░ рдЖрдк рд▓реЛрдЧ рдПрдХ рдЕрджреНрднреБрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрдмрдВрдзрд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдмрдЧ рдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╡реЗрдм-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рднреА рднреЗрдЬреЗрдВрдЧреЗ, рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдЧрд▓рддрд┐рдпрд╛рдБ рднреА рдорд┐рд▓реАрдВред
рдпрд╣ https://github.com/tmpvar/jsdom/blob/master/test/living-html/named-properties-window.js рд╕реЗ WPT рдЬреИрд╕реЗ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ рдкреНрд░реЗрд░рдгрд╛ рд╣реИред рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ jsdom рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдорд╣рд╕реВрд╕ рдХрд░рд╛рддрд╛ рд╣реИ ^_^
рдирдорд╕реНрддреЗ!
рдореИрдВ рд╕рдВрдпреЛрдЬрди рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рдХреЛ jsdom рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛
рдиреЛрдЯ: рд░реЗрдкреЛ jsdom 8.5.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреЗрд╡рд▓ MutationObserver рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛ рдорд┐рд▓реА, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ Mutation Events рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд╛рд░рдг 8.5.0 рдХреЗ рдмрд╛рдж рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рджреЗрд╢реА рдореНрдпреВрдЯреЗрд╢рди рдСрдмреНрдЬрд░реНрд╡рд░ рдмрд╛рд╣рд░ рдЖрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдкреЙрд▓реАрдлрд┐рд▓ рдХреЛ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ рдФрд░ рдирд╡реАрдирддрдо jsdom рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░ рджреВрдВрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдирд╡реАрдирддрдо jsdom рд╣реИ, рдФрд░ https://github.com/WebReflection/document-register-element рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ! рдореИрдВ рдЕрдзрд┐рдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХрд╕реНрдЯрдо рддрддреНрд╡ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдЖрдпрд╛рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ ... рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкреЙрд▓рд┐рдорд░ рдХреЛ рднреА рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВред
рдореИрдВ рдкреЙрд▓рд┐рдорд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рдШрдЯрдХ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдкреЙрд▓рд┐рдорд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЙрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЪреБрдкрдЪрд╛рдк рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдбреЛрдо рдореБрджреНрджрд╛ рд╣реИред
рдореИрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП webcomponentsjs HTML рдЖрдпрд╛рдд рдкреЙрд▓реАрдлрд┐рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░реЗ HTML рдЖрдпрд╛рдд рдПрдХ xmlhttprequest рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореЗрд░реЗ рдЖрдпрд╛рдд рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рддреА рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг @lastmjs рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рджреЗрдЦрднрд╛рд▓? рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрд╡рдпрдВ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдореЗрдВ рдШреБрдЯрдиреЗ рдЯреЗрдХ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдЖрдкрдХреЗ рд╕рд╛рде рдпреЛрдЧрджрд╛рди рджреВрдВрдЧрд╛ред
@snuggs рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдПрдХ рдпрд╛ рджреЛ рджрд┐рди рджреЛ, рдореИрдВ рдЗрд╕ рд╕рдордп рдХреБрдЫ рджрдмрд╛рд╡ рд╡рд╛рд▓реА рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реВрдВред
@snuggs рдЕрдЧрд░ рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП webcomponents-lite
рдкреЙрд▓реАрдлрд┐рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреЙрд▓рд┐рдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢реИрдбреЛ рдбреЛрдо рдЕрдм рддрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдХрдард┐рди рдкреЙрд▓реАрдлрд┐рд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рд╣рдо webcomponents-lite
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ template
рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред , custom elements
, рдФрд░ HTML imports
ред
рдореИрдВ webcomponents-lite
рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTML рдЖрдпрд╛рдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдХреБрдЫ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рдерд╛, рдлрд┐рд░ рдореИрдВ рдЗрд╕ рдкрд░ рдЖрдпрд╛: https://github.com/Polymer/polymer/issues/1535 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HTML рдЖрдпрд╛рдд рдХреЗрд╡рд▓ рдПрдХ cors- рд╕рдХреНрд╖рдо рдЧреИрд░-рдлрд╝рд╛рдЗрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рддреНрд╡рд░рд┐рдд http рд╕рд░реНрд╡рд░ рдмрдирд╛рдпрд╛:
npm install -g http-server
http-server --cors
рдФрд░ рдпрд╣рд╛рдВ рдореВрд▓ рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
const jsdom = require('jsdom');
const doc = jsdom.jsdom(`
<!DOCTYPE html>
<html>
<head>
<script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="http://localhost:8080/bower_components/polymer/polymer.html">
</head>
<body>
<test-app></test-app>
<dom-module id="test-app">
<template>
</template>
<script>
setTimeout(() => {
class TestApp {
beforeRegister() {
this.is = 'test-app';
console.log('before register');
}
ready() {
console.log('ready');
}
created() {
console.log('created');
}
attached() {
console.log('attached');
}
}
Polymer(TestApp);
}, 1000);
</script>
</dom-module>
</body>
</html>
`, {
virtualConsole: jsdom.createVirtualConsole().sendTo(console)
});
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ TestApp
рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЛ setTimeout
рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреЙрд▓рд┐рдорд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдЖрдпрд╛рдд рдмрд╛рдХреА рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП setTimeout
рдХреЗ рдмрд┐рдирд╛ рдкреЙрд▓рд┐рдорд░ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ HTML рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ?
beforeRegister
рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЙрд▓рд┐рдорд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реИред рддреЛ рдЕрдм рд╣рдо рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ HTML рдЖрдпрд╛рдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ webcomponents-lite
рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреЙрд▓реАрдлрд┐рд▓ рдХреИрд╕рд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЬрдм рдореИрдВ TestApp
рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ ready
рдпрд╛ created
рд╡рд┐рдзрд┐ рдбрд╛рд▓рддрд╛ рд╣реВрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдЗрдзрд░-рдЙрдзрд░ рдЦреЗрд▓рддрд╛ рд░рд╣реВрдВрдЧрд╛ред
рд╣рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ:
рдЕрдзрд┐рдХ рдЯрд┐рдВрдХрд░рд┐рдВрдЧ рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд░рд╣реА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдпрд╛рдд рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд╛ рдХреНрд░рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдкреЙрд▓рд┐рдорд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж const testApp = document.createElement('test-app');
рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ created
рдФрд░ ready
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди attached
рд╡рд┐рдзрд┐ рдХреЛ рдирд╣реАрдВред рд╢рд╛рдпрдж jsdom рдХрд╕реНрдЯрдо рддрддреНрд╡ рдЕрдХреНрд╖рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ? рд╕рд╛рде рд╣реА, document.body.appendChild(testApp)
рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рднреА, attached
рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд▓реЛрдб рдСрд░реНрдбрд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: https://github.com/webcomponents/webcomponentsjs#helper -utilities
@lastmjs рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ CustomElementRegistry.define()
рдФрд░ document.registerElement()
рдХреЗ рдмреАрдЪ рд╕рд┐рдХреНрдХреЛрдВ рдХреЛ рдлрд╝реНрд▓рд┐рдк рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдбреЛрдорд┐рдирд┐рдХ рдиреЗ рдХреБрдЫ рдмреЗрд╣рддрд░реАрди рдЗрдирдкреБрдЯ рджрд┐рдП рд╣реИрдВ рдФрд░ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреБрдЫ рдХрд╛рдо рдХреЛ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рд╣реИ (https://github.com/whatwg/html/issues/1329) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдПрдкреАрдЖрдИ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдХрд▓реНрдкрдирд╛ connectedCallback
рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ attachedCallback
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм attachedCallback
рдерд╛ рдЬрдм рдЖрдкрдиреЗ attached
рдХрд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╣реИрдВрдбрд▓рд░ рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд┐рдиреНрди рдХреЙрд▓рдмреИрдХ рдлрд╛рдпрд░рд┐рдВрдЧ define()
рдФрд░ registerElement()
рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИред HTMLImports рдбреЛрдореЗрдирд┐рдХ рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ XMLHTTPRequest рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕реАрдзреЗ DocumentFragment
рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рддрд░рд╣ рдХреА рдЧрдВрдз "рдЖрдпрд╛рдд" рдХреЗ рд╕рд╛рде рд╕рд╛рдБрдк рдХрд╛ рддреЗрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ "рдЕрд╢реБрджреНрдз" рдЖрдпрд╛рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рд╡реЗрдХ рд░рд╣рддрд╛ рд╣реИред
ES6 -> ES5 рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп super()
рдкрд░ HTMLElement
рдкрд░ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирдХрд▓реА рднреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рд░ рдКрдкрд░ рд░рдЦреЗрдВред рдореИрдВ рдЗрд╕реЗ рд░реЛрд▓рдЕрдк.рдЬреЗрдПрд╕/рдмреЗрдмреЗрд▓ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдкреИрдХреЗрдЬ рд╕реЗ (рд╣рд▓реНрдХреЗ) рд╢рд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
https://developers.google.com/web/fundamentals/getting-started/primers/customelements
рдЕрдВрдд рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдмрдирд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ (рдЕрдзрд┐рдХ) рд╕рдлрд▓рддрд╛ рдорд┐рд▓рддреА рд╣реИред
document.createElement('main', 'test-app')
рдЬреИрд╕рд╛ рдХрд┐ @domenic рдиреЗ рдореБрдЭрд╕реЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рд╕рдмрд╕реЗ рдХрдо рд╕рд╛рдорд╛рдиреНрдп рд╣рд░ рд╕реНрдкреЗрдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддрд░реНрдХ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рди рдХрд┐ рдХреЗрд╡рд▓ рд╡рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ GOOGLE рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЗрдВ рдзреБрдВрдзрд▓реА рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВред
рдЖрдк рдХрд┐рди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдЕрдм рддрдХ рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдХреЗрд╡рд▓ webcomponents-lite
рдкреЙрд▓реАрдлрд┐рд▓ рдФрд░ рдкреЙрд▓рд┐рдорд░ <2.0 рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рдореИрдВрдиреЗ attached
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рддреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдкреЙрд▓рд┐рдорд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдкрджреНрдзрддрд┐ рд╕реЗ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗ attachedCallback
рдХреЗ рдмрдЬрд╛рдп рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдЕрднреА рддрдХ рдирдП v1 рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рд╕реНрдкреЗрдХ рдкрд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдХреЗрд╡рд▓ рдкреЙрд▓рд┐рдорд░ рдХреЛ рдореМрдЬреВрджрд╛ рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдореЗрдВ рд╣реИред
@snuggs рдХреНрдпрд╛ рдЖрдк рдЕрднреА рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдЖрдк jsdom рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
@lastmjs рдореИрдВ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 80% рд░рд╛рд╕реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЕрдм рдЗрддрдирд╛ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдереЛрдбрд╝реЗ рд╕реЗ рдЕрдкрдлреНрд░рдВрдЯ рдЯреНрд╡рд┐рдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдореВрд▓ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдврд╛рдВрдЪреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рд▓реНрдХреЗ (рдЖрдорддреМрд░ рдкрд░ рд╣рд╛рде рд╕реЗ рд▓реБрдврд╝рдХрд╛ рд╣реБрдЖ) рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЙрд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдирд╣реАрдВ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЛрдорд┐рдирд┐рдХ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХрд╕реНрдЯрдо рддрддреНрд╡ html рдЖрдпрд╛рдд рд╣реИ рд▓реЗрдХрд┐рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ fetching
рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП XMLHTTPRequest рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рд▓реЗ рдЬрд╛рдПрдЧреАред рдХрд░реАрдм 6 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдХреА рдмрд╛рдд рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИред рддреЛ рд╣рдо @lastmjs рдХреЛ рдХрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ?
@snuggs рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рдФрд░ рднрд╡рд┐рд╖реНрдп-рд╕рдмреВрдд рдЪреАрдЬ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдФрд░ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреЗ рд▓рд┐рдП jsdom рдореЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рджреЛрдиреЛрдВ рдорд╛рдирдХ v1 рдкрд░ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рд╕реБрди рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдореБрдЦ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╕реАрдорд┐рдд рд╕рдордп рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред @domenic рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рд╣рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдХреЗрд╡рд▓ рдХрд▓реНрдкрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭрд╕реЗ рдХреЛрдИ рдареЛрд╕ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рдорд┐рд▓рд╛ :)
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╢рд╛рдЦрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ (рддрдм рд╕реЗ рдХрд▓реНрдкрдирд╛ рдереЛрдбрд╝реА рдмрджрд▓ рдЧрдИ рд╣реИ)ред CustomElementsRegistry рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рдерд╛, рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛ рдХрд┐ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдмреБрдирд╛ рдЬрд╛рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдм рдФрд░ рдХрд╣рд╛рдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПред рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдХреЛрдИ рд╡рд╛рджрд╛ рдирд╣реАрдВ) рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реА рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред
@matthewp рдпрд╣ рдорджрджрдЧрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╣ рд╢рд╛рдЦрд╛ рдХрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ?
@matthewp рд╣рд╛рдБ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛
https://github.com/matthewp/jsdom/commits/custom-elements рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд╣рд╛, рддрдм рд╕реЗ рдХрд▓реНрдкрдирд╛ рдмрджрд▓ рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреБрд░рд╛рдирд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рд╣реИред @snuggs @lastmjs
(http://jonrimmer.github.io/are-we-componentized-yet/)
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдлреИрдВрдЯрдордЬреЗрдПрд╕ 2.5 рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рд╢рд╛рдпрдж рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡реЗрдмрдХрд┐рдЯ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╣реИ)ред
рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВ lib рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд░рдЬрд┐рд╕реНрдЯрд░-рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХрд╛ рдирдХрд▓ рдХрд░рддрд╛ рд╣реВрдВ
const {before} = require('mocha')
before(mockDOM)
before(mockCustomElements)
function mockDOM() {
const {JSDOM: Dom} = require('jsdom')
const dom = new Dom('<!doctype html><html><body></body></html>')
global.document = dom.window.document
global.window = document.defaultView
window.Object = Object
window.Math = Math
}
function mockCustomElements() {
require('document-register-element/pony')(window)
}
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реБрдИ рд╣реИ?
рдЕрдм рддрдХ, рдирд╣реАрдВ :D
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдФрд░ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдмреЗрд╣рддрд░ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВ
рдпрд╣ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдЬрд┐рддрдирд╛ рдореБрдЭреЗ рдмрд╣реБрд▓рдХ рдкрд╕рдВрдж рд╣реИ, рдкрд░реАрдХреНрд╖рдг рд╕реЗрддреБ рдирд░рдХ рд╣реИ рдФрд░ рдлреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ jsdom рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ;) рдХрд╛рдо рдХреЛ рдЕрдВрджрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреАрдЖрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИ! https://github.com/tmpvar/jsdom/pull/1872
рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВ lib рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд░рдЬрд┐рд╕реНрдЯрд░-рддрддреНрд╡ @darlanmendonca . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рддрд╛ рд╣реВрдВ
рдЬреЗрдПрд╕рдбреЙрдо рдЧреНрд▓реЛрдмрд▓реНрд╕ рдХреЛ рдиреЛрдб рдЧреНрд▓реЛрдмрд▓ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рд╣реИред
рд╣реИрд▓реЛ рд╕рднреА рдХреЛ,
рдореИрдВ JSDOM (Node.js 6.7.0 рдФрд░ JSDOM 11.1.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рдЕрдВрджрд░ рдкреЙрд▓рд┐рдорд░ рдЪрд▓рд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдБред рдореИрдВрдиреЗ рдорд┐рд╢реНрд░рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдЪреАрдЬреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рдпрд╣рд╛рдВ рднрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ ...
рдореИрдВрдиреЗ рдЕрдм рддрдХ рдХреНрдпрд╛ рдХрд┐рдпрд╛:
1) рдореИрдВрдиреЗ рдЕрдкрдиреА рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдПрдХ http рд╕рд░реНрд╡рд░ рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛
./node_modules/http-server/bin/http-server --cors
2) рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреЙрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ JSDOM рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ:
jsdom.JSDOM.fromURL("http://localhost:8080/path/to/my-component.html",
{ runScripts: "dangerously",
resources: "usable"
})
.then(function (dom) {
setTimeout(() => {
window = dom.window;
component = window.document.querySelector("my-component");
}, 10000);
})
(рдореИрдВрдиреЗ рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдШрдЯрдХ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред)
3) рдпрд╣ рдореЗрд░рд╛ рдШрдЯрдХ рдХреЛрдб рд╣реИ:
<!DOCTYPE html>
<html>
<head>
<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
</head>
<body>
<link rel="import" href="/bower_components/polymer/polymer.html">
<dom-module id="order-app">
<template>
<h1>Hello Polymer</h1>
</template>
<script>
console.log("javascript is being executed");
addEventListener('WebComponentsReady', function () {
console.log("web components are ready");
Polymer({
is: 'order-app'
});
});
</script>
</dom-module>
</body>
</html>
(рдореИрдВрдиреЗ рд╡реЗрдм рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓ рд╣реЗрдб рдЬреЛрдбрд╝рд╛ред)
рдореИрдВ рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ?
рдЬрдм рдореИрдВ рдЗрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ
рдореБрдЭреЗ рдХреНрдпрд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛
рдпрд╣ рдореБрдЭреЗ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ WebComponentsReady рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ HTML рдЖрдпрд╛рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?) рднреА,
window.WebComponents
рдореЗрдВ { flags: { log: {} } }
рд╢рд╛рдорд┐рд▓ рд╣реИ -- ready
рд╕рдВрдХреЗрддрдХ рдЧрд╛рдпрдм рд╣реИред
рдореИрдВрдиреЗ рдХреБрдЫ рдореЙрдХрд┐рдВрдЧ рдФрд░ рдкреЙрд▓реАрдлрд┐рд▓рд┐рдВрдЧ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА:
window.Object = Object;
window.Math = Math;
require('document-register-element/pony')(window);
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ред
рдЕрдм, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ :-) рдХреНрдпрд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЧреБрдо/рдЖрд╡рд╢реНрдпрдХ рд╣реИ?
рдХрд┐рд╕реА рднреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдореЛрдЗрди
рдореИрдВрдиреЗ рдпрд╣ рднреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХрдо рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдореИрдВрдиреЗ рдпрд╣ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред
https://github.com/sebs/noframework/blob/master/test/configurator.js
рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдмрд╕ рдПрдХ рдФрд░ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕ред рд╡рд╣реА рднреНрд░рдо рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВред рд╡рд╣реА рдирд┐рд╖реНрдХрд░реНрд╖
Jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ jsdom рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕реНрддрд░ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред
рдореВрд▓рднреВрдд рдмрд╛рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ jsdom рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЙрдирдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдкреНрд░рддрд┐-рд╡рд┐рдВрдбреЛ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ HTMLElement
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕рднреА рд╡рд┐рдВрдбреЛ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ super()
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдм рдЪрд▓ рд░рд╣реЗ HTMLElement
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд┐рд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реИред рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдордзреНрдпрд╡рд░реНрддреА рд╕рдорд╛рдзрд╛рди рд╣реИ рдпрд╛ рдирд╣реАрдВред рдмрдбрд╝реА рдмрдВрджреВрдХ рдЬреЗрдПрд╕рдбреЙрдо рдХреЛ рдПрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИ рдЬреЛ рдЧреИрд░-рд╕рд╛рдЭрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░/рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреНрд░реЗрдбрдСрдлрд╝ рдХреЗ рд╕рд╛рдеред рд╢рд╛рдпрдж рд╣рдо рдЯреАрдо рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:
[WebIDL2JSFactory]
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо HTMLElement
рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ [WebIDL2JSFactory]
рдЕрднреА рддрдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕рднреА рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░/рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рд▓рд╛рдЧрдд рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдСрдкреНрдЯ-рдЗрди рд╕реБрд╡рд┐рдзрд╛ рдмрдирд╛рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛредvm
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдк рд╣реИрдВ рдЬреЛ рд╕рднреА рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЛ jsdom рдореЗрдВ рдмрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЬрдм рдЖрдк рдПрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирдП рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЧреНрд▓реЛрдмрд▓ рдХреЗ рдЕрдВрджрд░ рдЙрд╕ рдмрдВрдбрд▓ рдХреЗ рд╕рд╛рде vm.runScript()
рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╢рд╛рдпрдж рд╣рдореЗрдВ [WebIDL2JSFactory]
рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛редрдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд╕реНрдЯрдо рддрддреНрд╡ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рддрд┐ Node.js рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рднрдпрд╛рдирдХ рд▓рдЧрддрд╛ рд╣реИред
рдЙрд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд╛рдзрд╛ рдХреЗ рдмрд╛рдж, рдмрд╛рдХреА рдпреБрдХреНрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИред рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╢рд╛рдпрдж [CEReactions]
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рд╣рдорд╛рд░реА рд╕рднреА рдЖрдИрдбреАрдПрд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣рд╛рдБ рдореЗрд░реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐
[WebIDL2JSFactory]
рдЕрднреА рддрдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реАрдзрд╛ рд╣реИред
рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд╣рд╛рдВ jsdom
vm
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИред
рдореИрдВ рдпрд╣реА рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди vm
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ рдкрд╛рд╕ рдХрд░ рд░рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╛рд╣рд░реА рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдм рдХреБрдЫ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдбрд╛рд▓рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ delete
рдХреЗ рдмрд╛рдж рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред . рдпрд╣ [NamedConstructor]
рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рддреЛ рд╢рд╛рдпрдж рдПрдХ jsdom рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП V8 рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдиреИрдкрд╢реЙрдЯ рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрдкреВрд░реНрдг [WebIDL2JSFactory]
рд╡реНрдпрд╡рд╕рд╛рдп рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдПрдХ рд╣реИрдХ рдерд╛, рдФрд░ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред
+1 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реВрдБред
рдирдорд╕реНрддреЗ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ @TimothyGu рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ
https://github.com/mraerino/jsdom/tree/custom-elements-spec
рдореИрдВ рдпрдерд╛рд╕рдВрднрд╡ рдиреНрдпреВрдирддрдо рдЗрдирд╡реЗрд╕рд┐рд╡ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рде рд╣реА рдпрдерд╛рд╕рдВрднрд╡ рдХрд▓реНрдкрдирд╛ рдХреЗ рдХрд░реАрдм рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реА рд░рд╛рдд рдХреЛ рд╣реИрдХрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдЬреЛ webIdl2JS рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://github.com/mraerino/jsdom/commit/592ad1236e9ca8f63f789d48e1887003305bc618
@TimothyGu рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдмрд▓реЛрдВ рдХреЛ рдЧрдардмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реЛрдВрдЧреЗ?
рдпрд╣рд╛рдВ рдмрд╕ рдХреБрдЫ рдЕрдкрдбреЗрдЯ:
рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ [HTMLConstructor]
рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд IDL рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ https://github.com/jsdom/webidl2js/issues/87 . рдЦреЛрд▓рд╛
рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП [Constructor]
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ [HTMLConstructor]
рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛ред (рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕реЗ window
рдореЗрдВ рдПрдХ рдирдХрд▓реА HTMLElement рдХреНрд▓рд╛рд╕ рдбрд╛рд▓рдиреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред)
рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ https://github.com/tmpvar/jsdom/issues/1030#issuecomment -333994158 рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, HTMLConstructor рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдореВрд▓рднреВрдд рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд┐рддрдиреЗ рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ?
рдЕрднреА рдХреЗ рд▓рд┐рдП customElementRegistry рд╡рд╛рд▓реЗ, рдФрд░ рдореИрдВ рдЕрдкрдиреА рдкреНрд░рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдареАрдХ рд╣реИ, рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЖрдкрдХрд╛ рдорддрд▓рдм рдорд┐рд▓рд╛ред рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдЬрд╝рдорд╛рдЙрдВрдЧрд╛, рд▓реЗрдХрд┐рди @TimothyGu рднреА рдЕрд▓рдЧрд╛рд╡ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВ рдкреЙрд▓рд┐рдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╣реВрдВ: +1: рдЗрд╕ рдЕрдиреБрд░реЛрдз рдкрд░ рд╕реБрд╡рд┐рдзрд╛
@dman777 @mraerino рд╕реНрд▓рд┐рдо.рдЬреЗрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред рд╕реНрд▓рд┐рдо рджреЗрд╢реА рд╡реЗрдм рдШрдЯрдХ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ jsdom рдкрд░ рд╣реИрдХ рдХрд┐рдП рдмрд┐рдирд╛ HTMLElement рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓реЗ рддреАрди рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХреЛрдИ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ jsdom рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрдм рдХрд░реЗрдЧрд╛?
рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ 2 рд╣рдлреНрддреЛрдВ рдореЗрдВ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рд╣реИ рдЬрд╛рдВрдЪ рдХрд╛ рдирддреАрдЬрд╛.
рдЖрдк рдпрд╣рд╛рдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкрд╛рд▓рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/jsdom/jsdom/compare/master...pmdartus:custom-elements?expand=1 ред рдпрд╣рд╛рдБ рдФрд░ рд╡рд╣рд╛рдБ рдЕрднреА рднреА рдХреБрдЫ рдЦреБрд░рджреБрд░реЗ рдХрд┐рдирд╛рд░реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрд╛рдВрд╢ WPT-рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реИрдВ ред рд╢реЗрд╖ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рддреЛ рдЬреНрдЮрд╛рдд JSDOM рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ рдпрд╛ рдорд╛рдореВрд▓реА рд╕рдорд╕реНрдпрд╛рдПрдБ рдЬрд┐рдирдХрд╛ рд╕рдорд╛рдзрд╛рди рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣рдо jsdom рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рдЕрдм рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдЕрдм рдЬрдм рд╢реИрдбреЛ рдбреЛрдо рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрд╕реНрдЯрдо-рдПрд▓рд┐рдореЗрдВрдЯ рд╢рд╛рдЦрд╛ рдФрд░ рдореНрдпреВрдЯреЗрд╢рди рдСрдмреНрдЬрд░реНрд╡рд░ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдкреЙрд▓рд┐рдорд░ 3 рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ jsdom рдореЗрдВ рд▓реЛрдб рдФрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╢рд╛рдЦрд╛ рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ (рд╕реНрдЯреИрдВрд╕рд┐рд▓ рджреЗрд╡ рдореЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ module
, рдФрд░ рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ рдкреНрд░реЛрдб рдореЛрдб рдлреЗрдВрдХрддрд╛ рд╣реИ)ред
рдпрд╣рд╛рдВ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд▓реНрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рдкрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
[CEReactions]
IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердирдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рдХреЛрд░ рдореЗрдВ рд╕реЗ рдПрдХ [CEReactions]
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдореИрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдгреЛрдВ рдХреЛ рдкреИрдЪ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреИрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╛рди-рдореВрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдкреНрд░рддрд┐ рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЧреБрдгреЛрдВ ( HTMLOptionsCollection
, DOMStringMap
) рд╕реЗ рдЬреБрдбрд╝реЗ [CEReactions]
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, jsdom рдЙрди рдЧреБрдгреЛрдВ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреИрдЪрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ)ред
рдореИрдВ webidl2js рдЖрдВрддрд░рд┐рдХ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ [CEReactions]
рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╣реБрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдкрд░рд┐рд╡рд░реНрддрди:
ce-reaction.js
:[HTMLConstructor]
IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердирдЬреИрд╕рд╛ рдХрд┐ @domenic рдиреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛ рд╣реИ, [HTMLConstructor]
рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкреИрдЪ рдХрд░рдХреЗ рдпрд╣рд╛рдБ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕рд╛рдЭрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд░рдЦрддреЗ рд╣реБрдП рд╕рд╣реА рд╡рд┐рдВрдбреЛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рддреНрдпреЗрдХ рдирдП рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рд╕реЗ рднреА рдмрдЪрддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдкрд░рд┐рд╡рд░реНрддрди:
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, Element.innerHTML
рдФрд░ Element.outerHTML
рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд▓рдд рд╣реИред рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд░рд┐рд╡рд░реНрддрди:
рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЬрд┐рди рдореБрджреНрджреЛрдВ рдкрд░ рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рдареЛрдХрд░ рдЦрд╛рдИ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирдИ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рдерд╛ред CustomElementRegistry рдФрд░ рдХреНрд░рд┐рдПрдЯ рдПрд▓рд┐рдореЗрдВрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреЛрдиреЛрдВ рдХреЛ рдПрд▓рд┐рдореЗрдВрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛ рджреБрдГрд╕реНрд╡рдкреНрди рдкреИрджрд╛ рд╣реЛрддреА рд╣реИред
рд╢рд╛рдЦрд╛ рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг InterfaceCache
рдмрдирд╛рдирд╛ рдерд╛, рдЬреЛ рддрддреНрд╡ рдирд╛рдорд╕реНрдерд╛рди рдФрд░ рдирд╛рдо рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реБрдХрдЕрдк рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо рд╕реЗ рднреАред рдПрдХ рдмрд╛рд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЖрд▓рд╕реА рдореВрд▓реНрдпрд╛рдВрдХрди рдФрд░ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
jsdom рдореЗрдВ рдЗрд╕ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж jsdom рдХреЗ рд╡реЗрдмрдкреИрдХ/рдмреНрд░рд╛рдЙрдЬрд╝рд░реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ (рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
рдкрд░рд┐рд╡рд░реНрддрди:
Element.isConnected
рдХреЛ рдареАрдХ рдХрд░реЗрдВ (https://github.com/jsdom/jsdom/pull/2424)~рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдлрд┐рд╕рд▓ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рддрддреНрд╡ рдЫрд╛рдпрд╛ рдкреЗрдбрд╝ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рддреЛ рдХрдиреЗрдХреНрдЯреЗрдб рд░рд┐рдЯрд░реНрди false
рд╣реИред рдПрдХ рдирдпрд╛ WPT-рдкрд░реАрдХреНрд╖рдг рдпрд╣рд╛рдБ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдкрд░рд┐рд╡рд░реНрддрди:
HTMLTemplateElement.templateContents
рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдареАрдХ рдХрд░реЗрдВ (#2426)рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ HTMLTemplateElement рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИред jsdom рдЖрдЬ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ HTMLTemplateElement рдФрд░ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕рдорд╛рди рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдбред
рдкрд░рд┐рд╡рд░реНрддрди:
HTMLTemplateElement-impl.js
htmltodom.js
ред рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрд╛рд░реНрд╕рд░ рдкрд░ рдХреБрдЫ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рднрд╛рд╡ рднреА рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджрд░реНрдн рддрддреНрд╡ рдПрдХ HTMLTemplateElement рд╣реИ, рддреЛ HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдб рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕реНрд╡рдпрдВ рддрддреНрд╡ рд╕реЗредHTMLTemplateElement
(#2426) рдореЗрдВ рдЧреБрдо рдЧреЛрдж рд▓реЗрдиреЗ рдХреЗ рдЪрд░рдг рдЬреЛрдбрд╝реЗрдВHTMLTemplateElement
рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЕрдкрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧреЛрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдЯреНрдЯреА рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИред рдПрдбреЙрдкреНрдЯ рдиреЛрдб рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдЗрд╕ рдПрдбреЙрдкреНрдЯ рд╕реНрдЯреЗрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдкрд░рд┐рд╡рд░реНрддрди:
рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреБрдХрдбрд╝реЗ рдЕрд▓рдЧреЛ, рдЬрдм рдПрдХ рддрддреНрд╡ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╕рдордп рддрддреНрд╡ рд╕реЗ рдЬреБрдбрд╝рд╛ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред parse5 рдЯреНрд░реА рдПрдбреЙрдкреНрдЯрд░ рдореЗрдВ рдПрдХ рдФрд░ рд╣реБрдХ рдЬреЛрдбрд╝рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рддрддреНрд╡ getIsValue(element: Element): void | string
рд╕реЗ рдЬреБрдбрд╝реЗ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦреЗрдЧрд╛ред
рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛) рд╡рд░реНрддрдорд╛рди getAttrList
рд╣реБрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рдпрджрд┐ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕рдВрдмрджреНрдз рдореВрд▓реНрдп рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реВрдЪреА рдореЗрдВ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдХреЛрдИ рднреА рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЯреНрд░реА рдореНрдпреВрдЯреЗрд╢рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдЯрд░ рдкрд░ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ 10% рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирдП JSDOM рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдм рдорд╛рд╕реНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 3x рд╕реЗ 6x рдзреАрдорд╛ рд╣реИ, рдЗрд╕рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рди рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг: рдпрд╣рд╛рдБ
@pmdartus рдпрд╣ рдмрд╣реБрдд рд╣реА рдЖрд╢рд╛рдЬрдирдХ, рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рд░реНрдп рд╣реИ! рдореИрдВ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЕрдкрдиреА рд╣реИрдХ рд╢рд╛рдЦрд╛ jsdom-wc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдХреБрдЫ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЖрдкрдХреА рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реИрдк рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдореБрджреНрджреЛрдВ рдХреЛ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ:
class Component extends HTMLElement {
}
customElements.define('custom-component', Component);
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ:
const el = assign(this.fixture, {
innerHTML: `
<custom-component></custom-component>
`,
});
рдореБрдЭреЗ рддрддреНрдХрд╛рд▓ рдорд┐рд▓рддрд╛ рд╣реИ: Error: Uncaught [TypeError: Illegal constructor]
ред
рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?
рдХреЛрдб рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдореЗрд░реЗ рдХрд╛рдВрдЯреЗ рдкрд░ custom-elements
рд╢рд╛рдЦрд╛ рдкрд░ рдареАрдХ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ: https://github.com/pmdartus/jsdom/tree/custom-elements
const { JSDOM } = require("jsdom");
const dom = new JSDOM(`
<body>
<div id="container"></div>
<script>
class Component extends HTMLElement {
connectedCallback() {
this.attachShadow({ mode: "open" });
this.shadowRoot.innerHTML = "<p>Hello world</p>";
}
}
customElements.define('custom-component', Component);
const container = document.querySelector("#container");
Object.assign(container, {
innerHTML: "<custom-component></custom-component>"
})
console.log(container.innerHTML); // <custom-component></custom-component>
console.log(container.firstChild.shadowRoot.innerHTML); // <p>Hello world</p>
</script>
</body>
`, {
runScripts: "dangerously"
});
рдЕрд╡реИрдз рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдореВрд▓ HTMLElement рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╢рд╛рдЦрд╛ рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред @tbranyen рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реНрдг рдкреНрд░рдЬрдирди рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЖрдЬрд╝рдорд╛ рд╕рдХрддрд╛ рд╣реВрдВ?
рд╣рд╛рдп @pmdartus рдореБрдЭреЗ рдЕрднреА рддрдХ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдореБрджреНрджреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реАрдзреЗ рдЖрдкрдХреА рд╢рд╛рдЦрд╛ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
const { JSDOM } = require('.');
const window = (new JSDOM()).window;
const { HTMLElement, customElements, document } = window;
class CustomElement extends HTMLElement {
constructor() {
super();
console.log('constructed');
}
connectedCallback() {
console.log('connected');
}
}
customElements.define('custom-element', CustomElement);
document.body.appendChild(new CustomElement());
//constructed
//connected
{
const window = (new JSDOM()).window;
const { HTMLElement, customElements, document } = window;
class CustomElement extends HTMLElement {
constructor() {
super();
console.log('Constructed');
}
connectedCallback() {
console.log('Connected');
}
}
customElements.define('custom-element', CustomElement);
document.body.appendChild(new CustomElement());
//constructed
//connected
}
рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдореЗрд░реА рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдпрд╣ рдореЗрд░реЗ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдЖрд╣ рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдВрдХреБрдЪрд┐рдд рд╣реЛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд░рд╣реА рд╣реИред рдореБрдЭреЗ рдмрдирд╛рдП рдЧрдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ HTMLElement
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдореИрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
// Inside the block, second component, reuse the HTMLElement.
const { customElements, document } = window;
рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛:
connected
/home/tbranyen/git/pmdartus/jsdom/lib/jsdom/living/helpers/create-element.js:643
throw new TypeError("Illegal constructor");
2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдорд┐рд▓ рдЧрдпрд╛:
// Don't reuse the previously defined Element...
global.HTMLElement = global.HTMLElement || jsdom.window.HTMLElement;
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ 4 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдХреНрдпрд╛ рд╡реЗрдм рдШрдЯрдХ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ рдпрд╛ рд╣реЛрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?
рдЗрд╕рдореЗрдВ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдпрджрд┐ рдХреЛрдИ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ .... рд╣реЗрдбрд▓реЗрд╕ рдХреНрд░реЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдм рдиреЛрдб рдореЗрдВ HTML рд╕реНрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░реЗрдВрдбрд░/рдмрд┐рд▓реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ 4 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдХреНрдпрд╛ рд╡реЗрдм рдШрдЯрдХ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ рдпрд╛ рд╣реЛрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?
рдпрд╣ рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпреБрдХреНрддрд┐ рдХреЛ рдЯреБрдХрдбрд╝реЗ-рдЯреБрдХрдбрд╝реЗ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреЙрд▓реАрдлрд┐рд▓ рдпрд╣рд╛рдВ: https://github.com/WebReflection/document-register-element рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд▓реЗрдЦрдХ рдХреЛ рдореЗрд░рд╛ рд╣рд╛рд░реНрджрд┐рдХ рдзрдиреНрдпрд╡рд╛рдж!
рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЬреВрдЭ рд░рд╣реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:
npm install -D document-register-element
рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдИ рдЬрд╛рдПрдЧреА:
{
"setupFilesAfterEnv": [
"./tests/setup.js"
]
}
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ ('tests/setup.js'):
import 'document-register-element'
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, document.createElement('custom-component') рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЯреБрдХрдбрд╝реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред (рд╡реИрд╕реЗ, рдореИрдВ рдЫрд╛рдпрд╛ рдбреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред
@tebanep рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрдм рдШрдЯрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИ, рдпрджрд┐ рдпрд╣ рд╢реИрдбреЛ рдбреЛрдо рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдкреВрд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
@tebanep рдзрдиреНрдпрд╡рд╛рджред рдЪреВрдБрдХрд┐ рдореБрдЭреЗ рд╢реИрдбреЛ рдбреЛрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ
рдХреНрдпрд╛ рдХреЛрдИ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдЕрднреА рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдЧ рдХреЗ рд╕рд╛рде jsdom-wc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдореЗрд░реА рдЖрд╢рд╛ рдФрд░ рдкреНрд░рд╛рд░реНрдердирд╛ред
@dknight рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ jsdom-wc рдЗрд╕реЗ рдереЛрдбрд╝реЗ-рдереЛрдбрд╝реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдХ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдПрдирдкреАрдПрдо рджрд╛рдпрд░реЗ рдХреЗ рддрд╣рдд рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред рдЖрдк рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
npm install @tbranyen/[email protected] --save-dev
рдореИрдВ рдЗрд╕реЗ рдЕрдм рд╕реНрдерд┐рд░ рднреВрдорд┐ рддрдХ рдЕрдкрдиреА рд╕рднреА JSDOM рд╡реЗрдмрдХрдВрдкреЛрдиреЗрдВрдЯ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
@tbranyen рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдХрд╛рдВрдЯрд╛ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛? рдореИрдВ рдЗрд╕реЗ рдПрдирдкреАрдПрдо рдкрд░ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛ред
@KingHenne dangit, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ "рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝" рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЬрдирддрд╛ рдХреЗ рд▓рд┐рдП npm рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЙрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдлрд╝ рдХрд░рдирд╛!
рдореБрдЭреЗ @ рдордд рдХрд░реЛ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬреИрд╕реЗ рдХрдардкреБрддрд▓реА рдХреЗ рд╕рд╛рде рд╡реЗрдм рдпреВрдЖрдИ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢реИрдбреЛ рдбреЛрдо/рдХрд╕реНрдЯрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рд╕рдкреЛрд░реНрдЯ рдЗрд╢реНрдпреВ рддрдм рджреВрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк @'d @Georgegriff рдирд╣реАрдВ рдмрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдкреЛрд╕реНрдЯ рди рдХрд░реЗрдВред рдпрд╣ рдПрдХ рд╡реИрдз рд░рдгрдиреАрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдзреАрдореА рдФрд░ рдЫреЛрдЯреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЖрдИрдкреАрд╕реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рдВ рдХрдардкреБрддрд▓реА рдХреЗ рд╕рд╛рде рднреАред рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдорд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрдардкреБрддрд▓реА рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдордЬрд╛рдХ рдореЗрдВ рдЖрдЬрд╝рдорд╛рдПрдВ рдФрд░ рдбрд┐рдмрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдЙрд╕реА рдереНрд░реЗрдб рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░реАрдХреНрд╖рдг рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд░рдирдЯрд╛рдЗрдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред JSDOM рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реИ, рдмрд╕ рдмрд┐рдЧ рдереНрд░реА рдЬрд┐рддрдирд╛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред
рдкреЙрд▓реАрдлрд┐рд▓ рдпрд╣рд╛рдВ: https://github.com/WebReflection/document-register-element рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд▓реЗрдЦрдХ рдХреЛ рдореЗрд░рд╛ рд╣рд╛рд░реНрджрд┐рдХ рдзрдиреНрдпрд╡рд╛рдж!
рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЬреВрдЭ рд░рд╣реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:
npm install -D document-register-element
рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдИ рдЬрд╛рдПрдЧреА:
{ "setupFilesAfterEnv": [ "./tests/setup.js" ] }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ ('tests/setup.js'):
import 'document-register-element'
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, document.createElement('custom-component') рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЯреБрдХрдбрд╝реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред (рд╡реИрд╕реЗ, рдореИрдВ рдЫрд╛рдпрд╛ рдбреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди connectedCallback
рдХреЛ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?
@FaBeyyy рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣реА :(
@FaBeyyy @majo44 рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЕрд░реНрдерд╛рддред document.body.appendChild(...)
рдХреЗ рд▓рд┐рдП connectedCallback
рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд╢реНрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рдбреЛрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред
JSDOM рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реИ, рдмрд╕ рдмрд┐рдЧ рдереНрд░реА рдЬрд┐рддрдирд╛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдпрд╣ рдмрдбрд╝реЗ рджреЛ рдХреА рддрд░рд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Microsoft рдЙрдирдХреА рдЦрд╛рдИ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рд╕рд╛рде рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣реА рд╣реИред
@FaBeyyy @majo44 рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЕрд░реНрдерд╛рддред
document.body.appendChild(...)
рдХреЗ рд▓рд┐рдПconnectedCallback
рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд╢реНрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рдбреЛрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж рдХрдкреНрддрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдШрдЯрдХ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕рдордп рдорд┐рд▓рдиреЗ рдкрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рд░реЗрдкреЛ рд╢реЛрдХреЗрд╕ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ред
@FaBeyyy
рддреЛ рдореБрдЭреЗ рд╡рд╣ рд╕реЗрдЯрдЕрдк рдорд┐рд▓рд╛ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ MutationObserver рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдлрд┐рд▓ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВ рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде, рдкреЛрд░рдкреЛрдЗрдЬрд╝ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдХрд╛рдордХрд╛рдЬреА рд╕реЗрдЯрдЕрдк рд╣реИ:
// package.json
{ ...
"jest": {
"transform": {
"^.+\\.(mjs|jsx|js)$": "babel-jest"
},
"setupFiles": [
"<rootDir>/node_modules/babel-polyfill/dist/polyfill.js",
"<rootDir>/node_modules/mutationobserver-shim/dist/mutationobserver.min.js",
"<rootDir>/node_modules/document-register-element/build/document-register-element.node.js"
]
}
...
}
//.bablerc
{
"presets": [
["@babel/preset-env", { "modules": "commonjs"}]
]
}
@FaBeyyy
рддреЛ рдореБрдЭреЗ рд╡рд╣ рд╕реЗрдЯрдЕрдк рдорд┐рд▓рд╛ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ MutationObserver рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдлрд┐рд▓ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВ рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде, рдкреЛрд░рдкреЛрдЗрдЬрд╝ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдХрд╛рдордХрд╛рдЬреА рд╕реЗрдЯрдЕрдк рд╣реИ:// package.json { ... "jest": { "transform": { "^.+\\.(mjs|jsx|js)$": "babel-jest" }, "setupFiles": [ "<rootDir>/node_modules/babel-polyfill/dist/polyfill.js", "<rootDir>/node_modules/mutationobserver-shim/dist/mutationobserver.min.js", "<rootDir>/node_modules/document-register-element/build/document-register-element.node.js" ] } ... }
//.bablerc { "presets": [ ["@babel/preset-env", { "modules": "commonjs"}] ] }
рдЕрдЪреНрдЫрд╛ рдзрдиреНрдпрд╡рд╛рдж!
@ majo44 рдирд╡реАрдирддрдо jsdom рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп (рдЬреЛ jsdom v11 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдЖрдк рдХреЗрд╡рд▓ рдЕрджреНрдпрддрди рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://www.npmjs.com/package/jest-environment-jsdom-fourteen
@mgibas рдзрдиреНрдпрд╡рд╛рдж, jest-environment-jsdom-рдЪреМрджрд╣ рдХреЗ рд╕рд╛рде рдпрд╣ рднреА рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдкреЙрд▓реАрдлрд┐рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 0.1.0 рд╣реИ, рдПрдХрд▓ рдкреНрд░рддрд┐рдмрджреНрдз рдкреИрдХреЗрдЬ :))
рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╡реЗрдм рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЯреВрдЯрдирд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдбреЛрдо рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд╣реАрдВ (рдХрдо рд╕реЗ рдХрдо рд░рд┐рд▓реАрдЬ рд╢рд╛рдЦрд╛/рд░реЗрдкреЛ рдореЗрдВ)?
npm install @tbranyen/[email protected] --save-dev
@tbranyen рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдХрд╛рдВрдЯреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╣реАрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ? рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реЛрдВрдЧреЗ
рдореИрдВ jest-environment-jsdom-fifteen рдЬреИрд╕реЗ @ majo44 рд╕реБрдЭрд╛рдП рдЧрдП, рдФрд░ рдмреЗрдмреЗрд▓-рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд░рдЬрд┐рд╕реНрдЯрд░-рдПрд▓рд┐рдореЗрдВрдЯ (рджреЗрдЦреЗрдВ @mgibas рдЙрддреНрддрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬрдм рдореИрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡реЗрдм рдШрдЯрдХ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред
el.shadowRoot
рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рд╣реИ:
const el;
beforeEach(async() => {
const tag= 'my-component'
const myEl = document.createElement(tag);
document.body.appendChild(myEl);
await customElements.whenDefined(tag);
await new Promise(resolve => requestAnimationFrame(() => resolve()));
el = document.querySelector(tag);
}
it(() => {
const fooContent = el.shadowRoot.querySelectorAll('slot[name=foo] > *');
})
рдХрд╛рдордХрд╛рдЬ рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? FYI рдХрд░реЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░реНрдорд╛, рдореЛрдЪрд╛, рдЪрд╛рдИ рдФрд░ рдЬреИрд╕реНрдореАрди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдореЗрд░реЗ рдШрдЯрдХ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ:
customElements.define(
'my-component',
class extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({ mode: 'open' });
...
}
})
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП jsdom 15.1.1 рдХреЗ рд╕рд╛рде рдХреБрдЫ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреАред
рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдБ рд╢реВрдиреНрдп рдХреНрдпреЛрдВ рд╣реИ ...
рддреЛ, Element.shadowRoot 88e72ef рдХреЗ рдмрд╛рдж рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
https://github.com/jsdom/jsdom/blob/1951a19d8d40bc196cfda62a8dafa76ddda6a0d2/lib/jsdom/living/nodes/Element-impl.js#L388 -L415
document.createElement рдХреЗ рдмрд╛рдж, this._shadowDom https://github.com/jsdom/jsdom/blob/15.1.1/lib/jsdom/living/nodes/Element-impl.js#L403 рдкрд░ рдареАрдХ рд╣реИред рдФрд░ рдЫрд╛рдпрд╛ рдбреЛрдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрд▓рд┐рдореЗрдВрдЯ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕рд╣реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ document.body.appendChild(el) рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж el.shadowDom
рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ (https://github.com/jsdom/jsdom/blob/15.1.1/lib/jsdom/living/nodes/Element-impl .js#L408), this. _shadowRoot
рд╢реВрдиреНрдп рд╣реИ!
рдмрд╛рдж рдореЗрдВ рд╡рд╣реА рдмрд╛рдд
await customElements.whenDefined(tag);
await new Promise(resolve => requestAnimationFrame(() => resolve()));
рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдмрдЬрд╛рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
document.body.innerHTML = `
<my-component id="fixture"></my-component>
`:
рдкреНрд░рдЬрдирди рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:
https://github.com/noelmace/devcards/tree/jest
@nminhnguyen рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк @tbranyan рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдХрд╛рдВрдЯреЗ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ https://github.com/tbranyen/jsdom/tree/initial-custom-elements-impl рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдореИрдВ рд▓рд┐рдЯ-рдПрдЪрдЯреАрдПрдордПрд▓ рдФрд░ рд▓рд┐рдЯ-рдПрд▓рд┐рдореЗрдВрдЯ рд╕реЗ рдмрдиреЗ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрд╛ред
const myElem = new MyElem();
document.body.appendChild(myElem);
await myElem.updateComplete;
console.log(myElem.shadowRoot) // exists and has the rendered markup
рдФрд░ рдЬрдм рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред createElement
const myElem = document.createElement('my-elem');
document.body.appendChild(myElem);
await myElem.updateComplete;
console.log(myElem.shadowRoot) // null
рдЬреЗрд╕реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╣реИ: setupFiles: ['document-register-element']
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ myElem
рдореЗрдВ рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдереЛрдбрд╝рд╛ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рдиреЗ рдкрд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ initialize
рдЬреЛ рдХрд┐ рд▓рд┐рдЯ-рдПрд▓рд┐рдореЗрдВрдЯ рдореЗрдВ рд╣реИ, рдЙрд╕реЗ рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдБ
const myElem = document.createElement('my-elem');
myElem.initialize();
document.body.appendChild(myElem);
await myElem.updateComplete;
console.log(myElem.shadowRoot) // exists and has the rendered markup
рдореИрдВрдиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбреЛрдо рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред
рдбреЛрдо:
https://www.npmjs.com/package/happy-dom
рдЬреЗрд╕реНрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг:
https://www.npmjs.com/package/jest-environment-happy-dom
рдХрдорд╛рд▓ рдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред
рд╕реЛрдо рдХреЛ, 7 рдЕрдХреНрдЯреВрдмрд░, 2019, 1:08 AM capricorn86 [email protected] рдиреЗ рд▓рд┐рдЦрд╛:
рдореИрдВрдиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбреЛрдо рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдореИ
рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛
рд╡рд╣рд╛рдБ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░/рдпрд╛ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВредрдбреЛрдо:
https://www.npmjs.com/package/happy-domрдЬреЗрд╕реНрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг:
https://www.npmjs.com/package/jest-environment-happy-dom-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/jsdom/jsdom/issues/1030?email_source=notifications&email_token=ACQ5ZD5QUEITPND4SXWOHW3QNILSRA5CNFSM4A4G5SF2YY3PNVWWK3TUL52HS4DFVREXGEA43VMVB70
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACQ5ZDYU465DXI4KHBQH4KTQNILSRANCNFSM4A4G5SFQ
.
@ рдордХрд░ 86
рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!
https://github.com/EasyWebApp/WebCell/tree/v2/MobX
@ рдордХрд░ 86
рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!
https://github.com/EasyWebApp/WebCell/tree/v2/MobX
рдзрдиреНрдпрд╡рд╛рдж @TechQuery!
рдХрдорд╛рд▓ рдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред
тАж
рд╕реЛрдо, 7 рдЕрдХреНрдЯреВрдмрд░ 2019, 1:08 AM рдордХрд░ 86 @ рдкрд░ред * > рд▓рд┐рдЦрд╛ рд╣реИ: рдореИрдВрдиреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдбреЛрдо рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдбреАрдУрдПрдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░/рдпрд╛ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдбреЛрдо: https://www.npmjs.com/package/happy-dom рдЬреЗрд╕реНрдЯ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ: https://www.npmjs.com/package/jest-environment-happy-dom тАФ рдЖрдк рдЗрд╕реЗ рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред рдзрд╛рдЧрд╛ред рдЗрд╕ рдИ-рдореЗрд▓ рд╕реАрдзреЗ рдЬрд╡рд╛рдм рджреЗрдВ, GitHub рдкрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ <# 1030? Email_source = рд╕реВрдЪрдирд╛рдПрдВ рдФрд░ email_token = ACQ5ZD5QUEITPND4SXWOHW3QNILSRA5CNFSM4A4G5SF2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEAOO5ZA # issuecomment-538,767,076>, рдпрд╛ рдзрд╛рдЧрд╛ рдореВрдХ https://github.com/notifications/unsubscribe-auth/ACQ5ZDYU465DXI4KHBQH4KTQNILSRANCNFSM4A4G5SFQ ред
рдзрдиреНрдпрд╡рд╛рдж @motss!
рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЗрдПрд╕рдбреАрдУрдПрдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╡реЗрдм рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЯреВрдЯрдирд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдбреЛрдо рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд╣реАрдВ (рдХрдо рд╕реЗ рдХрдо рд░рд┐рд▓реАрдЬ рд╢рд╛рдЦрд╛/рд░реЗрдкреЛ рдореЗрдВ)?
рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА :)
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЯреАрдПрд▓; рдбреАрдЖрд░
рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ 2 рд╣рдлреНрддреЛрдВ рдореЗрдВ jsdom рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рд╣реИ рдЬрд╛рдВрдЪ рдХрд╛ рдирддреАрдЬрд╛.
рдЖрдк рдпрд╣рд╛рдВ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкрд╛рд▓рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/jsdom/jsdom/compare/master...pmdartus:custom-elements?expand=1 ред рдпрд╣рд╛рдБ рдФрд░ рд╡рд╣рд╛рдБ рдЕрднреА рднреА рдХреБрдЫ рдЦреБрд░рджреБрд░реЗ рдХрд┐рдирд╛рд░реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрд╛рдВрд╢ WPT-рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реИрдВ ред рд╢реЗрд╖ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рддреЛ рдЬреНрдЮрд╛рдд JSDOM рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ рдпрд╛ рдорд╛рдореВрд▓реА рд╕рдорд╕реНрдпрд╛рдПрдБ рдЬрд┐рдирдХрд╛ рд╕рдорд╛рдзрд╛рди рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣рдо jsdom рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рдЕрдм рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдЕрдм рдЬрдм рд╢реИрдбреЛ рдбреЛрдо рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрд╕реНрдЯрдо-рдПрд▓рд┐рдореЗрдВрдЯ рд╢рд╛рдЦрд╛ рдФрд░ рдореНрдпреВрдЯреЗрд╢рди рдСрдмреНрдЬрд░реНрд╡рд░ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдкреЙрд▓рд┐рдорд░ 3 рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ jsdom рдореЗрдВ рд▓реЛрдб рдФрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╢рд╛рдЦрд╛ рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ (рд╕реНрдЯреИрдВрд╕рд┐рд▓ рджреЗрд╡ рдореЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ
module
, рдФрд░ рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ рдкреНрд░реЛрдб рдореЛрдб рдлреЗрдВрдХрддрд╛ рд╣реИ)редрдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛
рдпрд╣рд╛рдВ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХрд▓реНрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рдкрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
[CEReactions]
IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердирдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рдХреЛрд░ рдореЗрдВ рд╕реЗ рдПрдХ
[CEReactions]
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдореИрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдгреЛрдВ рдХреЛ рдкреИрдЪ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреИрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╛рди-рдореВрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдкреНрд░рддрд┐ рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВредрдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЧреБрдгреЛрдВ (
HTMLOptionsCollection
,DOMStringMap
) рд╕реЗ рдЬреБрдбрд╝реЗ[CEReactions]
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, jsdom рдЙрди рдЧреБрдгреЛрдВ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреИрдЪрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ)редрдореИрдВ webidl2js рдЖрдВрддрд░рд┐рдХ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ
[CEReactions]
рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╣реБрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?рдкрд░рд┐рд╡рд░реНрддрди:
ce-reaction.js
:[HTMLConstructor]
IDL рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердирдЬреИрд╕рд╛ рдХрд┐ @domenic рдиреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛ рд╣реИ,
[HTMLConstructor]
рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИредрдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкреИрдЪ рдХрд░рдХреЗ рдпрд╣рд╛рдБ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕рд╛рдЭрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд░рдЦрддреЗ рд╣реБрдП рд╕рд╣реА рд╡рд┐рдВрдбреЛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рддреНрдпреЗрдХ рдирдП рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рд╕реЗ рднреА рдмрдЪрддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдкрд░рд┐рд╡рд░реНрддрди:
create-element.js
рдореЗрдХ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдпреБрдХреНрддрд┐ рдЕрдиреБрд░реВрдк рдмрдирд╛рдПрдВ (#2522)
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ,
Element.innerHTML
рдФрд░Element.outerHTML
рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд▓рдд рд╣реИред рдХрд╕реНрдЯрдо рддрддреНрд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛ рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдкрд░рд┐рд╡рд░реНрддрди:
рдПрд▓рд┐рдореЗрдВрдЯ рдПрд▓реНрдЧреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реБрдХрдЕрдк рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ
рдХрд╕реНрдЯрдо рддрддреНрд╡ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЬрд┐рди рдореБрджреНрджреЛрдВ рдкрд░ рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рдареЛрдХрд░ рдЦрд╛рдИ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирдИ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рдерд╛ред CustomElementRegistry рдФрд░ рдХреНрд░рд┐рдПрдЯ рдПрд▓рд┐рдореЗрдВрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреЛрдиреЛрдВ рдХреЛ рдПрд▓рд┐рдореЗрдВрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛ рджреБрдГрд╕реНрд╡рдкреНрди рдкреИрджрд╛ рд╣реЛрддреА рд╣реИред
рд╢рд╛рдЦрд╛ рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг
InterfaceCache
рдмрдирд╛рдирд╛ рдерд╛, рдЬреЛ рддрддреНрд╡ рдирд╛рдорд╕реНрдерд╛рди рдФрд░ рдирд╛рдо рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реБрдХрдЕрдк рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо рд╕реЗ рднреАред рдПрдХ рдмрд╛рд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЖрд▓рд╕реА рдореВрд▓реНрдпрд╛рдВрдХрди рдФрд░ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИредjsdom рдореЗрдВ рдЗрд╕ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж jsdom рдХреЗ рд╡реЗрдмрдкреИрдХ/рдмреНрд░рд╛рдЙрдЬрд╝рд░реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ (рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
рдкрд░рд┐рд╡рд░реНрддрди:
create-element.js
~рд╢реИрдбреЛ рдбреЛрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
Element.isConnected
рдХреЛ рдареАрдХ рдХрд░реЗрдВ (https://github.com/jsdom/jsdom/pull/2424)~рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рдЫрд╛рдпрд╛ рдбреЛрдо рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдлрд┐рд╕рд▓ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рддрддреНрд╡ рдЫрд╛рдпрд╛ рдкреЗрдбрд╝ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рддреЛ рдХрдиреЗрдХреНрдЯреЗрдб рд░рд┐рдЯрд░реНрди
false
рд╣реИред рдПрдХ рдирдпрд╛ WPT-рдкрд░реАрдХреНрд╖рдг рдпрд╣рд╛рдБ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИредрдкрд░рд┐рд╡рд░реНрддрди:
Node-impl.js
HTMLTemplateElement.templateContents
рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдареАрдХ рдХрд░реЗрдВ (#2426)рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ HTMLTemplateElement рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдиреЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИред jsdom рдЖрдЬ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ HTMLTemplateElement рдФрд░ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕рдорд╛рди рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдбред
рдкрд░рд┐рд╡рд░реНрддрди:
HTMLTemplateElement-impl.js
htmltodom.js
ред рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрд╛рд░реНрд╕рд░ рдкрд░ рдХреБрдЫ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рднрд╛рд╡ рднреА рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджрд░реНрдн рддрддреНрд╡ рдПрдХ HTMLTemplateElement рд╣реИ, рддреЛ HTML рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдб рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕реНрд╡рдпрдВ рддрддреНрд╡ рд╕реЗредHTMLTemplateElement
(#2426) рдореЗрдВ рдЧреБрдо рдЧреЛрдж рд▓реЗрдиреЗ рдХреЗ рдЪрд░рдг рдЬреЛрдбрд╝реЗрдВHTMLTemplateElement
рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЕрдкрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧреЛрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдЯреНрдЯреА рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИред рдПрдбреЙрдкреНрдЯ рдиреЛрдб рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдЗрд╕ рдПрдбреЙрдкреНрдЯ рд╕реНрдЯреЗрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАредрдкрд░рд┐рд╡рд░реНрддрди:
HTMLTemplateElement-impl.js
Document-impl.js
Parse5 serializer рдореЗрдВ isValue рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ
рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреБрдХрдбрд╝реЗ рдЕрд▓рдЧреЛ, рдЬрдм рдПрдХ рддрддреНрд╡ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╕рдордп рддрддреНрд╡ рд╕реЗ рдЬреБрдбрд╝рд╛ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред parse5 рдЯреНрд░реА рдПрдбреЙрдкреНрдЯрд░ рдореЗрдВ рдПрдХ рдФрд░ рд╣реБрдХ рдЬреЛрдбрд╝рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рддрддреНрд╡
getIsValue(element: Element): void | string
рд╕реЗ рдЬреБрдбрд╝реЗ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦреЗрдЧрд╛редрдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛) рд╡рд░реНрддрдорд╛рди
getAttrList
рд╣реБрдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рдпрджрд┐ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕рдВрдмрджреНрдз рдореВрд▓реНрдп рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реВрдЪреА рдореЗрдВ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПредрдкреНрд░рджрд░реНрд╢рди
рдХреЛрдИ рднреА рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЯреНрд░реА рдореНрдпреВрдЯреЗрд╢рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдЯрд░ рдкрд░ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ 10% рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирдП JSDOM рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдм рдорд╛рд╕реНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 3x рд╕реЗ 6x рдзреАрдорд╛ рд╣реИ, рдЗрд╕рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рди рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг: рдпрд╣рд╛рдБ