Tôi đang cố triển khai Service Worker
trong trang thử nghiệm. Mục tiêu cuối cùng của tôi là một ứng dụng hoạt động ngoại tuyến. Cấu trúc thư mục dướiHiểu phạm vi công nhân dịch vụ
/myApp
...
/static
/mod
/practice
service-worker.js
worker-directives.js
foopage.js
/templates
/practice
foopage.html
Tôi đăng ký một nhân viên dịch vụ như hình dưới đây (trong vòng service-worker.js
):
navigator.serviceWorker.register('../static/mod/practice/service-worker.js').then(function(reg) {
console.log('Registration succeeded. Scope is ' + reg.scope);
...
}
và trong giao diện điều khiển tôi thấy
Registration succeeded. Scope is https://example.com/static/mod/practice/
Nếu tôi trang được đặt tại https://example.com/practice/foopage
, tôi có cần đảm bảo rằng phạm vi service worker
của tôi là https://example.com/practice/foopage
?
Nếu tôi cố gắng để xác định phạm vi trong cuộc gọi register
chức năng như
navigator.serviceWorker.register('../static/mod/practice/service-worker.js', { scope: '/practice/foopage/' }).then(function(reg) {
...
}
tôi nhận được lỗi
Registration failed with SecurityError: Failed to register a ServiceWorker: The path of the provided scope ('/practice/foopage/') is not under the max scope allowed ('/static/mod/practice/'). Adjust the scope, move the Service Worker script, or use the Service-Worker-Allowed HTTP header to allow the scope.
Câu hỏi là: Chính xác những gì phạm vi tham khảo? Có phải đó là tập hợp các URL mà service worker
cuối cùng sẽ kiểm soát không? Tôi có cần di chuyển service-workers.js
ở một nơi khác không? Nếu vậy, ở đâu?
Tôi không nghĩ tệp 'js' trong thư mục gốc là thứ sẽ được thực hiện. Nhưng với các khái niệm mới đến mô hình mới, tôi đoán –
Tôi nghĩ rằng đó là chủ yếu vì lý do an ninh. Nếu bạn chỉ có quyền truy cập vào '/ static', nhưng không truy cập vào root ('/'), ví dụ, nhân viên dịch vụ của bạn không thể chặn các yêu cầu tới thư mục gốc. – nils
Điều này chỉ đúng một phần — phạm vi xác định những trang nào được nhân viên dịch vụ kiểm soát. Khi một trang được kiểm soát bởi một nhân viên dịch vụ, * tất cả * các yêu cầu HTTP có nguồn gốc từ trang, bất kể URL yêu cầu, sẽ kích hoạt sự kiện 'fetch' của nhân viên dịch vụ. Vì vậy, nếu một trang được kiểm soát thực hiện một yêu cầu AJAX cho 'https: // thirdpartyapi.com/api/test', nhân viên dịch vụ của bạn sẽ có cơ hội đánh chặn nó. –