Jsdom: URL.createObjectURL 및 URL.revokeObjectURL μΆ”κ°€

에 λ§Œλ“  2017λ…„ 01μ›” 31일  Β·  26μ½”λ©˜νŠΈ  Β·  좜처: jsdom/jsdom

μ•ˆλ…•ν•˜μ„Έμš”, jsdom 이미 URL μƒμ„±μžλ₯Ό μ§€μ›ν•˜μ§€λ§Œ 이 2가지 정적 λ©”μ„œλ“œκ°€ μ•„λ‹ˆλΌ λŒ€λΆ€λΆ„μ˜ μ΅œμ‹  λΈŒλΌμš°μ €μ—μ„œ μ§€μ›λ©λ‹ˆλ‹€.

createObjectURL
μ·¨μ†Œκ°μ²΄URL
μ‚¬μš©ν•΄λ„ λ˜λ‚˜μš”

feature

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@fredvollmer jsdomκ³Ό ν•¨κ»˜ jestλ₯Ό μ‚¬μš©ν•˜κ³  이 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ €λ©΄ 이 μ½”λ“œλ₯Ό setupTest.js (λ˜λŠ” 이에 μƒμ‘ν•˜λŠ” μ„€μ • 슀크립트)에 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function noOp () { }

if (typeof window.URL.createObjectURL === 'undefined') {
  Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}

λͺ¨λ“  26 λŒ“κΈ€

https://github.com/eligrey/Blob.js 의 κ΅¬ν˜„μ„ jsdom μžˆμŠ΅λ‹ˆκΉŒ?

jspdf λ‚΄μ—μ„œ jsdom jspdf λ₯Ό μ‚¬μš©ν•˜μ—¬ 이에 μ˜ν•΄ μ°¨λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ•„λ‹ˆμš”, 이 μ½”λ“œλŠ” Blob URL이 μ•„λ‹Œ 데이터 URL을 μƒμ„±ν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. λˆ„κ΅°κ°€λŠ” 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일 수 μžˆμŠ΅λ‹ˆλ‹€

Chrome이 사양을 μ—„κ²©ν•˜κ²Œ λ”°λ₯΄μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ™μΌν•œ 인수λ₯Ό 두 번 μ „λ‹¬ν•˜κ±°λ‚˜ μˆ«μžλ‚˜ λ°°μ—΄κ³Ό 같이 μ˜ˆμƒν•˜μ§€ λͺ»ν•œ μœ ν˜•μ„ μ „λ‹¬ν•˜λ©΄ URL.revokeObjectURL NetworkError λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

νŽΈμ§‘ν•˜λ‹€:
Firefoxμ—μ„œλ„ λ™μΌν•œ 일이 λ°œμƒν•©λ‹ˆλ‹€. κ΅¬ν˜„μ„ λ‹¨μˆœν•˜κ²Œ μœ μ§€ν•˜κ³  λΈŒλΌμš°μ €μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ Blob μ €μž₯μ†Œκ°€ ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° URL.revokeObjectURL λŠ” noop κΈ°λŠ₯이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έ μ˜λ―ΈλŠ”:

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() μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ ν•œ κ°€μ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

serializedκ°€ "null"인 경우 κ΅¬ν˜„ μ •μ˜ κ°’μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.

"κ΅¬ν˜„ μ •μ˜ κ°’"은 무엇을 μ˜λ―Έν•©λ‹ˆκΉŒ?

λͺ¨λ“  μ§ˆλ¬Έμ— λŒ€ν•œ 닡을 얻은 것 κ°™μŠ΅λ‹ˆλ‹€.
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 , μœ„μ˜ μ½”λ“œκ°€ μ’‹μ•„ 보이고 거기에 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μΆ”κ°€ν•  수 μžˆλ‚˜μš”?

Blob URL을 λ§Œλ“œλŠ” 것 이상을 μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이후에 μ΄λ ‡κ²Œ μƒμ„±λœ URL이 XMLHttpRequest 와 같은 μ‚¬μš©μžμ—κ²Œ μ œκ³΅λ˜λ„λ‘ ν—ˆμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Blob URL을 λ§Œλ“œλŠ” 것 이상을 μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이후에 μ΄λ ‡κ²Œ μƒμ„±λœ URL이 XMLHttpRequest와 같은 μ‚¬μš©μžμ—κ²Œ μ œκ³΅λ˜λ„λ‘ ν—ˆμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

그것이 ν•„μš”ν•©λ‹ˆκΉŒ? μ‚¬μš© μ‚¬λ‘€λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? XMLHttpRequest 의 κΈ°μ‘΄ 둜직이 잘 μ²˜λ¦¬λ κΉŒμš”?

jsdom 의 λͺ©ν‘œκ°€ λΈŒλΌμš°μ €κ°€ ν•˜λŠ” 일의 μ •ν™•ν•œ λ™μž‘μ„ λ³΅μ œν•˜λŠ” 것인지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.
κ·Έλ ‡λ‹€λ©΄ μš°λ¦¬λŠ” λΈŒλΌμš°μ €λ₯Ό μž‘μ„±ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

IMOμ—μ„œλŠ” μ‹€μ œ μ‚¬μš© 사둀가 μžˆμ„ λ•ŒκΉŒμ§€ 이λ₯Ό μ—°κΈ°ν•΄μ•Ό β€‹β€‹ν•©λ‹ˆλ‹€.

이것을 μ•žμœΌλ‘œ λ‚˜μ•„κ°€κΈ° μœ„ν•΄ μš°λ¦¬λŠ” 무엇을 더 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

var URL = blob:${serializeURL(location.origin)}/${uuid()} ;

serializeURL() λŠ” 사양에 μ„€λͺ…λœ μ•Œκ³ λ¦¬μ¦˜λ³΄λ‹€ μ•½κ°„ 더 λ§Žμ€ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
μš°λ¦¬λŠ” 그것을 μ‚¬μš©ν•˜κ±°λ‚˜ μ‚¬μ–‘μ—μ„œ μ •ν™•νžˆ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

μ‹€μ œλ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우(XHR, img μš”μ†Œ λ“±μ—μ„œ μ‚¬μš©λ˜λŠ” 경우) 객체 URL을 jsdom에 μΆ”κ°€ν•˜λŠ” λ°μ—λŠ” 관심이 μ—†μŠ΅λ‹ˆλ‹€. 그것듀을 λ§Œλ“œλŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” 맀우 ν₯미둭지 μ•ŠμŠ΅λ‹ˆλ‹€. λͺ‡ μ€„μ˜ μ½”λ“œλ‘œ 이λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ 전체 jsdom κ΅¬ν˜„μ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

자, 그럼 κ΅¬ν˜„ν•˜λ €λ©΄ 무엇이 ν•„μš”ν• κΉŒμš”?

Nodeμ—μ„œ DOM APIλ₯Ό μ‚¬μš©ν•  수 있게 ν•˜λŠ” 것 외에도 μžλ™ν™”λœ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ λΈŒλΌμš°μ €κ°€ 있으면 맀우 μœ μš©ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ…Έλ“œ μ‚¬μš©μ— λŒ€ν•œ νŠΉμ • μ‚¬μš© μ‚¬λ‘€λŠ” Blob이 μƒμ„±λ˜λŠ” λΈŒλΌμš°μ €/λ…Έλ“œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 두 ν™˜κ²½ λͺ¨λ‘μ—μ„œ 이 방법을 μ‚¬μš©ν•˜μ—¬ λ‚΄μš©μ„ 검사할 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것). (λ‚΄ κ²½μš°μ—λŠ” IndexedDB(및 postMessage )μ—μ„œ μ‚¬μš©ν•˜λŠ” κ΅¬μ‘°ν™”λœ 볡제 μ•Œκ³ λ¦¬μ¦˜μ—μ„œ Blob 볡제λ₯Ό μœ„ν•œ λ…Έλ“œλ³„ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.)

Blob URL은 μ„œλ²„μ™€ 독립적인 λ©”λͺ¨λ¦¬μ—μ„œ μž‘μ—…ν•΄μ•Ό ν•˜λŠ” νŠΉλ³„ν•œ μš”κ΅¬ 사항을 μΆ©μ‘±ν•©λ‹ˆλ‹€. data: URL보닀 Blob URLμ—λŠ” μ„Έ 가지 κ³ μœ ν•œ 츑면이 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€(μ΄μŠ€μΌ€μ΄ν”„ 없이 더 μ‰½κ²Œ ꡬ성할 수 μžˆλ‹€λŠ” 점 외에도).

ν•˜λ‚˜λŠ” λ©”λͺ¨λ¦¬ λ‚΄ μ½˜ν…μΈ λ₯Ό λ„˜μ–΄ URL λ‚΄ 전체 파일 μ½˜ν…μΈ λ₯Ό 인코딩할 ν•„μš” 없이 νŒŒμΌμ„ μ°Έμ‘°ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€(μ‚¬μš©ν•  λ•ŒκΉŒμ§€ μ—­μ°Έμ‘°ν•  ν•„μš”κ°€ μ—†μŒ).

두 λ²ˆμ§ΈλŠ” λΈŒλΌμš°μ € μ„Έμ…˜ λ˜λŠ” μ‚¬μš©μž λΈŒλΌμš°μ € μ™ΈλΆ€μ—μ„œ 데이터가 μ§€μ†λ˜λŠ” 것을 λ°©μ§€ν•˜λŠ” λ³΄μ•ˆ/개인 정보 λ³΄ν˜Έμ— μœ μš©ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ„Έ λ²ˆμ§ΈλŠ” Blob URL이 μ„Έμ…˜ λ‚΄μ—μ„œλ„ μ·¨μ†Œλ  수 μžˆμ–΄ μ°Έμ‘°κ°€ 만료될 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€(예: 이미지λ₯Ό λ§Œλ“€κ³  Blob URL을 톡해 ν‘œμ‹œν•œ λ‹€μŒ μ‚¬μš©μžκ°€ 이미지λ₯Ό μ‚­μ œν•˜λ©΄ Blob이 μ‚­μ œλ˜λ„λ‘ URL을 μ·¨μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€. URL은 data URLκ³Ό 달리 μž¬μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우(XHR, img μš”μ†Œ λ“±μ—μ„œ μ‚¬μš©λ˜λŠ” 경우) 객체 URL을 jsdom에 μΆ”κ°€ν•˜λŠ” λ°μ—λŠ” 관심이 μ—†μŠ΅λ‹ˆλ‹€. 그것듀을 λ§Œλ“œλŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” 맀우 ν₯미둭지 μ•ŠμŠ΅λ‹ˆλ‹€.

react-snapshot 의 λ„μ›€μœΌλ‘œ React(CRA) ν”„λ‘œμ νŠΈμ˜ μ„œλ²„ μΈ‘ λ Œλ”λ§μ„ ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚΄ ν”„λ‘œμ νŠΈλŠ” λ˜ν•œ webworkify λ₯Ό μ‚¬μš©ν•˜λŠ” mapbox-gl을 μ‚¬μš©ν•˜λŠ” react-mapbox-gl을 μ‚¬μš© ν•©λ‹ˆλ‹€ . 그리고 ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€νŒ¨ν•˜κΈ° λ•Œλ¬Έμ—

Error: Uncaught [TypeError: o.URL.createObjectURL is not a function]

μ‹€μ œλ‘œ μ„œλ²„μ—μ„œ 맡을 λ Œλ”λ§ν•˜λŠ” 데 관심이 μ—†μŠ΅λ‹ˆλ‹€. μ„œλ²„μ—μ„œ 맡 λŒ€μ‹  자리 ν‘œμ‹œμžλ₯Ό λ Œλ”λ§ν•˜κ³  μ‹Άμ§€λ§Œ 이 였λ₯˜λ‘œ 인해 이λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ‡ μ€„μ˜ μ½”λ“œλ‘œ 이λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ 전체 jsdom κ΅¬ν˜„μ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

적어도 이것에 λŒ€ν•œ noop κΈ°λŠ₯을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄ jsdom을 νŒ¨μΉ˜ν•  수 μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” 그것이 μ‹€νŒ¨ν•  것이라고 μƒκ°ν•˜μ§€λ§Œ 이것이 적어도 좜발점이 될 κ²ƒμž…λ‹ˆλ‹€.

읽어보기: https://github.com/tmpvar/jsdom#intervening -before-parsing

감사 ν•΄μš”. λ‚˜λŠ” 이것을 가지고 μžˆμ§€ μ•Šμ€ jsdom.env 와 같은 였래된 API에 λΆ™μ–΄ μžˆμ–΄ μœ κ°μž…λ‹ˆλ‹€.

options.beforeParse(this[window]._globalProxy);

(facepalm) μ’€ 더 νž˜λ“€κ² λ‹€

UPD

created 콜백이 μžˆμŠ΅λ‹ˆλ‹€

created: (err, window) => {
  window.URL = { createObjectURL: () => {} }
}

이 κΈ°λŠ₯ μš”μ²­μ˜ μƒνƒœλŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? ν™•μ‹€νžˆ 있으면 μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

@fredvollmer jsdomκ³Ό ν•¨κ»˜ jestλ₯Ό μ‚¬μš©ν•˜κ³  이 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ €λ©΄ 이 μ½”λ“œλ₯Ό setupTest.js (λ˜λŠ” 이에 μƒμ‘ν•˜λŠ” μ„€μ • 슀크립트)에 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function noOp () { }

if (typeof window.URL.createObjectURL === 'undefined') {
  Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}

@dylanjha λ‚˜λŠ” TypeError: Cannot redefine property: createObjectURL μ–»μŠ΅λ‹ˆλ‹€

[email protected]

@franciscolourenco λ§žμŠ΅λ‹ˆλ‹€! μ£„μ†‘ν•©λ‹ˆλ‹€... μœ„μ˜ μ˜ˆμ œμ—μ„œ μ½”λ“œλ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ 이 쑰건문을 λž˜ν•‘ν–ˆμœΌλ©° 이것이 μ €μ—κ²Œ νš¨κ³Όμ μž…λ‹ˆλ‹€. if (typeof window.URL.createObjectURL === 'undefined') {

μ‹œλ„ν•΄λ³΄μ‹­μ‹œμ˜€!

μ—¬κΈ°λ‘œ λŒμ•„μ™€ 예제λ₯Ό μ—…λ°μ΄νŠΈν•˜λ„λ‘ μƒκΈ°μ‹œμΌœ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

@dylanjha createObjectURL 이 μ •μ˜λ˜μ—ˆμ§€λ§Œ ν•¨μˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ 일뢀 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ 과제 :

window.URL.createObjectURL = noOp

이것이 꿀꺽꿀꺽에도 적용될 수 μžˆλŠ”μ§€ μ•„λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ? 기본적으둜 uncssκ°€ μ‚¬μš©ν•˜λŠ” jsdomμ—μ„œ λ°œμƒν•˜λŠ” createObjectURL 에 λŒ€ν•œ jsdom 였λ₯˜λ₯Ό μΉ¨λ¬΅μ‹œν‚€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

if (typeof URL !== 'undefined') {
  delete URL;
}

더 λͺ…ν™•ν•˜κ²Œν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

function noOp () { }

if (typeof window.URL.createObjectURL === 'undefined') {
  Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}

jest κ΅¬μ„±μ˜ "setupFiles" νŒŒμΌμ— 넣은 경우 μ—λ§Œ μž‘λ™ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‹Ήμ‹ μ˜ package.json λ˜λŠ” 당신이 가지고 μžˆλŠ” λͺ¨λ“  κ³³μ—μ„œ
"jest": { "setupFiles": [ "<rootDir>/internals/testing/setup_file.js" ], }
λ‹€λ₯Έ μ‚¬λžŒμ΄ μž‘μ„±ν•œ μ½”λ“œλ₯Ό κ·Έ 파일 μ•ˆμ— λ„£μŠ΅λ‹ˆλ‹€. (ν•΄λ‹Ή 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 생성해야 ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.)

이것이 μ†”λ£¨μ…˜μ— λŒ€ν•΄ ν˜Όλž€μŠ€λŸ¬μ›Œν•˜λŠ” μ‚¬λžŒμ—κ²Œ λ„μ›€μ΄λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

img.src = URL.createObjectURL(λΈ”λ‘­);

μž‘λ™ν•˜μ§€ μ•ŠμŒ, 였λ₯˜ λ°œμƒ URL.createObjectURL은 jest ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ νŒŒμΌμ„ μ²΄ν¬μΈν•˜λŠ” λ™μ•ˆ
이미지 src에 λ°˜ν™˜λœ blob을 ν• λ‹Ή ν•˜λŠ”

이것은 ν•΄ν‚€ν•˜κ³  ꢌμž₯ν•˜μ§€ μ•Šμ§€λ§Œ Node.js에 λŒ€ν•΄ createObjectURL 및 revokeObjectURL 의 λ‹¨μˆœν™”λœ
μ‚¬μš©ν•˜κΈ° 전에 무엇을 ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰