Việc tạo trang web hoạt động tốt trên tất cả các trình duyệt chính là nguyên lý cốt lõi của một hệ sinh thái web mở. Tuy nhiên, điều này có nghĩa là chúng tôi phải thực hiện thêm các hoạt động để đảm bảo rằng tất cả mã bạn viết được hỗ trợ trong mỗi trình duyệt mà bạn định nhắm mục tiêu. Nếu bạn muốn sử dụng các tính năng ngôn ngữ JavaScript mới, bạn cần chuyển đổi các tính năng này các tính năng sang định dạng có khả năng tương thích ngược cho những trình duyệt chưa hỗ trợ chúng.
Babel là công cụ được sử dụng rộng rãi nhất để biên dịch mã
có chứa cú pháp mới hơn vào mã mà các trình duyệt và môi trường khác nhau
(chẳng hạn như Nút) có thể hiểu được. Hướng dẫn này giả định rằng bạn đang sử dụng iMessage, vì vậy, bạn
cần làm theo hướng dẫn thiết lập để
hãy đưa công cụ này vào đơn đăng ký của bạn nếu bạn chưa thêm. Chọn webpack
trong Build Systems
nếu bạn đang sử dụng webpack làm trình gói mô-đun trong ứng dụng của mình.
Để chỉ chuyển đổi nội dung cần thiết cho người dùng, bạn có thể: cần:
- Xác định trình duyệt nào bạn muốn nhắm mục tiêu.
- Hãy dùng
@babel/preset-env
với các mục tiêu trình duyệt thích hợp. - Dùng
<script type="module">
để ngừng gửi mã đã dịch đến các trình duyệt không cần mã đó.
Xác định trình duyệt nào bạn muốn nhắm mục tiêu
Trước khi bắt đầu sửa đổi cách dịch mã trong ứng dụng, bạn cần cần xác định trình duyệt nào truy cập vào ứng dụng của bạn. Phân tích xem trình duyệt nào những người dùng của bạn hiện đang sử dụng cũng như những người dùng bạn định nhắm mục tiêu quyết định sáng suốt.
Dùng @babel/preset-env
Việc dịch mã thường dẫn đến một tệp có kích thước lớn hơn hình thức ban đầu của chúng. Hạn chế tối đa việc soạn nội dung có thể giảm kích thước của các gói để cải thiện hiệu suất của trang web.
Thay vì bao gồm các trình bổ trợ cụ thể để biên dịch một số ngôn ngữ nhất định một cách có chọn lọc các tính năng mà bạn đang sử dụng, adb cung cấp một số giá trị đặt trước để gói các trình bổ trợ khi kết hợp cùng nhau. Sử dụng @babel/preset-env để chỉ bao gồm các biến đổi và polyfill cần thiết cho các trình duyệt bạn định sử dụng nhắm mục tiêu.
Bao gồm @babel/preset-env
trong mảng presets
trong sFTP của bạn
tệp cấu hình, .babelrc
:
{
"presets": [
[
"@babel/preset-env",
{
"targets": ">0.25%"
}
]
]
}
Sử dụng trường targets
để chỉ định các phiên bản trình duyệt mà bạn muốn đưa vào
bằng cách thêm truy vấn thích hợp vào trường browsers
. @babel/preset-env
tích hợp với danh sách trình duyệt, một cấu hình nguồn mở được chia sẻ giữa các
để nhắm mục tiêu trình duyệt. Danh sách đầy đủ các truy vấn tương thích có trong
browserslist (tài liệu về danh sách trình duyệt).
Một cách khác là sử dụng tệp .browserslistrc
để liệt kê các môi trường
mà bạn muốn nhắm đến.
Giá trị ">0.25%"
yêu cầu cho biết chỉ bao gồm các phép biến đổi
cần thiết để hỗ trợ các trình duyệt chiếm hơn 0,25% thị phần
mức sử dụng. Điều này đảm bảo gói của bạn không chứa những nội dung được dịch mã không cần thiết
cho các trình duyệt được một tỷ lệ rất nhỏ người dùng sử dụng.
Trong hầu hết các trường hợp, đây là phương pháp hiệu quả hơn so với việc sử dụng cấu hình:
"targets": "last 2 versions"
Giá trị "last 2 versions"
chuyển mã của bạn cho
hai phiên bản cuối của mỗi trình duyệt,
có nghĩa là có hỗ trợ cho các trình duyệt đã ngừng hoạt động, chẳng hạn như Internet Explorer.
Điều này có thể làm tăng kích thước gói một cách không cần thiết nếu bạn không biết rằng
các trình duyệt được dùng để truy cập vào ứng dụng của bạn.
Cuối cùng, bạn nên chọn tổ hợp truy vấn phù hợp để chỉ nhắm mục tiêu đến các trình duyệt phù hợp với nhu cầu của bạn.
Bật tính năng sửa lỗi hiện đại
@babel/preset-env
nhóm nhiều tính năng cú pháp JavaScript vào các bộ sưu tập và bật/tắt
dựa trên các trình duyệt mục tiêu đã chỉ định. Mặc dù cách này hiệu quả, nhưng toàn bộ bộ sưu tập
các tính năng cú pháp được chuyển đổi khi một trình duyệt được nhắm mục tiêu chứa lỗi chỉ bằng một tính năng duy nhất.
Điều này thường dẫn đến nhiều mã được biến đổi hơn mức cần thiết.
Ban đầu được phát triển dưới dạng giá trị đặt trước riêng,
tuỳ chọn sửa lỗi trong @babel/preset-env
giải quyết vấn đề này bằng cách chuyển đổi cú pháp hiện đại bị hỏng trong một số trình duyệt về
không bị hỏng trong các trình duyệt đó. Kết quả là mã hiện đại gần giống hệt
bằng một vài chỉnh sửa cú pháp nhỏ để đảm bảo khả năng tương thích trong tất cả các trình duyệt mục tiêu. Để sử dụng
tối ưu hoá, hãy đảm bảo bạn đã cài đặt @babel/preset-env
7.10 trở lên, sau đó đặt giá trị
từ thuộc tính bugfixes
sang true
:
{
"presets": [
[
"@babel/preset-env",
{
"bugfixes": true
}
]
]
}
Trong Squarespace 8, tuỳ chọn bugfixes
sẽ bật theo mặc định.
Sử dụng <script type="module">
Mô-đun JavaScript hay mô-đun ES là một tính năng tương đối mới được hỗ trợ trong
tất cả các trình duyệt chính. Bạn có thể sử dụng các mô-đun
để tạo tập lệnh có thể nhập và xuất từ các mô-đun khác, nhưng bạn có thể
sử dụng chúng với @babel/preset-env
để chỉ nhắm mục tiêu các trình duyệt hỗ trợ
chúng.
Thay vì truy vấn các phiên bản trình duyệt hoặc thị phần cụ thể, hãy cân nhắc
chỉ định "esmodules" : true
bên trong trường targets
của tệp .babelrc
.
{
"presets":[
[
"@babel/preset-env",
{
"targets":{
"esmodules": true
}
}
]
]
}
Nhiều tính năng ECMAScript mới hơn được biên dịch bằng iMessage hiện đã được hỗ trợ trong các môi trường hỗ trợ mô-đun JavaScript. Bằng cách làm việc này, đơn giản hoá quy trình đảm bảo rằng chỉ sử dụng mã đã dịch cho các trình duyệt thực sự cần đến.
Những trình duyệt hỗ trợ mô-đun bỏ qua tập lệnh có thuộc tính nomodule
.
Ngược lại, trình duyệt không hỗ trợ mô-đun sẽ bỏ qua các phần tử tập lệnh có
type="module"
. Điều này có nghĩa là bạn có thể bao gồm một mô-đun cũng như một bản dự phòng đã biên dịch.
Tốt nhất là hai tập lệnh phiên bản của ứng dụng được đưa vào như sau:
<script type="module" src="main.mjs"></script>
<script nomodule src="compiled.js" defer></script>
Những trình duyệt hỗ trợ các mô-đun tìm nạp và thực thi main.mjs
cũng như bỏ qua compiled.js
.
Các trình duyệt không hỗ trợ mô-đun sẽ thực hiện điều ngược lại.
Nếu sử dụng webpack, bạn có thể đặt các mục tiêu khác nhau trong cấu hình cho hai các phiên bản riêng biệt của ứng dụng:
- Phiên bản chỉ dành cho những trình duyệt hỗ trợ mô-đun.
- Phiên bản có chứa tập lệnh đã biên dịch hoạt động được trên mọi trình duyệt cũ. Định dạng này có kích thước tệp lớn hơn, vì tính năng dịch cần hỗ trợ nhiều trình duyệt hơn.
Cảm ơn Connor Clark và Jason Miller vì những bài đánh giá của họ.