Phương thức thay thế hiện đại cho importScripts().
Thông tin khái quát
Mô-đun ES đã được nhà phát triển yêu thích từ một thời gian. Ngoài việc nhiều lợi ích khác, chúng hứa hẹn về một định dạng mô-đun phổ quát nơi có thể chia sẻ mã phát hành một lần và chạy trong các trình duyệt và trong các thời gian chạy thay thế như Node.js. Trong khi tất cả trình duyệt hiện đại cung cấp một số hỗ trợ cho mô-đun ES, không phải tất cả các mô-đun đó đều cung cấp hỗ trợ ở mọi nơi mã có thể chạy. Cụ thể, tính năng hỗ trợ nhập các mô-đun ES bên trong của trình duyệt service worker mới bắt đầu trở nên rộng rãi hơn.
Bài viết này trình bày chi tiết về trạng thái hiện tại của việc hỗ trợ mô-đun ES trong trình chạy dịch vụ trên các trình duyệt phổ biến, cùng với một số lỗi cần tránh và các phương pháp hay nhất để gửi mã trình chạy dịch vụ có khả năng tương thích ngược.
Trường hợp sử dụng
Trường hợp sử dụng lý tưởng cho các mô-đun ES bên trong trình chạy dịch vụ là để tải mã cấu hình hoặc thư viện hiện đại được chia sẻ với các môi trường thời gian chạy khác hỗ trợ các mô-đun ES.
Cố gắng chia sẻ mã theo cách này trước khi các mô-đun ES đòi hỏi phải sử dụng phiên bản cũ hơn "phổ thông" các định dạng mô-đun như UMD bao gồm mã nguyên mẫu không cần thiết và viết mã đã thực hiện thay đổi đối với dữ liệu hiển thị trên toàn bộ biến.
Những tập lệnh được nhập qua các mô-đun ES có thể kích hoạt trình chạy dịch vụ
cập nhật
nếu nội dung của chúng thay đổi, phù hợp với
hành vi
trong số
importScripts()
.
Hạn chế hiện tại
Chỉ nhập dữ liệu tĩnh
Bạn có thể nhập các mô-đun ES theo một trong hai cách:
tĩnh,
bằng cú pháp import ... from '...'
hoặc
một cách linh động,
bằng phương thức import()
. Bên trong một trình chạy dịch vụ, chỉ có phần tĩnh
Google hiện hỗ trợ cú pháp.
Hạn chế này tương tự như
hạn chế tương tự
được đặt vào ngày sử dụng importScripts()
. Các lệnh gọi động đến importScripts()
không
hoạt động bên trong một trình chạy dịch vụ và tất cả các lệnh gọi importScripts()
, vốn là
vốn có tính đồng bộ, phải hoàn tất trước khi worker dịch vụ hoàn tất
Giai đoạn install
. Hạn chế này đảm bảo rằng trình duyệt biết và
có thể lưu vào bộ nhớ đệm ngầm, tất cả mã JavaScript cần thiết cho
trong quá trình cài đặt.
Cuối cùng, quy định hạn chế này có thể được gỡ bỏ và tiếng Tây Ban Nha linh động nhập mô-đun có thể được phép. Hiện tại, hãy đảm bảo rằng bạn chỉ sử dụng cú pháp tĩnh bên trong một trình chạy dịch vụ.
Còn các trình thực thi khác thì sao?
Hỗ trợ cho
Các mô-đun ES trong "chuyên dụng" trình thực thi—đó
được tạo bằng new Worker('...', {type: 'module'})
—phổ biến hơn và
đã được hỗ trợ trong Chrome và Edge từ
phiên bản 80, cũng như
các phiên bản gần đây của Safari.
Cả tính năng nhập mô-đun ES tĩnh và động đều được hỗ trợ trong worker chuyên dụng.
Chrome và Edge đã hỗ trợ các mô-đun ES bằng nhân viên dùng chung từ phiên bản 83, nhưng không có trình duyệt khác có hỗ trợ tại thời điểm này.
Không hỗ trợ nhập bản đồ
Nhập bản đồ cho phép môi trường thời gian chạy để viết lại thông số mô-đun, chẳng hạn như thêm tiền tố URL của một CDN ưu tiên mà từ đó các mô-đun ES có thể được tải.
Trong khi Chrome và Edge phiên bản 89 trở lên hỗ trợ nhập bản đồ, chúng hiện không thể dùng với dịch vụ trình thực thi.
Hỗ trợ trình duyệt
Chrome và Edge hỗ trợ các mô-đun ES trong trình chạy dịch vụ, kể từ phiên bản 91.
Safari đã thêm hỗ trợ trong Bản phát hành Bản dùng thử công nghệ 122 và nhà phát triển sẽ thấy chức năng này được phát hành trong phiên bản phiên bản Safari trong tương lai.
Mã mẫu
Đây là ví dụ cơ bản về cách sử dụng mô-đun ES dùng chung trong window
của một ứng dụng web
ngữ cảnh, đồng thời đăng ký một trình chạy dịch vụ sử dụng cùng một mô-đun ES:
// Inside config.js:
export const cacheName = 'my-cache';
// Inside your web app:
<script type="module">
import {cacheName} from './config.js';
// Do something with cacheName.
await navigator.serviceWorker.register('es-module-sw.js', {
type: 'module',
});
</script>
// Inside es-module-sw.js:
import {cacheName} from './config.js';
self.addEventListener('install', (event) => {
event.waitUntil((async () => {
const cache = await caches.open(cacheName);
// ...
})());
});
Khả năng tương thích ngược
Ví dụ trên sẽ hoạt động tốt nếu tất cả trình duyệt đều hỗ trợ mô-đun ES trong service worker, nhưng cho đến thời điểm viết bài này, thì không phải như vậy.
Để phù hợp với các trình duyệt không có hỗ trợ được tích hợp sẵn, bạn có thể chạy
tập lệnh trình chạy dịch vụ thông qua
Trình gói tương thích với mô-đun ES để tạo một
Service worker bao gồm tất cả mã mô-đun cùng dòng và sẽ hoạt động trong
các trình duyệt cũ hơn. Ngoài ra, nếu các mô-đun mà bạn đang cố gắng nhập là
đã có sẵn được nhóm trong
IIFE hoặc
UMD, bạn có thể nhập chúng bằng cách sử dụng
importScripts()
.
Khi bạn có sẵn hai phiên bản trình chạy dịch vụ—một phiên bản sử dụng tiếng Tây Ban Nha các mô-đun khác với những mô-đun khác không có—bạn sẽ cần phải phát hiện những gì trình duyệt hỗ trợ và đăng ký tập lệnh trình chạy dịch vụ tương ứng. Tốt nhất các phương pháp phát hiện hỗ trợ hiện đang thay đổi, nhưng bạn có thể làm theo thảo luận về chủ đề này Vấn đề GitHub đối với nội dung đề xuất.
_Ảnh của Vlado Paunovic trên Unsplash_