рдирдорд╕реНрддреЗ, jsdom
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА URL
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ 2 рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдирд╣реАрдВ, рд╡реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред
рдХреНрд░рд┐рдПрдЯрдСрдмреНрдЬреЗрдХреНрдЯрдпреВрдЖрд░рдПрд▓
рдирд┐рд░рд╕реНрддрдСрдмреНрдЬреЗрдХреНрдЯURL
рдХреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ
рдХреНрдпрд╛ https://github.com/eligrey/Blob.js рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ jsdom
рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдореБрдЭреЗ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ jspdf
рдЕрдВрджрд░ jsdom
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдирд╣реАрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдХрд╛ рдХреЛрдб рдбреЗрдЯрд╛ рдпреВрдЖрд░рдПрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдирд╣реАрдВред рдХрд┐рд╕реА рдХреЛ https://w3c.github.io/FileAPI/#dfn -createObjectURL рдкрд░ рдпреБрдХреНрддрд┐ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдореИрдВ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдБ, рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛?
createObjectURL(blob) {
var implementationDefinedValue = ???
var url = `blob:${asciiSerialize(location.origin) || implementationDefinedValue}/${createUUID()}`;
saveToBlobStore(url, blob);
return url;
}
revokeObjectURL(blobUrl) {
// assume `getFromBlobStore()` will not throw
var blob = getFromBlobStore(blobUrl);
if (!blob) {
throw new NetworkError(...);
}
removeFromBlobStore(blobUrl);
}
@unional createUUID
uuidV4 рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЛрдо рд╕рдЦреНрддреА рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, URL.revokeObjectURL
NetworkError
рдирд╣реАрдВ рдлреЗрдВрдХреЗрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рддрд░реНрдХ рдХреЛ рджреЛ рдмрд╛рд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рд╕рд░рдгреАред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рддрд░рд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдм рд╕реНрдЯреЛрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ URL.revokeObjectURL
рдПрдХ рдиреЛрдк рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдордд:
const uuid = require('uuid/v4');
createObjectURL(blob) {
var implementationDefinedValue = ???
var url = `blob:${asciiSerialize(location.origin) || implementationDefinedValue}/${uuid()}`;
return url;
}
revokeObjectURL(blobUrl) {
return;
}
asciiSerialize(origin) {
if (origin.scheme) {
return `${origin.scheme}://${serializeHost(origin.host)}${origin.port? ':' + +origin.port : ''}`;
}
else {
return 'null';
}
}
serializeHost(host) {
...
}
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ serializeHost()
рд╣реИред
рдПрдХ рдЖрдЦрд┐рд░реА рдмрд╛рдд рд╣реИ:
рдпрджрд┐ рдХреНрд░рдордмрджреНрдз "рд╢реВрдиреНрдп" рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
"рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореВрд▓реНрдп" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдорд┐рд▓ рдЧрдП рд╣реИрдВред
http://stackoverflow.com/questions/42452543/what-does-implementation-defined-value-in-fileapi-unicodebloburl-mean/42452714#42452714
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ https://github.com/jsdom/whatwg-url . рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ
рдЕрджреНрдпрддрди: whatwg-url
рдирд┐рдХрд▓рд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдмрд╕ рд╣реИ:
const uuid = require('uuid/v4');
createObjectURL(_blob) {
var url = `blob:${serializeURL(location.origin)}/${uuid()}`;
return url;
}
revokeObjectURL(_blobUrl) {
return;
}
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ whatwg-url
рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдкрддрд╛ рдирд╣реАрдВ рдХреИрд╕реЗ рдХреЛрдб рдбрд╛рд▓рдирд╛ рд╣реИред
@domenic , рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?
рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдмрдирд╛рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ XMLHttpRequest
рдХреА рдкрд╕рдВрдж рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдмрдирд╛рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ XMLHttpRequest рдХреА рдкрд╕рдВрдж рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рдХреНрдпрд╛ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреНрдпрд╛ рд╣реИрдВ? рдХреНрдпрд╛ XMLHttpRequest
рдХрд╛ рдореМрдЬреВрджрд╛ рддрд░реНрдХ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛?
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ jsdom
рдХрд╛ рд▓рдХреНрд╖реНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдЯреАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред
IMO рд╣рдореЗрдВ рдЗрд╕реЗ рддрдм рддрдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рди рд╣реЛред
рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рд╡рд░ рдпреВрдЖрд░рдПрд▓ =
blob:${serializeURL(location.origin)}/${uuid()}
;
serializeURL()
рдХрд▓реНрдкрдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдХрд▓реНрдкрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдпрджрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм XHR, img рддрддреНрд╡реЛрдВ, рдЖрджрд┐ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ jsdom рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ URL рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдирд╛ рдмрд╣реБрдд, рдмрд╣реБрдд рд░реБрдЪрд┐рдХрд░ рдирд╣реАрдВ рд╣реИред рдЖрдк рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг jsdom рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдареАрдХ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЬрд╝рд░реВрд░рдд рд╣реИ?
рдбреЛрдо рдПрдкреАрдЖрдИ рдХреЛ рдиреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИред
рд▓реЗрдХрд┐рди рдиреЛрдб рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░/рдиреЛрдб рдХреЛрдб рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рдмреНрд▓реЙрдм рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдо рд╕реЗ рдХрдо рдЕрдиреНрдпрдерд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдпрд╣)ред (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдореБрдЭреЗ рдЗрдВрдбреЗрдХреНрд╕рдбрдбреАрдмреА (рдФрд░ postMessage
) рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд░рдЪрд┐рдд рдХреНрд▓реЛрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдмреНрд▓реЙрдмреНрд╕ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдиреЛрдб-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред)
рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ data:
рдпреВрдЖрд░рдПрд▓ рдкрд░ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдХреЗ рддреАрди рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рд▓реВ рд╣реИрдВ (рдмрдЬрд╛рдп рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред
рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди-рдореЗрдореЛрд░реА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдкрд░реЗ, рд╡реЗ рдпреВрдЖрд░рдПрд▓ рдХреЗ рднреАрддрд░ рдкреВрд░реА рдлрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред
рджреЛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рддреНрд░ рд╕реЗ рдкрд░реЗ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрд╛рд╣рд░ рдбреЗрдЯрд╛ рдХреА рджреГрдврд╝рддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛/рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рддреАрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдХреЛ рдПрдХ рд╕рддреНрд░ рдХреЗ рднреАрддрд░ рднреА рдирд┐рд░рд╕реНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЫрд╡рд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдпреВрдЖрд░рдПрд▓ рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмреНрд▓реЙрдм URL рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд data
URL рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрдЧрд╛)ред
рдпрджрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм XHR, img рддрддреНрд╡реЛрдВ, рдЖрджрд┐ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ jsdom рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ URL рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдирд╛ рдмрд╣реБрдд, рдмрд╣реБрдд рд░реБрдЪрд┐рдХрд░ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рд░рд┐рдПрдХреНрдЯ -рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рдорджрдж рд╕реЗ рд░рд┐рдПрдХреНрдЯ (рд╕реАрдЖрд░рдП) рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ React-mapbox-gl , рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ mapbox-gl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ webworkify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ
Error: Uncaught [TypeError: o.URL.createObjectURL is not a function]
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдмрдЬрд╛рдп рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рддреНрд░реБрдЯрд┐ рдЗрд╕реЗ рд░реЛрдХрддреА рд╣реИред
рдЖрдк рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг jsdom рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХреЗ рд▓рд┐рдП noop рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдХреЛ рдкреИрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рд╕реЗ рдХрдо рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред
рд░реАрдбрдореА рджреЗрдЦреЗрдВ: https://github.com/tmpvar/jsdom#intervening -before-parsing
рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВ рдкреБрд░рд╛рдиреЗ рдПрдкреАрдЖрдИ рдЬреИрд╕реЗ jsdom.env
рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдБ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ
options.beforeParse(this[window]._globalProxy);
(рдЪреЗрд╣рд░реЗ рдХреА рд╣рдереЗрд▓реА) рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реЛрдЧрд╛
рдпреБрдкреАрдбреА
created
рдХреЙрд▓рдмреИрдХ рд╣реИ
created: (err, window) => {
window.URL = { createObjectURL: () => {} }
}
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рд╣реЛрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
@fredvollmer рдЕрдЧрд░ jsdom рдХреЗ рд╕рд╛рде рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдиреЛрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ setupTest.js
(рдпрд╛ рд╕рдордХрдХреНрд╖ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
function noOp () { }
if (typeof window.URL.createObjectURL === 'undefined') {
Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}
@dylanjha рдореБрдЭреЗ TypeError: Cannot redefine property: createObjectURL
@franciscolourenco рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ! рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ ... рдЗрд╕ рд╕рд╢рд░реНрдд рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ: if (typeof window.URL.createObjectURL === 'undefined') {
рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ!
рдореБрдЭреЗ рдпрд╣рд╛рдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдФрд░ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
@dylanjha createObjectURL
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:
window.URL.createObjectURL = noOp
рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдЧрд▓реНрдк рдХреЗ рд╕рд╛рде рднреА рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ jsdom рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ createObjectURL
рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдк рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ jsdom рд╕реЗ рдЖрддреА рд╣реИрдВ рдЬреЛ uncss рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж!
if (typeof URL !== 'undefined') {
delete URL;
}
рдмрд╕ рдЗрд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛
function noOp () { }
if (typeof window.URL.createObjectURL === 'undefined') {
Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}
рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА "setupFiles" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВрдЧреЗред рддреЛ рдЕрдкрдиреЗ package.json рдореЗрдВ рдпрд╛ рдЬрд╣рд╛рдБ рднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ
"jest": {
"setupFiles": [
"<rootDir>/internals/testing/setup_file.js"
],
}
рдЖрдк рдЙрд╕ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдбрд╛рд▓ рджреЗрдВред (рдпрджрд┐ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд┐рд╕реА рдХреА рднреА рдорджрдж рдХрд░реЗрдЧрд╛
img.src = URL.createObjectURL (рдмреВрдБрдж);
рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ URL.createObjectURL рдЬреЗрд╕реНрдЯ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп
рдХреНрдпрд╛ рдЫрд╡рд┐ рд╕реНрд░реЛрдд рдкрд░ рд▓реМрдЯрд╛рдП рдЧрдП рдмреНрд▓реЙрдм рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ
рдпрд╣ рд╣реИрдХреА рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ Node.js рдХреЗ рд▓рд┐рдП createObjectURL
рдФрд░ revokeObjectURL
рд╕рд░рд▓реАрдХреГрдд
рдХреГрдкрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@fredvollmer рдЕрдЧрд░ jsdom рдХреЗ рд╕рд╛рде рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдиреЛрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ
setupTest.js
(рдпрд╛ рд╕рдордХрдХреНрд╖ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред