2016-01-04 15 views
7

Tôi có một thư viện JS lớn mà tôi nên viết lại vì nó thực sự cũ và lỗi thời. Vì vậy, tôi quyết định đưa ra giải pháp mà tôi sẽ chỉ sử dụng hầu hết các tính năng của ES2015 như rest parameters.Cách phát hiện xem trình duyệt có tương thích với ES2015

Vấn đề là, tôi chắc chắn tất cả khách hàng sẽ không cập nhật trình duyệt của họ và tôi bối rối liệu tôi có gặp phải bất kỳ vấn đề nào liên quan đến trình duyệt của họ tương thích với các thư viện JS mới của tôi hay không.

Vì vậy, tôi đã tự hỏi liệu tôi có thể phát hiện xem trình duyệt của khách hàng có tương thích với ES2015 hay không. Và nếu không, tôi sẽ chỉ bao gồm thư viện JS cũ của tôi.

Tôi đang tìm một giải pháp như Conditional comments, nhưng tôi không nhận được giải pháp nào.

Bất kỳ trợ giúp nào về HTML, JS hoặc PHP đều được đánh giá cao. Xin vui lòng đề nghị lời khuyên của bạn.

+3

Hiện tại, không có trình duyệt nào tương thích với toàn bộ * ES2015 *. Xem https://kangax.github.io/compat-table/es6/ –

+2

Câu hỏi hay. Đối với người mới bắt đầu, tôi nghĩ điều này sẽ được áp dụng tốt nhất làm cấu hình trình quản lý phụ thuộc để điều này sẽ tải phiên bản thay thế của tập lệnh. Đối với phát hiện, tôi tự hỏi, nếu phương pháp đơn giản nhất sẽ là một cái gì đó như 'eval (" chức năng (a, b, ... args) {} ");', và kiểm tra lỗi cú pháp. Một lời nhắc nhở, tất nhiên, rằng "eval là ác", nhưng nếu bạn ghi nhớ để chỉ sử dụng nó cho một chuỗi nội tuyến chính xác nó có thể là một chút an toàn hơn. – Katana314

+1

Rất nhiều tính năng ES6 không thể đơn giản được điền bởi vì nó là Cú pháp mới, vì vậy bạn sẽ cần phải có hai phiên bản của tất cả các mã của bạn; phiên bản ES6 và phiên bản Legacy (có thể được biên dịch từ phiên bản ES6 sử dụng Babel?). Tính năng phát hiện sẽ phải được thực hiện trong 'try..catch' vì nếu nó không được hỗ trợ, ** sẽ ** ném lỗi. Thay vào đó, bạn có thể mang mã lên đến ES5 với shims, điều đó có nghĩa là bạn có một cơ sở mã duy nhất. –

Trả lời

3

Tôi đã tự hỏi liệu tôi có thể phát hiện xem trình duyệt của khách hàng có tương thích với ES2015 hay không . Và nếu không, tôi sẽ chỉ bao gồm thư viện JS cũ của tôi.

Bạn không thể làm điều đó, đơn giản vì AFAIK không có trình duyệt hỗ trợ đầy đủ ES2015. Ngoài ra, bạn không thực sự muốn duy trì hai phiên bản mã khác nhau của bạn, bởi vì nó rất đau đớn và nó có thể rất lộn xộn.

Cách tiếp cận ngày nay là sử dụng bộ thu thập transpiler, là trình biên dịch biên dịch mã ES2015 của bạn thành ES5 (JavaScript mà mọi trình duyệt đều biết). Nó vẫn còn khá lộn xộn, nhưng ít nhất bạn cũng chỉ viết một phiên bản mã của bạn, và đó là ES2015.

Tôi nghĩ Babel (trước đây là 6to5) là trình chuyển đổi phổ biến nhất. Bạn có thể xem trang web của họ để bắt đầu.


Như để trả lời câu hỏi thực tế của bạn,

Làm thế nào để phát hiện nếu trình duyệt tương thích với ES2015

Bạn có thể làm điều đó bằng nhiều cách. Tôi không chắc chắn những gì có thể là một đáng tin cậy nhất, nhưng ví dụ bạn chỉ có thể thử trên giao diện điều khiển của trình duyệt của bạn:

'Promise' in window 

Nếu tuyên bố này trở true, sau đó các trình duyệt hiện tại hỗ trợ những lời hứa, đó là một tính năng mới của ES2015, vì vậy bạn có thể giả định rằng nó hỗ trợ hầu hết các tính năng của ES2015.

Điều này là không đủ đối với hầu hết các trường hợp; bạn có thể muốn chắc chắn 100% rằng những gì bạn đang sử dụng sẽ không ném SyntaxError vào bất kỳ trình duyệt cũ nào.

Một giải pháp có thể là kiểm tra thủ công từng tính năng bạn muốn sử dụng. Ví dụ, nếu bạn cần Fetch API, bạn có thể tạo một hàm mà nói với bạn nếu trình duyệt hiện nay hỗ trợ nó:

function isFetchAPIsupported() { 
    return 'fetch' in window; 
} 

Bạn có thể làm điều này cho bất kỳ API mới mà bạn cần.Tuy nhiên, nếu bạn cần một cái gì đó cú pháp khác nhau, tôi nghĩ rằng đặt cược duy nhất của bạn là eval() (như Katana314 gợi ý). Ví dụ: để kiểm tra hỗ trợ cho các tham số còn lại bạn có thể thực hiện:

function isRestSupported() { 
    try { 
     eval('function foo(bar, ...rest) { return 1; };'); 
    } catch (error) { 
     return false; 
    } 
    return true; 
} 

Điều này rất hữu ích trong Firefox, vì các thông số còn lại được hỗ trợ. Nó hoạt động tốt trên Safari, trả lại false vì thông số còn lại là chưa được hỗ trợ ở đó.

+4

* Nếu câu lệnh này trả về true, thì trình duyệt sẽ "tương thích" với ES2015. * Đó chỉ là sai. Nó chỉ có nghĩa là trình duyệt cung cấp các lời hứa gốc. –

+0

Bạn sẽ làm gì nếu 'isRestSupported' trả về' true'? Sử dụng cú pháp còn lại trong một trình duyệt không được hỗ trợ sẽ ném một lỗi cú pháp khi * phân tích cú pháp * thay vì thực hiện nhiều hơn khả năng – CodingIntrigue

+0

@RGraham Trong nhận xét của tôi, tôi đã đề cập đến một người quản lý phụ thuộc sẽ phải cấu hình cho nó. Ví dụ: 'partOfApp.js' và' partOfApp_ES5.js'. Sau này có thể chỉ đơn giản là cảnh báo nói "Nhận trình duyệt mới hơn, mau!" nếu đó không phải là trang web truy cập thông thường. – Katana314

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