2017-12-19 22 views

답변

6

WebAssembly의 존재를 감지 할 수있는 몇 가지 방법이 있습니다. 가장 기본적인 방법은 WebAssembly이 전역 범위에 "object" 유형인지 여부를 확인하는 것입니다. 그러나 "전역 범위"는 다른 JavaScript 환경 (기본 브라우저 스레드, 작업자, node.js)에서 처리하기가 까다 롭습니다.

WebAssembly는 지원하지만 실제로는 CSP (아직 CSP에서 표준화되지 않은 것을 정확하게) 때문에 실제로 컴파일하거나 인스턴스화 할 수 없으므로 기술적으로 충분하지 않습니다. 다음과 같이

보수적 인 검사가 될 수있다 :

const supported = (() => { 
 
    try { 
 
     if (typeof WebAssembly === "object" 
 
      && typeof WebAssembly.instantiate === "function") { 
 
      const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00)); 
 
      if (module instanceof WebAssembly.Module) 
 
       return new WebAssembly.Instance(module) instanceof WebAssembly.Instance; 
 
     } 
 
    } catch (e) { 
 
    } 
 
    return false; 
 
})(); 
 

 
console.log(supported ? "WebAssembly is supported" : "WebAssembly is not supported");

그것은은 다음을 현재 범위에서 액세스

  • 확인 WebAssembly 여부. 글로벌이 아니라면 우리는 정말로 신경 쓰지 않습니다!
  • 여기에 실제로 사용하지 않지만 실제로 비동기 적이기 때문에 인스턴스화 할 때 사용하고 싶고 기본 스레드에서 대형 모듈을 처리하거나 해제 할 수 있기 때문에 .instantiate 함수가 있는지 확인하십시오.
  • 가능한 가장 작은 모듈 (마법 번호 '\0', 'a', 's', 'm' 다음에 버전 번호 1이 uint32으로 인코딩 됨)을 동 기적으로 컴파일하고이 중 WebAssembly.Module이 나오는지 확인하십시오.
  • 마지막으로 동 기적으로 모듈을 인스턴스화하고 WebAssembly.Instance인지 확인하십시오.

이 조금 많이 있지만 관계없이 작동합니다 : 코드는 (주 스레드, 노동자, Node.js를)를 실행하는 경우

  • .
  • CSP가 표준화되는 방법.
+0

아마도 인스턴스가 아닌 'true'를 반환하고 싶을 것입니다. –

+1

@AndreasRossberg'instanceof'는 boolean을 반환하는 연산자입니다. –

+0

@AyushGupta, 오, 맞아요. 창 테두리에 의해 완벽하게 잘려 졌기 때문에 실종 됐습니다. –