рд╡реЗрдм рд╡рд░реНрдХрд░ рдЬрд┐рддрдирд╛ рдЖрдкрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рдЖрд╕рд╛рди рд╣реИ

рд╡реЗрдм рд╡рд░реНрдХрд░ рдЬрд┐рддрдирд╛ рдЖрдкрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рдЖрд╕рд╛рди рд╣реИ


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрдХ DIRTY, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд, рдЕрд╕реНрдерд┐рд░ рдФрд░ рдбрд░рд╛рд╡рдирд╛ <em>eval</em> рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдЬ рд╣реИрдВ, рддреЛ рдЕрднреА рдкрдврд╝рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдореБрджреНрджреЗ рдЕрдирд╕реБрд▓рдЭреЗ рд░рд╣реЗ: рд╡реЗрдм рд╡реЗрдм рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рднреЗрдЬреЗ рдЧрдП рдХреЛрдб рдореЗрдВ, рдмрдВрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред




рд╣рдо рд╕рднреА рдХреЛ рдирдИ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ рдкрд╕рдВрдж рд╣реИрдВ, рдФрд░ рд╣рдо рд╕рднреА рдХреЛ рдирдИ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реЗрдм рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред рд╡реЗрдм рдХрд░реНрдордЪрд╛рд░реА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдВрдХ рдпрд╛ рд▓рд┐рдВрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рдпреЛрдЬрд┐рдд рдХреЛрдб рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╡реЗрдм рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред


рд╡реЗрдм рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:


  • рдХрд┐рд╕реА рднреА рдХреНрд╖рдг рдХрд┐рд╕реА рднреА рдХреЛрдб рдореЗрдВ рд╡реЗрдм рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛
  • рд╡реЗрдм рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ (рдХрдХреНрд╖рд╛ рдЙрджрд╛рд╣рд░рдг, рдХрд╛рд░реНрдп) рднреЗрдЬрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛
  • рдПрдХ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рджрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ред

рдЖрдЗрдП рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдФрд░ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдЪрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдФрд░ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЖрдИрдбреА рдФрд░ рдбреЗрдЯрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдЧрд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реЗрдм рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рд╣реЛрдВрдЧреЗ:


  • рдПрдХ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ / рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛
  • рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдПрдХ рдлрд╛рдЗрд▓ рдЬреЛ рдПрдХ рд╡реЗрдм рд╡рд░реНрдХрд░ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдЧреА


рдПрдХ рд╡реЗрдм рдХрд░реНрдордЪрд╛рд░реА рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╣реЛрдЧреА, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (OOP) рдкрд╕рдВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдХрд╛рд░реНрдпрдХрд░реНрддрд╛рдмреЙрдбреА рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдореВрд▓ рд╡рд┐рдВрдбреЛ рд╕реЗ рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рд╣реЛрдЧреАред


 self.onmessage = (message) => { this.onMessage(message.data); }; 

рдЕрдм рд╣рдо рдореВрд▓ рд╡рд┐рдВрдбреЛ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдПрдВ рд╣реИрдВ: рд╡реЗ рдЬреЛ рдПрдХ рдЙрддреНрддрд░ рдФрд░ рдмрд╛рдХреА рд╕рднреА рдХрд╛ рдорддрд▓рдм рд╣реИред рдЖрдЗрдП рдХрд░рддреЗ рд╣реИрдВ рдШрдЯрдирд╛рдПрдБ: \
рд▓рд╛рдпрдмреНрд░реЗрд░реА рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рд╡реЗрдм рд╡рд░реНрдХрд░ рдореЗрдВ importScripts API рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред


рдФрд░ рдЕрдм scariest рд╣рд┐рд╕реНрд╕рд╛: рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдорд╛рд░реЛрд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


 ... onMessage(message) { switch (message.type) { case MESSAGE_TYPE.ADD_LIBS: this.addLibs(message.libs); break; case MESSAGE_TYPE.WORK: this.doWork(message); break; } } doWork(message) { try { const processor = eval(message.job); const params = this._parser.parse(message.params); const result = processor(params); if (result && result.then && typeof result.then === 'function') { result.then((data) => { this.send({ id: message.id, state: true, body: data }); }, (error) => { if (error instanceof Error) { error = String(error); } this.send({ id: message.id, state: false, body: error }); }); } else { this.send({ id: message.id, state: true, body: result }); } } catch (e) { this.send({ id: message.id, state: false, body: String(e) }); } } send(data) { data.body = this._serializer.serialize(data.body); try { self.postMessage(data); } catch (e) { const toSet = { id: data.id, state: false, body: String(e) }; self.postMessage(toSet); } } 

рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП onMessage рдХреА рд╡рд┐рдзрд┐ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, doWork рдПрдХ рднреЗрдЬреЗ рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреЗрд░реЗрдВрдЯ рд╡рд┐рдВрдбреЛ рдкрд░ рдПрдХ рдЙрддреНрддрд░ рднреЗрдЬрддрд╛ рд╣реИред


рдкрд╛рд░реНрд╕рд░ рдФрд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ


рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХреЗред рдЪрд▓реЛ рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╡реЗрдм рд╡рд░реНрдХрд░ рдХреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕, рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╡реЗрдм рд╡рд░реНрдХрд░ рдХреА рдореВрд▓ рдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ JSON-рдЬреИрд╕рд╛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдЙрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ _ eval _ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рдо JSON рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдЯрд┐рдВрдЧ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рджреВрд╕рд░реА рддрд░рдл рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдбреЗрдЯрд╛ рд▓рдкреЗрдЯреЗрдВрдЧреЗред рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдордХреНрдЦреА рдкрд░ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд┐ рд╕реЗрд╡рд╛ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдЬреЛ рднреА рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рджреВрд╕рд░реА рддрд░рдл рдПрдХ рдкрд╛рд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд╣рд▓реА рдирдЬрд░ рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдмрд╕реЗ рд╕реАрдорд┐рдд рд╕реАрдорд╛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╣реИ, рдЬреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХреЛрдб рд▓реЗрдЦрди рд╢реИрд▓реА рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЪрд▓реЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рднрд╛рдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рдиред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рдПрдХ рдлрдВрдХреНрд╢рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:


 static isFunction(Factory){ if (!Factory.prototype) { // Arrow function has no prototype return true; } const prototypePropsLength = Object.getOwnPropertyNames(Factory.prototype) .filter(item => item !== 'constructor') .length; return prototypePropsLength === 0 && Serializer.getClassParents(Factory).length === 1; } static getClassParents(Factory) { const result = [Factory]; let tmp = Factory; let item = Object.getPrototypeOf(tmp); while (item.prototype) { result.push(item); tmp = item; item = Object.getPrototypeOf(tmp); } return result.reverse(); } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХрд╛рд░реНрдп рд╣реИред рдлрд┐рд░, рд╣рдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЧ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдирддреЗ рд╣реИрдВред


рдЬрдм рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ __type = "рдХреНрд░рдордмрджреНрдз-рдлрд╝рдВрдХреНрд╢рди" рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди (func.toString ()) рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред


рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреНрд▓рд╛рд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рдмрд╛рдж рдореЗрдВ, рд╣рдореЗрдВ рдирд┐рдпрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдФрд░ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


 static isInstance(some) { const constructor = some.constructor; if (!constructor) { return false; } return !Serializer.isNative(constructor); } static isNative(data) { return /function .*?\(\) \{ \[native code\] \}/.test(data.toString()); } 

рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рд╡рд╕реНрддреБ рдирд┐рдпрдорд┐рдд рд╣реИ рдЕрдЧрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рджреЗрд╢реА рдХрд╛рд░реНрдп рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдПрдХ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдЦреЛрдЬ рд▓рд┐рдпрд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдВрдЧреЗ:


  • __рдЯрд╛рдЗрдк: 'рдХреНрд░рдордмрджреНрдз-рдЙрджрд╛рд╣рд░рдг'
  • рдбреЗрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рд╣реИ
  • рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рд╕реВрдЪреА рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд░реНрдЧ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред

рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдмрдирд╛рдиреА рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЪреБрдиреМрддреА рд╣реИ: рдПрдХ рд╡рд░реНрдЧ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛, рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЦрд╛рдХрд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рд╕рднреА рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЦрд╛рдХреЗ рднреА рд▓реЗрдиреЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╡рд░реНрдЧ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рднреА рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдорд╛рдг рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд░реНрдЧ рдХреА рдЦреЛрдЬ рдЖрд╕рд╛рди рд╣реИ: рдпрд╣ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ Serializer.isFunction рдкреНрд░рдорд╛рдг рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рд╣рдо рдХреНрд░рдордмрджреНрдз рдбреЗрдЯрд╛ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЙрд╕ рд╡рд░реНрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЕрджреНрд╡рд┐рддреАрдп рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдХреЛрдб рдЬреЛ рдПрдХ рдХрдХреНрд╖рд╛ рдХреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕рдореЗрдЯрддрд╛ рд╣реИ рд╡рд╣ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред


рдкрд╛рд░реНрд╕рд░ рдореЗрдВ, рд╣рдо рд╢реБрд░реВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднреЗрдЬреЗ рдЧрдП рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рдФрд░ рдбреЗрдЯрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдереЗ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рд╡рд╣ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдИ рд╡рд╕реНрддреБред рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕реЗрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рд╣рдо рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдПрдХ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд░реНрдл рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЧреБрдгреЛрдВ рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВред


рдПрдХ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛


рдПрдХ рд╡реЗрдм рд╡рд░реНрдХрд░ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдХрд░ рдФрд░ рдПрдХ рд╡рд░реНрдХрд░ рдХреЛ рд╡реЗрдм рд╡рд░реНрдХрд░ рдХреЗ рднреАрддрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕реАрд░рдорд╛рдЗрдЬрд╝рд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ, рдкрд╛рд░реНрд╕рд░ рдФрд░ рд╡реЗрдм рд╡рд░реНрдХрд░ рдмреЙрдбреА рдХреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ, рд╣рдо рдПрдХ рдмреНрд▓реЙрдм рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ URL.createObjectURL рдкрд░ рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рд▓рд┐рдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВ (рдпрд╣ рд╡рд┐рдзрд┐ рдХреБрдЫ "рд╕рд╛рдордЧреНрд░реА-рд╕реБрд░рдХреНрд╖рд╛-рдиреАрддрд┐" рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ)ред рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЛрдб рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫрд╛ рд╣реИред


 _createworker(customworker) { const template = `var Myworker = ${this._createTemplate(customworker)};`; const blob = new Blob([template], { type: 'application/javascript' }); return new worker(URL.createObjectURL(blob)); } _createTemplate(workerBody) { const Name = Serializer.getFnName(workerBody); if (!Name) { throw new Error('Unnamed worker Body class! Please add name to worker Body class!'); } return [ '(function () {', this._getFullClassTemplate(Serializer, 'Serializer'), this._getFullClassTemplate(Parser, 'Parser'), this._getFullClassTemplate(workerBody, 'workerBody'), `return new workerBody(Serializer, Parser)})();` ].join('\n'); } 

рдкрд░рд┐рдгрд╛рдо


рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓-рд╕реЗ-рдЙрдкрдпреЛрдЧ рд╡рд╛рд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓реА, рдЬреЛ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдХреЛрдИ рднреА рдХреЛрдб рднреЗрдЬ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:


 const wrapper = workerWrapper.create(); wrapper.process((params) => { // This code in worker. Cannot use closure! // do some hard work return 100; // or return Promise.resolve(100) }, params).then((result) => { // result = 100; }); wrapper.terminate() // terminate for kill worker process 

рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╡рд┐рдХрд╛рд╕


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рд╣рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ, рд╡рд╕реНрддреБрдУрдВ, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╕рдиреЗ рдФрд░ рдЧреЗрдЯрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп URL.createObjectURL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╢рд┐рдВрдЧ, рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд┐рдирд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╡реЗрдм рд╡рд░реНрдХрд░ рдХрдВрдЯреЗрдВрдЯ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓ рдХреЛ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдорд╛рдорд▓реЗ рдореЗрдВ рдСрди-рдж-рдлреНрд▓рд╛рдИ рдирд┐рд░реНрдорд╛рдг рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ) рдЖрджрд┐ред рднрдВрдбрд╛рд░ рдкрд░ рдЬрд╛рдПрдБ!

Source: https://habr.com/ru/post/hi462325/


All Articles