2017-12-19 28 views

Trả lời

6

Có một số cách để bạn có thể phát hiện sự hiện diện của WebAssembly. Điều cơ bản là kiểm tra xem WebAssembly nếu thuộc loại "object" trong phạm vi toàn cầu, nhưng "phạm vi toàn cầu" là một điều khó khăn để truy cập vào các môi trường JavaScript khác nhau (luồng trình duyệt chính, công nhân, node.js).

Làm như vậy cũng không đủ kỹ thuật vì bạn có thể có hỗ trợ WebAssembly nhưng không thể thực sự biên dịch hoặc khởi tạo do CSP (và chính xác những gì không cho phép CSP chưa được chuẩn hóa).

Một tấm séc bảo thủ có thể thực hiện như sau:

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");

Nó làm như sau:

  • Kiểm tra xem WebAssembly có thể truy cập trong phạm vi hiện tại. Nếu nó không phải là toàn cầu, chúng tôi không thực sự quan tâm!
  • Kiểm tra xem nó có chức năng .instantiate không, chúng tôi không thực sự sử dụng ở đây nhưng bạn muốn sử dụng khi bạn thực sự khởi tạo vì nó không đồng bộ và có thể xử lý các mô-đun lớn trên luồng chính hoặc tắt.
  • Cố gắng biên dịch đồng bộ mô-đun nhỏ nhất có thể (số ma thuật '\0', 'a', 's', 'm', tiếp theo là số phiên bản 1 được mã hóa là uint32) và xem chúng tôi có được WebAssembly.Module không.
  • Cuối cùng, cố gắng đồng bộ hóa ngay lập tức mô-đun đó và kiểm tra xem đó có phải là WebAssembly.Instance hay không.

Đây là một chút nhiều nhưng nên làm việc không phụ thuộc:

  • đâu đang chạy (Đề tài chính, lao động, Node.js).
  • Cách CSP được chuẩn hóa.
+0

Có thể bạn muốn trả về 'true', không phải là cá thể. –

+1

@AndreasRossberg 'instanceof' là một toán tử trả về boolean –

+0

@AyushGupta, oh, bạn nói đúng, tôi đã bỏ lỡ điều đó vì nó đã bị cắt hoàn toàn bởi biên giới cửa sổ. –

Các vấn đề liên quan