ਜਾਣੋ Web Workers ਅਤੇ Service Workers ਕੀ ਹਨ, ਉਹ ਕਿਸ ਤਰ੍ਹਾਂ ਵੱਖਰੇ ਹਨ, ਅਤੇ ਤੇਜ਼ ਪੇਜ, ਬੈਕਗ੍ਰਾਉਂਡ ਟਾਸਕਾਂ, ਕੈਸ਼ਿੰਗ ਅਤੇ ਆਫਲਾਈਨ ਸਹਾਇਤਾ ਲਈ ਕਦੋਂ ਵਰਤਣੇ ਹਨ।

ਬ੍ਰਾਊਜ਼ਰ ਤੁਹਾਡਾ ਜ਼ਿਆਦਾਤਰ JavaScript ਮੁੱਖ ਥ੍ਰੇਡ 'ਤੇ ਚਲਾਉਂਦੇ ਹਨ—ਉਹੀ ਥਾਂ ਜੋ ਯੂਜ਼ਰ ਇਨਪੁਟ, ਐਨੀਮੇਸ਼ਨ ਅਤੇ ਪੇਜ ਦੀ ਪੇਂਟਿੰਗ ਸੰਭਾਲਦੀ ਹੈ। ਜਦੋਂ ਓਥੇ ਭਾਰੀ ਕੰਮ ਹੁੰਦਾ ਹੈ (ਵੱਡੇ ਡੇਟੇ ਨੂੰ ਪਾਰਸ ਕਰਨਾ, ਚਿੱਤਰ ਪ੍ਰਕਿਰਿਆ, ਜਟਿਲ ਗਣਨਾਵਾਂ), UI ਠਿੱਕ ਹੋ ਸਕਦਾ ਹੈ ਜਾਂ "ਫ੍ਰੀਜ਼" ਹੋ ਸਕਦਾ ਹੈ। Workers ਇਸ ਲਈ ਬਣਾਏ ਗਏ ਹਨ ਤਾਂ ਜੋ ਕੁਝ ਟਾਸਕਾਂ ਨੂੰ ਮੁੱਖ ਥ੍ਰੇਡ ਤੋਂ ਬਾਹਰ ਜਾਂ ਪੇਜ ਦੇ ਸਿੱਧੇ ਕੰਟਰੋਲ ਤੋਂ ਬਾਹਰ ਕੀਤਾ ਜਾ ਸਕੇ, ਤਾਂ ਜੋ ਤੁਹਾਡੀ ਐਪ responsive ਰਹੇ।
ਜੇ ਤੁਹਾਡਾ ਪੇਜ 200ms ਦੀ ਹਿਸਾਬੀ ਗਣਨਾ ਕਰ ਰਿਹਾ ਹੈ, ਤਾਂ ਬ੍ਰਾਊਜ਼ਰ ਸੁਚੱਜੀ ਸਕ੍ਰੋਲਿੰਗ, ਕਲਿੱਕਸ 'ਤੇ ਜਵਾਬ ਦੇਣਾ ਜਾਂ 60fps ਰੱਖਣਾ ਨਹੀਂ ਕਰ ਸਕਦਾ। Workers ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਪਿਛੋਕੜ 'ਚ ਕੰਮ ਕਰਨ ਦਿਓ ਤਾਂ ਕਿ ਮੁੱਖ ਥ੍ਰੇਡ ਇੰਟਰਫੇਸ 'ਤੇ ਧਿਆਨ ਰੱਖੇ।
A Web Worker ਇੱਕ ਬੈਕਗ੍ਰਾਉਂਡ JavaScript ਥ੍ਰੇਡ ਹੈ ਜੋ ਤੁਸੀਂ ਪੇਜ ਤੋਂ ਬਣਾਉਂਦੇ ਹੋ। ਇਹ ਉਨ੍ਹਾਂ CPU-ਭਾਰੀ ਟਾਸਕਾਂ ਲਈ ਵਧੀਆ ਹੈ ਜੋ ਨਹੀਂ ਤਾਂ UI ਨੂੰ ਰੋਕ ਦੇਣਗੇ।
A Service Worker ਇੱਕ ਵਿਸ਼ੇਸ਼ ਕਿਸਮ ਦਾ worker ਹੈ ਜੋ ਤੁਹਾਡੇ ਵੈੱਬ ਐਪ ਅਤੇ ਨੈੱਟਵਰਕ ਦੇ ਦਰਮਿਆਨ ਟਿਕਿਆ ਰਹਿੰਦਾ ਹੈ। ਇਹ ਰਿਕਵੇਸਟਾਂ ਨੂੰ ਇੰਟਰਸੈਪਟ, ਰਿਸਪਾਂਸ ਕੈਸ਼ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਆਫਲਾਈਨ ਸਹਾਇਤਾ ਜਾਂ push notifications ਵਰਗੀਆਂ ਸੁਵਿਧਾਵਾਂ ਚਾਲੂ ਕਰਦਾ ਹੈ।
Web Worker ਨੂੰ ਇੱਕ ਸਹਾਇਕ ਵਜੋਂ ਸੋਚੋ ਜੋ ਦੂਜੇ ਕਮਰੇ ਵਿੱਚ ਗਣਨਾ ਕਰ ਰਿਹਾ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਸੁਨੇਹਾ ਭੇਜਦੇ ਹੋ, ਇਹ ਕੰਮ ਕਰਦਾ ਹੈ, ਅਤੇ ਫਿਰ ਜਵਾਬ ਭੇਜਦਾ ਹੈ।
Service Worker ਨੂੰ ਸਟੇਪ-ਅਨ-ਡੋਰ ਤੇ ਖੜੇ ਦੇ ਗੇਟਕੀਪਰ ਵਾਂਗ ਸੋਚੋ। ਪੇਜ, ਸਕ੍ਰਿਪਟ ਅਤੇ API ਕਾਲਾਂ ਲਈ ਰਿਕਵੇਸਟ ਇਸਦੇ ਕੋਲੋਂ ਲੰਘਦੀਆਂ ਹਨ, ਅਤੇ ਇਹ ਨਿਰਣੇ ਕਰ ਸਕਦਾ ਹੈ ਕਿ ਨੈੱਟਵਰਕ ਤੋਂ ਲਿਆ ਜਾਵੇ, ਕੈਸ਼ ਤੋਂ ਸੇਵਾ ਦਿੱਤੀ ਜਾਵੇ, ਜਾਂ ਕਸਟਮ ਜਵਾਬ ਦਿੱਤਾ ਜਾਵੇ।
ਆਖ਼ਰ ਤੱਕ, ਤੁਸੀਂ ਜਾਣੋਗੇ:
postMessage) worker ਮਾਡਲ ਵਿੱਚ ਕਿਵੇਂ ਫਿੱਟ ਹੁੰਦੀ ਹੈ, ਅਤੇ ਆਫਲਾਈਨ ਲਈ Cache Storage API ਕਿਉਂ ਮਹੱਤਵਪੂਰਣ ਹੈਇਹ ਰਿ-ਵਿਊ “ਕਿਉਂ” ਅਤੇ ਮਾਨਸਿਕ ਮਾਡਲ ਸੈੱਟ ਕਰਦੀ ਹੈ—ਅਗਲੇ ਹਿੱਸੇ ਵਿੱਚ ਅਸੀਂ ਹਰ worker ਕਿਸਮ ਦੀ ਵਿਵਹਾਰਿਕ ਵਿਸਥਾਰ ਵਿੱਚ ਜਾਵਾਂਗੇ ਅਤੇ ਅਸਲ ਪ੍ਰਾਜੈਕਟਾਂ ਵਿੱਚ ਇਹ ਕਿੱਥੇ ਫਿੱਟ ਹੁੰਦੇ ਹਨ ਵੇਖਾਂਗੇ।
ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਵੈੱਬ ਪੇਜ ਖੋਲਦੇ ਹੋ, ਉਹ ਸਭ ਕੁਝ ਜੋ ਤੁਸੀਂ "ਅਨੁਭਵ" ਕਰਦੇ ਹੋ ਜ਼ਿਆਦਾਤਰ ਮੁੱਖ ਥ੍ਰੇਡ 'ਤੇ ਹੁੰਦਾ ਹੈ। ਇਹ pixels ਡਰਾਇੰਗ (rendering), ਟੈਪ ਅਤੇ ਕਲਿੱਕ (input) ਤੇ ਜ਼ਿੰਮੇਵਾਰ ਹੈ, ਅਤੇ ਬਹੁਤ ਸਾਰਾ JavaScript ਚਲਾਉਂਦਾ ਹੈ।
ਕਿਉਂਕਿ rendering, input handling ਅਤੇ JavaScript ਅਕਸਰ ਇੱਕੋ ਹੀ ਥ੍ਰੇਡ 'ਤੇ beurt ਲੈਂਦੇ ਹਨ, ਇੱਕ धीਮਾ ਟਾਸਕ ਸਭ ਕੁਝ ਹੋਰਨੂੰ ਰੋਕ ਸਕਦਾ ਹੈ। ਇਸੀ ਲਈ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਅਕਸਰ responsiveness ਸਮੱਸਿਆਵਾਂ ਵਜੋਂ ਦਿਖਾਈ ਦਿੰਦੀਆਂ ਹਨ, ਸਿਰਫ਼ "ਧੀਮਾ ਕੋਡ" ਵਜੋਂ ਨਹੀਂ।
ਉਪਭੋਗੀ ਲਈ "ਬਲਾਕ ਹੋਣਾ" ਇਹ ਮਹਿਸੂਸ ਹੁੰਦਾ ਹੈ:
JavaScript ਕੋਲ ਕਈ asynchronous APIs ਹਨ—fetch(), ਟਾਈਮਰ, events—ਜੋ ਤੁਹਾਨੂੰ ਬੇਕਾਰ ਉਡੀਕ ਕਰਨ ਤੋਂ ਬਚਾਉਂਦੇ ਹਨ। ਪਰ async ਇਹ ਨਹੀਂ ਕਰਦਾ ਕਿ ਭਾਰੀ ਕੰਮ rendering ਦੇ ਨਾਲ ਇਕੱਠੇ ਹੀ ਹੋ ਜਾਵੇ।
ਜੇ ਤੁਸੀਂ ਮੁੱਖ ਥ੍ਰੇਡ 'ਤੇ ਮਹਿੰਗੀ ਗਣਨਾ (ਚਿੱਤਰ ਪ੍ਰੋਸੈਸਿੰਗ, ਵੱਡਾ JSON crunching, crypto, ਜਟਿਲ ਫਿਲਟਰੇਸ਼ਨ) ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਹਾਲੇ ਵੀ UI ਅਪਡੇਟਸ ਨਾਲ ਮੁਕਾਬਲਾ ਕਰ ਰਿਹਾ ਹੁੰਦਾ ਹੈ। "Async" ਕੇਵਲ ਇਹ ਤੈਅ ਕਰ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਕਦੋਂ ਚੱਲੇਗਾ, ਪਰ ਇਹ ਅਕਸਰ ਇਕੋ ਮੁੱਖ ਥ੍ਰੇਡ 'ਤੇ ਹੀ ਚੱਲਦਾ ਹੈ ਅਤੇ ਜਦੋਂ ਇਹ execute ਕਰਦਾ ਹੈ ਤਾਂ jank ਹੋ ਸਕਦੀ ਹੈ।
Workers ਇਸ ਲਈ ਹਨ ਤਾਂ ਜੋ ਬ੍ਰਾਊਜ਼ਰ ਪੇਜ ਨੂੰ responsive ਰੱਖ ਸਕਣ ਜਦੋਂ ਕਿ ਪਿਛੋਕੜ ਵਿੱਚ ਅਰਥਪੂਰਣ ਕੰਮ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੋਵੇ।
ਸੰਖੇਪ: workers ਮੁੱਖ ਥ੍ਰੇਡ ਦੀ ਰੱਖਿਆ ਕਰਨ ਦਾ ਇੱਕ ਤਰੀਕਾ ਹਨ ਤਾਂ ਜੋ ਤੁਹਾਡੀ ਐਪ ਅੰਤਰਕਿਰਿਆਸ਼ੀਲ ਰਹੇ ਜਦੋਂ ਪਿਛੋਕੜ ਵਿੱਚ ਅਸਲੀ ਕੰਮ ਹੋ ਰਿਹਾ ਹੋਵੇ।
A Web Worker JavaScript ਨੂੰ ਮੁੱਖ ਥ੍ਰੇਡ ਤੋਂ ਬਾਹਰ ਚਲਾਉਣ ਦਾ ਤਰੀਕਾ ਹੈ। ਮੁੱਖ ਥ੍ਰੇਡ ਨਾਲ ਮੁਕਾਬਲੇ (rendering, scrolling, ਕਲਿੱਕਸ ਦੇ ਜਵਾਬ) ਵਿੱਚ ਟਕਰਾਅ ਰੋਕਣ ਦੀ ਥਾਂ, worker ਆਪਣਾ ਵੱਖਰਾ ਬੈਕਗ੍ਰਾਉਂਡ ਥ੍ਰੇਡ ਰੱਖਦਾ ਹੈ ਤਾਂ ਕਿ ਭਾਰੀ ਟਾਸਕ ਪੇਜ ਨੂੰ "ਟਹਲਦਾ" ਮਹਿਸੂਸ ਨਾ ਕਰਨ ਦੇ।
ਇਸਨੂੰ ਸੋਚੋ: ਪੇਜ ਯੂਜ਼ਰ ਇੰਟਰੈਕਸ਼ਨ 'ਤੇ ਧਿਆਨ ਰੱਖਦੀ ਹੈ, ਜਦਕਿ worker CPU-ਭਾਰੀ ਕੰਮ ਜਿਵੇਂ ਵੱਡੀ ਫਾਈਲ ਪਾਰਸ ਕਰਨਾ, ਨੰਬਰ ਕ੍ਰੰਚ ਕਰਨਾ, ਜਾਂ ਚਾਰਟਾਂ ਲਈ ਡੇਟਾ ਤਿਆਰ ਕਰਨਾ ਹੈ।
Web Worker ਇੱਕ ਵੱਖਰੇ ਥ੍ਰੇਡ ਨਾਲ ਆਪਣੀ ਗਲੋਬਲ ਸਕੋਪ ਵਿੱਚ ਚਲਦਾ ਹੈ। ਇਹ ਅਜੇ ਵੀ ਕਈ ਵੈੱਬ APIs (ਟਾਈਮਰ, fetch ਬਹੁਤ ਸਾਰੀਆਂ ਬ੍ਰਾਊਜ਼ਰਾਂ ਵਿੱਚ, crypto, ਆਦਿ) ਤੱਕ ਪਹੁੰਚ ਰੱਖਦਾ ਹੈ, ਪਰ ਇਹ ਜਾਣਬੂਝ ਕੇ ਪੇਜ ਤੋਂ ਅਲੱਗ ਕੀਤਾ ਗਿਆ ਹੁੰਦਾ ਹੈ।
ਕੁਝ ਆਮ ਕਿਸਮਾਂ ਹਨ:
ਜੇ ਤੁਸੀਂ ਪਹਿਲਾਂ workers ਨਹੀਂ ਵਰਤੇ, ਤਾਂ ਜ਼ਿਆਦਾਤਰ ਉਦਾਹਰਣ Dedicated Workers ਹੋਣਗੇ।
Workers ਸਿਧੇ ਤੁਹਾਡੇ ਪੇਜ ਦੇ ਫੰਕਸ਼ਨਾਂ ਨੂੰ ਕਾਲ ਨਹੀਂ ਕਰਦੇ। ਇਸ ਦੀ ਥਾਂ, ਸੰਚਾਰ ਸੁਨੇਹਿਆਂ ਰਾਹੀਂ ਹੁੰਦਾ ਹੈ:
postMessage() ਨਾਲ ਡੇਟਾ ਭੇਜਦੀ ਹੈ।postMessage() ਨਾਲ ਜਵਾਬ ਭੇਜਦਾ ਹੈ।ਵੱਡੇ ਬਾਈਨਰੀ ਡੇਟਾ ਲਈ, ਤੁਸੀਂ ਆਮ ਤੌਰ 'ਤੇ ਇੱਕ ArrayBuffer ਦੀ ownership ਟ੍ਰਾਂਸਫਰ ਕਰਕੇ ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ ਸਕਦੇ ਹੋ (ਤਾਂ ਜੋ ਇਹ copy ਨਾ ਹੋਵੇ), ਜਿਸ ਨਾਲ message passing ਤੇਜ਼ ਰਹਿੰਦੀ ਹੈ।
ਕਿਉਂਕਿ worker ਅਲੱਗ ਹੈ, ਕੁਝ ਕੁ ਮੁੱਖ ਰੋਕਾਵਟਾਂ ਹਨ:
window ਜਾਂ document ਨਹੀਂ ਮਿਲਦੇ। Workers self (worker global scope) ਹੇਠ ਚਲਦੇ ਹਨ, ਅਤੇ ਉਪਲਬਧ APIs ਮੁੱਖ ਪੇਜ ਤੋਂ ਵੱਖ ਹੋ ਸਕਦੇ ਹਨ।ਵਧੀਆ ਤਰੀਕੇ ਨਾਲ ਵਰਤਿਆ ਗਿਆ, Web Worker ਮੁੱਖ ਥ੍ਰੇਡ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਸੁਧਾਰਨ ਦਾ ਸਭ ਤੋਂ ਸਧਾਰਣ ਤਰੀਕਾ ਹੈ ਬਿਨਾਂ ਇਹ ਬਦਲੇ ਕਿ ਤੁਹਾਡੀ ਐਪ ਕੀ ਕਰਦੀ ਹੈ—ਸਿਰਫ ਇਸ ਗੱਲ ਦੀ ਕਿ ਮਹਿੰਗਾ ਕੰਮ ਕਿੱਥੇ ਹੁੰਦਾ ਹੈ।
Web Workers ਉਹ ਬਹੁਤ ਵਧੀਆ ਹਨ ਜਦੋਂ ਤੁਹਾਡਾ ਪੇਜ "ਟਿਕਿਆ" ਮਹਿਸੂਸ ਕਰਦਾ ਹੈ ਕਿਉਂਕਿ JavaScript ਮੁੱਖ ਥ੍ਰੇਡ 'ਤੇ ਬਹੁਤ ਜ਼ਿਆਦਾ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ। ਮੁੱਖ ਥ੍ਰੇਡ ਯੂਜ਼ਰ ਇੰਟਰੈਕਸ਼ਨ ਅਤੇ rendering ਲਈ ਜ਼ਿੰਮੇਵਾਰ ਹੈ, ਇਸ ਲਈ ਓਥੇ ਭਾਰੀ ਟਾਸਕ jank, ਰੁਕੀਆਂ ਕਲਿੱਕਸ ਅਤੇ freeze ਸਕ੍ਰੋਲਿੰਗ ਪੈਦਾ ਕਰ ਸਕਦੇ ਹਨ।
Web Worker ਵਰਤੋ ਜਦੋਂ ਤੁਹਾਡੇ ਕੋਲ CPU-ਭਾਰੀ ਕੰਮ ਹੋ ਜੋ ਡਾਇਰੈਕਟ DOM ਪਹੁੰਚ ਦੀ ਲੋੜ ਨਾ ਰੱਖੇ:
ਇੱਕ ਪ੍ਰਯੋਗਿਕ ਉਦਾਹਰਣ: ਜੇ ਤੁਸੀਂ ਵੱਡਾ JSON payload ਪ੍ਰਾਪਤ ਕਰਦੇ ਹੋ ਅਤੇ ਉਸ ਨੂੰ ਪਾਰਸ ਕਰਨਾ UI ਨੂੰ ਹੱਥਾ ਦਿੰਦਾ ਹੈ, ਤਾਂ parsing ਨੂੰ worker ਵਿੱਚ ਲਿਜਾਓ ਅਤੇ ਫਿਰ ਨਤੀਜਾ ਭੇਜੋ।
Worker ਨਾਲ ਸੰਚਾਰ postMessage ਰਾਹੀਂ ਹੁੰਦਾ ਹੈ। ਵੱਡੇ ਬਾਈਨਰੀ ਡੇਟਾ ਲਈ, transferable objects (ਜਿਵੇਂ ArrayBuffer) ਪ੍ਰਾਥਮਿਕਤਾ ਦਿਓ ਤਾਂ ਕਿ ਬ੍ਰਾਊਜ਼ਰ memory ownership worker ਨੂੰ ਦੇ ਸਕੇ ਬਦਲੇ ਵਿਚ copy ਕਰਨ ਦੀ।
// main thread
worker.postMessage(buffer, [buffer]); // transfers the ArrayBuffer
ਇਹ ਆਡੀਓ ਬਫਰ, ਇਮੇਜ ਬਾਈਟਸ ਜਾਂ ਹੋਰ ਵੱਡੇ ਡੇਟਾ ਟੁਕੜਿਆਂ ਲਈ ਖਾਸ ਤੌਰ 'ਤੇ ਲਾਭਦਾਇਕ ਹੈ।
Workers ਦਾ overhead ਹੁੰਦਾ ਹੈ: ਵਾਧੂ ਫਾਇਲਾਂ, message passing, ਅਤੇ ਵੱਖਰਾ ਡੀਬੱਗਿੰਗ ਫਲੋ। ਇਨ੍ਹਾਂ ਨੂੰ ਛੱਡ ਦਿਓ ਜਦੋਂ:
postMessage ping-pong benefit ਨੂੰ ਮਿਟਾ ਸਕਦਾ ਹੈ।ਜੇ ਕਿਸੇ ਟਾਸਕ ਕਰਕੇ ਦਿੱਖਣ ਯੋਗ ਰੁਕਾਵਟ ਹੋ ਸਕਦੀ ਹੈ (ਅਕਸਰ ~50ms+), ਅਤੇ ਉਹ "input → compute → output" ਦੇ ਰੂਪ ਵਿੱਚ ਬਿਆਨ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਬਿਨਾਂ DOM ਪਹੁੰਚ ਦੇ, ਤਾਂ Web Worker ਆਮ ਤੌਰ 'ਤੇ ਲਾਭਦਾਇਕ ਹੁੰਦਾ ਹੈ। ਜੇ ਇਹ ਮੁੱਖ ਤੌਰ 'ਤੇ UI ਅਪਡੇਟਸ ਹਨ, ਤਾਂ ਮੁੱਖ ਥ੍ਰੇਡ 'ਤੇ ਹੀ ਰੱਖੋ ਅਤੇ ਉਥੇ optimize ਕਰੋ।
A Service Worker ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਚੱਲਣ ਵਾਲੀ ਵਿਸ਼ੇਸ਼ JavaScript ਫਾਇਲ ਹੈ ਜੋ ਤੁਹਾਡੇ ਸਾਈਟ ਲਈ ਇੱਕ ਪ੍ਰੋਗ੍ਰਾਮੋਗੇਬਲ ਨੈੱਟਵਰਕ ਲੇਅਰ ਵਾਂਗ ਕੰਮ ਕਰਦੀ ਹੈ। ਇਹ ਕਿਸੇ ਇੱਕ ਪੇਜ 'ਤੇ ਨਹੀਂ ਚੱਲਦੀ, ਬਲਕਿ ਤੁਹਾਡੇ ਵੈੱਬ ਐਪ ਅਤੇ ਨੈੱਟਵਰਕ ਦੇ ਵਿਚਕਾਰ ਖੜੀ ਹੋ ਕੇ ਫੈਸਲਾ ਕਰਦੀ ਹੈ ਕਿ ਜਦੋਂ ਐਪ ਕਿਸੇ ਰਿਸੋਰਸ (HTML, CSS, API calls, images) ਨੂੰ ਮੰਗਦੀ ਹੈ ਤਾਂ ਕੀ ਹੋਵੇ।
Service Worker ਦੀ ਲਾਈਫਸਾਈਕਲ ਕਿਸੇ ਇਕ ਟੈਬ ਤੋਂ ਅਲੱਗ ਹੁੰਦੀ ਹੈ:
ਕਿਉਂਕਿ ਇਹ ਕਿਸੇ ਵੀ ਸਮੇਂ ਰੋਕਿਆ ਜਾਂ ਮੁੜ-ਸਰਗਰਮ ਹੋ ਸਕਦਾ ਹੈ, ਇਸਨੂੰ event-driven ਸਕ੍ਰਿਪਟ ਵਾਂਗ تصور ਕਰੋ: ਕੰਮ ਤੇਜ਼ੀ ਨਾਲ ਕਰੋ, state ਨੂੰ ਕੁਝ ਪਾਇਦੀ ਸਟੋਰੇਜ ਵਿੱਚ ਰੱਖੋ, ਅਤੇ ਇਹ ਨਹੀਂ ਮੰਨੋ ਕਿ ਇਹ ਹਮੇਸ਼ਾ ਚੱਲ ਰਿਹਾ ਹੋਵੇਗਾ।
Service Workers ਉਹੀ origin (ਉਹੀ domain/protocol/port) ਤੱਕ ਸੀਮਿਤ ਹੁੰਦੇ ਹਨ ਅਤੇ ਆਮ ਤੌਰ 'ਤੇ ਉਹਨਾਂ ਦੀ scope ਉਹ ਫੋਲਡਰ ਹੁੰਦੀ ਹੈ ਜਿੱਥੋਂ worker ਫਾਇਲ ਸਰਵ ਕੀਤੀ ਜਾਂਦੀ ਹੈ (ਅਤੇ ਹੇਠਾਂ ਦੀਆਂ ਫਾਇਲਾਂ)। ਇਹਨਾਂ ਲਈ HTTPS ਲਾਜ਼ਮੀ ਹੈ (localhost ਨੂੰ ਛੱਡ ਕੇ) ਕਿਉਂਕਿ ਇਹ ਨੈੱਟਵਰਕ ਰਿਕਵੇਸਟਾਂ 'ਤੇ ਪ੍ਰਭਾਵ ਪਾ ਸਕਦੇ ਹਨ।
Service Worker ਮੁੱਖ ਤੌਰ 'ਤੇ ਤੁਹਾਡੇ ਵੈੱਬ ਐਪ ਅਤੇ ਨੈੱਟਵਰਕ ਦੇ ਵਿਚਕਾਰ ਖੜਾ ਹੁੰਦਾ ਹੈ। ਇਹ ਫੈਸਲਾ ਕਰ ਸਕਦਾ ਹੈ ਕਿ ਕਦੋਂ ਨੈੱਟਵਰਕ ਵਰਤੇ, ਕਦੋਂ cache ਕੀਤਾ ਡੇਟਾ ਵਰਤਿਆ ਜਾਵੇ, ਅਤੇ ਕਦੋਂ ਥੋੜ੍ਹਾ ਬੈਕਗ੍ਰਾਉਂਡ ਕੰਮ ਕੀਤਾ ਜਾਵੇ—ਬਿਨਾਂ ਪੇਜ ਨੂੰ ਰੋਕੇ।
ਸਭ ਤੋਂ ਆਮ ਕੰਮ ਇਹ ਹੈ ਕਿ assets ਅਤੇ responses ਨੂੰ cache ਕਰ ਕੇ ਆਫਲਾਈਨ ਜਾਂ "ਖਰਾਬ ਕਨੈਕਸ਼ਨ" ਅਨੁਭਵ ਨੂੰ ਯੋਗ بنایا ਜਾਵੇ।
ਕੁਝ ਪ੍ਰਯੋਗਿਕ caching ਨੀਤੀਆਂ:
ਅਕਸਰ ਇਹ Cache Storage API ਅਤੇ fetch event handling ਨਾਲ ਲਾਗੂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।
Service Workers ਵਾਪਸੀ ਦੌਰਾਂ ਤੇ ਪਰਸਪੀਕਟਿਵ ਸਪੀਡ ਸੁਧਾਰ ਸਕਦੇ ਹਨ:
ਨਤੀਜਾ: ਘੱਟ ਨੈੱਟਵਰਕ ਰਿਕਵੇਸਟ, ਤੇਜ਼ ਸਟਾਰਟਅਪ, ਅਤੇ flaky ਕਨੈਕਸ਼ਨਾਂ 'ਤੇ ਵਧੀਕ consistency।
Service Workers push notifications ਅਤੇ background sync ਵਰਗੀਆਂ ਬੈਕਗ੍ਰਾਉਂਡ ਸਮਰੱਥਾਵਾਂ ਨੂੰ ਚਲਾ ਸਕਦੇ ਹਨ (ਸਪੋਰਟ ਬ੍ਰਾਊਜ਼ਰ/ਪਲੈਟਫਾਰ्म ਅਨੁਸਾਰ ਵੈਰੀ ਕਰਦੀ ਹੈ)। ਇਹ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ ਯੂਜ਼ਰਾਂ ਨੂੰ ਨੋਟੀਫਾਈ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਫੇਲ ਹੋਈ ਬੇਨਤੀ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ—ਭਾਵੇਂ ਪੇਜ ਖੁੱਲ੍ਹੀ ਨਾ ਹੋਵੇ।
ਜੇ ਤੁਸੀਂ ਇੱਕ progressive web app ਬਣਾ ਰਹੇ ਹੋ, ਤਾਂ Service Workers ਇੱਕ ਮੁੱਖ ਹਿੱਸਾ ਹਨ:
ਜੇ ਤੁਸੀਂ ਇੱਕ ਗੱਲ ਹੀ ਯਾਦ ਰੱਖਣੀ ਹੋਵੇ: Web Workers ਤੁਹਾਡੀ ਪੇਜ ਨੂੰ ਭਾਰੀ ਕੰਮਾਂ ਤੋਂ ਬਚਾਉਂਦੇ ਹਨ ਤਾਂ ਕਿ UI freeze ਨਾ ਹੋਵੇ, ਜਦਕਿ Service Workers ਤੁਹਾਡੇ ਐਪ ਨੂੰ ਨੈੱਟਵਰਕ ਰਿਕਵੇਸਟਾਂ 'ਤੇ ਕੰਟਰੋਲ ਦੇਂਦੇ ਹਨ ਅਤੇ ਇਸਨੂੰ ਇੱਕ installable app (PWA) ਵਾਂਗ ਚਲਦਿਆਂ ਸਹਾਇਤਾ ਦਿੰਦੇ ਹਨ।
A Web Worker CPU-ਭਾਰੀ ਟਾਸਕਾਂ ਲਈ ਹੈ—ਵੱਡੇ ਡੇਟੇ ਪਾਰਸ ਕਰਨਾ, thumbnails ਬਣਾਉਣਾ, ਨੰਬਰ crunch ਕਰਨਾ—ਤਾਂ ਜੋ ਮੁੱਖ ਥ੍ਰੇਡ responsive ਰਹੇ।
A Service Worker request handling ਅਤੇ app lifecycle ਟਾਸਕਾਂ ਲਈ ਹੈ—ਆਫਲਾਈਨ ਸਹਾਇਤਾ, caching ਨੀਤੀਆਂ, background sync ਅਤੇ push notifications। ਇਹ ਤੁਹਾਡੇ ਐਪ ਅਤੇ ਨੈੱਟਵਰਕ ਦੇ ਵਿਚਕਾਰ ਖੜਾ ਰਹਿੰਦਾ ਹੈ।
A Web Worker ਆਮ ਤੌਰ 'ਤੇ ਇੱਕ ਪੇਜ/ਟੈਬ ਨਾਲ ਜੁੜਿਆ ਹੁੰਦਾ ਹੈ। ਜਦੋਂ ਪੇਜ ਚੱਲਦਾ ਹੈ, worker ਵੀ ਆਮ ਤੌਰ 'ਤੇ ਰੁਕ ਜਾਂਦਾ ਹੈ (ਜਾਂ SharedWorker ਵਰਗੇ ਖਾਸਕੇਸ ਵਿੱਚ ਹੋਰ ਰਵੱਈਏ ਹੁੰਦੇ ਹਨ)।
A Service Worker event-driven ਹੁੰਦਾ ਹੈ। ਬ੍ਰਾਊਜ਼ਰ ਇਸਨੂੰ ਕੋਈ event (ਜਿਵੇਂ fetch ਜਾਂ push) ਆਉਣ 'ਤੇ ਚਾਲੂ ਕਰ ਸਕਦਾ ਹੈ, ਫਿਰ idle ਹੋਣ 'ਤੇ ਰੋਕ ਸਕਦਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਇਹ ਹੈ ਕਿ ਇਹ ਟੈਬ ਖੁੱਲ੍ਹੀ ਨਾ ਹੋਣ ਦੇ ਬਾਵਜੂਦ ਵੀ ਚੱਲ ਸਕਦਾ ਹੈ ਜੇ ਕੋਈ event ਆਵੇ।
A Web Worker ਪੇਜ ਵੱਲੋਂ ਕੀਤੀਆਂ ਨੈੱਟਵਰਕ ਰਿਕਵੇਸਟਾਂ ਨੂੰ ਇੰਟਰਸੈਪਟ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਇਹ fetch() ਕਰ ਸਕਦਾ ਹੈ, ਪਰ ਹੋਰ ਹਿੱਸਿਆਂ ਲਈ responses rewrite, cache ਜਾਂ serve ਨਹੀਂ ਕਰ ਸਕਦਾ।
A Service Worker network requests ਨੂੰ intercept ਕਰ ਸਕਦਾ ਹੈ (via the fetch event), ਨੈੱਟਵਰਕ 'ਤੇ ਜਾਣਾ, cache ਤੋਂ serve ਕਰਨਾ, ਜਾਂ fallback ਵਾਪਸ ਕਰਨਾ ਚੁਣ ਸਕਦਾ ਹੈ।
A Web Worker HTTP caching ਨੂੰ manage ਨਹੀਂ ਕਰਦਾ।
A Service Worker ਆਮ ਤੌਰ 'ਤੇ Cache Storage API ਵਰਤਦਾ ਹੈ request/response ਜੋੜਿਆਂ ਨੂੰ store ਅਤੇ serve ਕਰਨ ਲਈ—ਇਹ ਆਫਲਾਈਨ caching ਅਤੇ ਤੁਰੰਤ ਰੀਪੀਟ ਲੋਡਸ ਦਾ ਬੁਨਿਆਦ ਹੈ।
Worker ਚਲਾਉਣਾ ਮੁੱਖ ਤੌਰ 'ਤੇ ਇਸ ਗੱਲ ਬਾਰੇ ਹੁੰਦਾ ਹੈ ਕਿ ਇਹ ਕਿੱਥੇ ਚੱਲ ਰਿਹਾ ਹੈ ਅਤੇ ਇਹ ਕਿਸ ਤਰੀਕੇ ਨਾਲ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। Web Workers ਸਿੱਧੇ ਪੇਜ ਸਕ੍ਰਿਪਟ ਦੁਆਰਾ ਬਣਾਏ ਜਾਂਦੇ ਹਨ। Service Workers ਪੇਜ ਵੱਲੋਂ ਰਜਿਸਟਰ ਹੋਕੇ ਬ੍ਰਾਊਜ਼ਰ ਦੁਆਰਾ install ਹੋਕੇ ਨੈੱਟਵਰਕ ਰਿਕਵੇਸਟਾਂ ਦੇ ਅੱਗੇ ਬੈਠ ਜਾਂਦੇ ਹਨ।
Web Worker ਉਸ ਸਮੇਂ ਜੰਮਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਡਾ ਪੇਜ ਇੱਕ worker ਬਣਾਉਂਦਾ ਹੈ। ਤੁਸੀਂ ਇੱਕ ਵੱਖਰਾ JavaScript ਫਾਇਲ ਦਿਖਾਉਂਦੇ ਹੋ, ਫਿਰ postMessage ਰਾਹੀਂ ਸੰਚਾਰ ਕਰਦੇ ਹੋ।
// main.js (running on the page)
const worker = new Worker('/workers/resize-worker.js', { type: 'module' });
worker.postMessage({ action: 'start', payload: { /* ... */ } });
worker.onmessage = (event) => {
console.log('From worker:', event.data);
};
ਇਕ ਚੰਗਾ ਮਾਨਸਿਕ ਮਾਡਲ: worker ਫਾਇਲ ਇੱਕ ਹੋਰ ਸਕ੍ਰਿਪਟ URL ਹੈ ਜੋ ਤੁਹਾਡਾ ਪੇਜ fetch ਕਰ ਸਕਦਾ ਹੈ, ਪਰ ਇਹ ਮੁੱਖ ਥ੍ਰੇਡ ਤੋਂ ਬਾਹਰ ਚਲਦਾ ਹੈ।
Service Workers ਨੂੰ ਉਸ ਪੇਜ ਤੋਂ ਰਜਿਸਟਰ ਕਰਨਾ ਪੈਂਦਾ ਹੈ ਜਿਸਨੂੰ ਤੁਹਾਡੇ ਯੂਜ਼ਰ ਵੇਖਦੇ ਹਨ:
// main.js
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
ਰਜਿਸਟਰਨਗ ਦੇ ਬਾਅਦ, ਬ੍ਰਾਊਜ਼ਰ install/activate lifecycle ਨੂੰ ਹੈਂਡਲ ਕਰਦਾ ਹੈ। ਤੁਹਾਡਾ sw.js events ਜਿਵੇਂ install, activate, ਅਤੇ fetch ਸੁਣ ਸਕਦਾ ਹੈ।
Service Workers ਨੈੱਟਵਰਕ ਰਿਕਵੇਸਟਾਂ ਨੂੰ ਇੰਟਰਸੈਪਟ ਅਤੇ cache ਕਰ ਸਕਦੇ ਹਨ। ਜੇ registration HTTP 'ਤੇ ਹੋ ਸਕਦੀ, ਤਾਂ ਇੱਕ ਨੈੱਟਵਰਕ attacker ਮਾਲਿਸ਼ਸ sw.js swap ਕਰ ਸਕਦਾ ਸੀ ਅਤੇ ਭਵਿੱਖ ਦੀਆਂ visits ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰ ਸਕਦਾ ਸੀ। HTTPS (ਜਾਂ http://localhost ਵਿਕਾਸ ਲਈ) script ਅਤੇ ਇਸ ਤਰ੍ਹਾਂ ਦੇ ਟ੍ਰੈਫਿਕ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਦਾ ਹੈ।
ਬ੍ਰਾਊਜ਼ਰ workers ਨੂੰ ਸਧਾਰਨ ਪੇਜ ਸਕ੍ਰਿਪਟਾਂ ਤੋਂ ਵੱਖ ਢੰਗ ਨਾਲ cache ਅਤੇ update ਕਰਦੇ ਹਨ। ਅਪਡੇਟ ਲਈ ਯੋਜਨਾ ਬਣਾਓ:
sw.js/worker bundle deploy)।ਜੇ ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ smoother rollout ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਟੈਸਟਿੰਗ ਦਾ ਇੱਕ ਅਚਛਾ ਤਰੀਕਾ ਵੇਖੋ—see /blog/debugging-workers—ਜੋ ਅਪਡੇਟ edge cases ਨੂੰ ਜੜ੍ਹੇ ਹੋਏ early catch ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰੇਗਾ।
Workers ਵੱਖਰੇ ਢੰਗ ਨਾਲ fail ਹੁੰਦੇ ਹਨ ਬਜਾਏ ਕਿ "ਸਧਾਰਨ" ਪੇਜ JavaScript ਦੇ: ਉਹ ਵੱਖਰੇ contexts ਵਿੱਚ ਚੱਲਦੇ ਹਨ, ਆਪਣਾ console ਹੁੰਦਾ ਹੈ, ਅਤੇ ਬ੍ਰਾਊਜ਼ਰ ਦੁਆਰਾ ਮੁੜ-ਚਾਲੂ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਇੱਕ ਮਜ਼ਬੂਤ ਡੀਬੱਗਿੰਗ ਰੁਟੀਨ ਘੰਟਿਆਂ ਬਚਾ ਸਕਦੀ ਹੈ।
DevTools ਖੋਲੋ ਅਤੇ worker-specific targets ਵੇਖੋ। Chrome/Edge ਵਿੱਚ, ਤੁਸੀਂ workers ਨੂੰ ਅਕਸਰ Sources ਦੇ ਅਧੀਨ (ਜਾਂ "Dedicated worker" ਐਂਟਰੀ) ਅਤੇ Console context selector ਵਿੱਚ ਵੇਖੋਗੇ।
ਉਹੀ ਟੂਲ ਵਰਤੋ ਜੋ ਤੁਸੀਂ ਮੁੱਖ ਥ੍ਰੇਡ 'ਤੇ ਵਰਤਦੇ ਹੋ:
onmessage handlers ਅਤੇ ਲੰਬੀਆਂ ਫੰਕਸ਼ਨਾਂ ਵਿੱਚ step ਕਰੋ।ਜੇ messages "ਗੁਮ" ਲੱਗ ਰਹੇ ਹਨ, ਦੋਵੇਂ ਪਾਸਿਆਂ ਦੀ ਜਾਂਚ ਕਰੋ: ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਸੀਂ worker.postMessage(...) ਕਾਲ ਕਰ ਰਹੇ ਹੋ, worker ਵਿੱਚ self.onmessage = ... ਹੈ, ਅਤੇ ਤੁਹਾਡੀ message ਆਕਾਰ (shape) ਮੇਲ ਖਾਂਦੀ ਹੈ।
Service Workers ਲਈ ਸਿਖਰ Application panel ਬਿਹਤਰ ਹੈ:
ਇੰਸਟਾਲ/ਐਕਟਿਵੇਟ/ਫੈਚ errors ਲਈ Console ਵੀ ਵੇਖੋ—ਅਕਸਰ ਇਹ ਦੱਸਦਾ ਹੈ ਕਿ caching ਜਾਂ offline ਵਿਵਹਾਰ ਕਿਉਂ ਨਹੀਂ ਚੱਲ ਰਿਹਾ।
Caching ਮੁੱਦੇ #1 ਸਮਾਂ ਖਰਚ ਕਰਨ ਵਾਲਾ ਹੋ ਸਕਦਾ ਹੈ: ਗਲਤ ਫਾਇਲਾਂ ਜਾਂ ਬਹੁਤ ਜ਼ਿਆਦਾ aggressive caching ਪੁਰਾਣੀ HTML/JS ਰੱਖ ਸਕਦੀ ਹੈ। ਟੈਸਟ ਦੌਰਾਨ hard reload ਕਰੋ ਅਤੇ ਤੁਸੀਂ ਅਸਲ ਵਿੱਚ ਕਿਹੜੀ ਚੀਜ਼ serve ਹੋ ਰਹੀ ਹੈ ਇਹ verify ਕਰੋ।
ਹਕੀਕਤੀ ਟੈਸਟਿੰਗ ਲਈ, DevTools ਨਾਲ:
ਜੇ ਤੁਸੀਂ PWA 'ਤੇ ਤੇਜ਼ iteration ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਇੱਕ clean baseline app ਬਣਾਉਣਾ ਮਦਦਗਾਰ ਹੋ ਸਕਦਾ ਹੈ (predictable Service Worker ਅਤੇ build output) ਅਤੇ ਫਿਰ caching ਨੀਤੀਆਂ ਨੂੰ ਉੱਥੋਂ refine ਕਰੋ। Koder.ai ਵਰਗੇ platforms ਇਸ ਤਰ੍ਹਾਂ ਦੇ प्रयोग ਲਈ ਉਪਯੋਗੀ ਹੋ ਸਕਦੇ ਹਨ: ਤੁਸੀਂ chat prompt ਤੋਂ React-based web app prototype ਕਰ ਸਕਦੇ ਹੋ, source code export ਕਰ ਸਕਦੇ ਹੋ, ਅਤੇ ਫਿਰ ਆਪਣੇ worker setup ਅਤੇ caching ਨੀਤੀਆਂ ਨੂੰ ਤੇਜ਼ feedback loop ਨਾਲ tweak ਕਰ ਸਕਦੇ ਹੋ।
Workers ਐਪਾਂ ਨੂੰ ਹੋਰ smooth ਅਤੇ ਸਮਰਥ ਬਣਾਉਂਦੇ ਹਨ, ਪਰ ਉਹ ਇਹ ਵੀ ਬਦਲ ਦਿੰਦੇ ਹਨ ਕਿ ਕੋਡ ਕਿੱਥੇ ਚਲਦਾ ਹੈ ਅਤੇ ਇਹ ਕਿਨ੍ਹਾਂ ਚੀਜ਼ਾਂ ਤੱਕ ਪਹੁੰਚ ਰੱਖਦਾ ਹੈ। ਸੁਰੱਖਿਆ, ਪ੍ਰਾਈਵੇਸੀ ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਲਈ ਇੱਕ ਛੋਟੀ ਜਾਂਚ ਗਲਤੀਆਂ ਅਤੇ ਨਿਰਾਸ਼ ਯੂਜ਼ਰਾਂ ਤੋਂ ਬਚਾਏਗੀ।
ਦੋਹਾਂ Web Workers ਅਤੇ Service Workers same-origin policy ਨਾਲ ਸੀਮਿਤ ਹਨ: ਉਹ ਸਿਰਫ਼ ਉਹੀ scheme/host/port resources ਨਾਲ ਸਿੱਧਾ ਇੰਟਰੈਕਟ ਕਰ ਸਕਦੇ ਹਨ (ਜਦ ਤੱਕ ਸਰਵਰ CORS ਰਾਹੀਂ ਖੁੱਲ੍ਹਾ ਨਾ ਕਰੇ)। ਇਹ ਰੋਕਦਾ ਹੈ ਕਿ worker ਕਿਸੇ ਹੋਰ ਸਾਈਟ ਤੋਂ ਡੇਟਾ ਚੁਪਚਾਪ ਖਿੱਚ ਕੇ ਤੁਹਾਡੇ ਐਪ ਵਿੱਚ ਨ ਮਿਲਾ ਸਕੇ।
Service Workers ਲਈ ਹੋਰ ਸ਼ੁਰਕਾਣੀ ਕਾਰਜ ਹਨ: ਉਹ ਆਮ ਤੌਰ 'ਤੇ HTTPS ਲਾਜ਼ਮੀ ਕਰਦੇ ਹਨ (ਵਿਕਾਸ ਲਈ localhost ਛੱਡ ਕੇ) ਕਿਉਂਕਿ ਉਹ ਨੈੱਟਵਰਕ ਰਿਕਵੇਸਟਾਂ ਨੂੰ ਇੰਟਰਸੈਪਟ ਕਰ ਸਕਦੇ ਹਨ। ਇਨ੍ਹਾਂ ਨੂੰ privileged code ਵਾਂਗ ਮੰਨੋ: dependencies ਘਟਾਓ, dynamic code loading ਤੋਂ ਬਚੋ, ਅਤੇ ਆਪਣੀ caching logic ਨੂੰ version ਕਰੋ ਤਾਂ ਜੋ ਪੁਰਾਣੀਆਂ caches outdated ਫਾਇਲਾਂ serve ਨਾ ਕਰਨ।
ਬੈਕਗ੍ਰਾਉਂਡ ਸੁਵਿਧਾਵਾਂ predictable ਮਹਿਸੂਸ ਕਰਨੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ। Push notifications ਸ਼ਕਤੀਸ਼ਾਲੀ ਹਨ, ਪਰ permission prompts ਨੂੰ ਅਸਾਨੀ ਨਾਲ ਗਲਤ ਫਾਇਦੇ ਲਈ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ।
ਸਿਰਫ਼ ਉਹੀ permission ਮੰਗੋ ਜੋ ਸਪਸ਼ਟ ਲਾਭ ਦੇਵੇ (ਉਦਾਹਰਣ ਲਈ, ਯੂਜ਼ਰ ਨੇ settings ਵਿੱਚ alerts enable ਕੀਤੇ ਹੋਣ), ਅਤੇ ਦੱਸੋ ਕਿ ਉਹ ਕੀ ਪ੍ਰਾਪਤ ਕਰਨਗੇ। ਜੇ ਤੁਸੀਂ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਡੇਟਾ sync ਜਾਂ prefetch ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਇਹ ਸਾਫ਼ ਜ਼ਬਾਨ ਵਿੱਚ communicate ਕਰੋ—ਯੂਜ਼ਰਾਂ ਨੂੰ ਅਣਚਾਹੀ ਨੈੱਟਵਰਕ activity ਜਾਂ ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਦਾ ਧਿਆਨ ਰਹਿੰਦਾ ਹੈ।
Workers "ਮੁਫ਼ਤ" ਨਹੀਂ ਹੁੰਦੇ। ਉਨ੍ਹਾਂ ਨੂੰ ਜ਼ਿਆਦਾ ਵਰਤਣਾ ਵਿਰੋਧੀ ਪ੍ਰਭਾਵ ਪੈਦਾ ਕਰ ਸਕਦਾ ਹੈ:
postMessage ਕਾਲਾਂ (ਖਾਸ ਕਰਕੇ ਵੱਡੇ objects ਨਾਲ) ਬੋਤਲਨੈਕ ਬਣ ਸਕਦੀਆਂ ਹਨ। ਬੈਚਿੰਗ ਅਤੇ transferable objects ਵਰਤੋ ਜਿੱਥੇ ਲਾਗੂ ਹੋਵੇ।ਹਰ browser ਹਰ ਸਮਰੱਥਾ ਨੂੰ ਸਪੋਰਟ ਨਹੀਂ ਕਰਦਾ (ਜਾਂ ਯੂਜ਼ਰ permissions ਬਲਾਕ ਕਰ ਸਕਦੇ ਹਨ)। feature-detect ਕਰੋ ਅਤੇ gracefully degrade ਕਰੋ:
if ('serviceWorker' in navigator) {
// register service worker
} else {
// continue without offline features
}
ਮਕਸਦ: ਕੋਰ ਫੰਕਸ਼ਨਾਲਟੀ ਫਿਰ ਵੀ ਕੰਮ ਕਰੇ, ਜਦੋਂ ਕਿ "nice-to-haves" (offline, push, heavy computations) ਉਪਲਬਧ ਹੋਣ 'ਤੇ ਜੋੜੇ ਜਾਣ।
Web Workers ਅਤੇ Service Workers ਵੱਖ-ਵੱਖ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕਰਦੇ ਹਨ, ਇਸ ਲਈ ਜਦੋਂ ਐਪ ਨੂੰ heavy computation ਅਤੇ ਤੇਜ਼, ਭਰੋਸੇਯੋਗ ਲੋਡਿੰਗ ਦੀ ਲੋੜ ਹੋਵੇ ਤਾਂ ਉਹ ਚੰਗੀ ਤਰ੍ਹਾਂ ਜੋੜੇ ਜਾ ਸਕਦੇ ਹਨ। ਇੱਕ ਚੰਗਾ ਮਾਨਸਿਕ ਮਾਡਲ ਹੈ: Web Worker = compute, Service Worker = network + caching, main thread = UI।
ਕਹੋ ਤੁਹਾਡੀ ਐਪ ਯੂਜ਼ਰਾਂ ਨੂੰ ਫੋਟੋ ਐਡਿਟ ਕਰਨ ਦਿੰਦੀ ਹੈ (resize, filters, background removal) ਅਤੇ ਬਾਅਦ ਵਿੱਚ ਗੈਲਰੀ ਆਫਲਾਈਨ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹਨ।
ਇਹ "compute then cache" ਰਵੱਈਆ ذمہਦਾਰੀਆਂ ਨੂੰ ਸਾਫ਼ ਰੱਖਦਾ ਹੈ: worker ਨਤੀਜੇ ਪੈਦਾ ਕਰਦਾ ਹੈ, ਅਤੇ service worker ਫੈਸਲਾ ਕਰਦਾ ਹੈ ਕਿ ਉਹਨਾਂ ਨੂੰ ਕਿਵੇਂ ਸਟੋਰ ਅਤੇ serve ਕੀਤਾ ਜਾਵੇ।
ਫੀਡਸ, ਫਾਰਮਾਂ ਜਾਂ ਫ਼ੀਲਡ ਡੇਟਾ ਵਾਲੀਆਂ ਐਪਾਂ ਲਈ:
ਭਾਵੇਂ ਪੂਰੀ background sync ਨਾ ਹੋਵੇ, service worker ਫਿਰ ਵੀ perceived speed ਸੁਧਾਰਦਾ ਹੈ cached responses serve ਕਰਕੇ ਜਦੋਂ ਐਪ ਪਿਛਲੇ ਦੌਰਾਂ 'ਤੇ update ਹੋ ਰਿਹਾ ਹੋਵੇ।
ਰੋਲ ਨਾਂ ਮਿਲਾਓ:
postMessage ਰਾਹੀਂ)।No. Service Worker background ਵਿੱਚ ਚੱਲਦਾ ਹੈ, ਕਿਸੇ ਵੀ ਪੇਜ ਟੈਬ ਤੋਂ ਵੱਖਰਾ, ਅਤੇ ਇਸਨੂੰ ਡਾਇਰੈਕਟ DOM (ਪੇਜ ਦੇ HTML ਤੱਤ) ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਹੈ।
ਇਹ ਅਲੱਗਤਾ ਜਾਣਬੂਝ ਕੇ ਹੈ: Service Workers ਇਸ ਲਈ ਬਣਾਏ ਗਏ ਹਨ ਤਾਂ ਕਿ ਉਹ ਪੇਜ ਖੁੱਲਾ ਨਾ ਹੋਣ 'ਤੇ ਵੀ ਕੰਮ ਕਰ ਸਕਣ (ਉਦਾਹਰਣ ਲਈ, push event ਦਾ ਜਵਾਬ ਦੇਣ ਜਾਂ cached files serve ਕਰਨ ਲਈ)। ਕਿਉਂਕਿ ਸ਼ਾਇਦ ਕੋਈ active document ਹੀ ਨਹੀਂ ਹੋਵੇ, ਬ੍ਰਾਊਜ਼ਰ ਨੇ ਇਸਨੂੰ isolate ਕੀਤਾ ਹੈ।
ਜੇ Service Worker ਨੂੰ ਯੂਜ਼ਰ ਨੂੰ ਜੋ ਕੁਝ ਦੇਖਾਉਣਾ ਹੈ, ਤਾਂ ਇਹ pages ਨਾਲ messaging (ਉਦਾਹਰਣ postMessage) ਰਾਹੀਂ ਸੰਚਾਰ ਕਰਦਾ ਹੈ ਤਾਂ ਕਿ ਪੇਜ UI update ਕਰ ਸਕੇ।
No. Web Workers ਅਤੇ Service Workers ਅਜ਼ਾਦ features ਹਨ।
ਤੁਸੀਂ ਕਿਸੇ ਇੱਕ ਨੂੰ ਅਕੇਲਾ ਵੀ ਵਰਤ ਸਕਦੇ ਹੋ, ਜਾਂ ਦੋਹਾਂ ਨੂੰ ਇੱਕੱਠੇ ਜਦੋਂ ਤੁਹਾਡੀ ਐਪ ਨੂੰ ਦੋਹਾਂ compute ਅਤੇ offline/network features ਦੀ ਲੋੜ ਹੋਵੇ।
Use a Web Worker when you have CPU-heavy work that can be expressed as input → compute → output and doesn’t need the DOM.
Good fits include parsing/transforming large payloads, compression, crypto, image/audio processing, and complex filtering. If the work is mostly UI updates or frequent DOM reads/writes, a worker won’t help (and can’t access the DOM anyway).
Use a Service Worker when you need network control: offline support, caching strategies, faster repeat visits, request routing, and (where supported) push/background sync.
If your problem is “the UI freezes while computing,” that’s a Web Worker problem. If your problem is “loading is slow/offline is broken,” that’s a Service Worker problem.
No. Web Workers and Service Workers are independent.
You can use either alone, or combine them when you need both compute and offline/network features.
Mostly scope and lifetime.
fetch) even when no page is open, then shut down when idle.No. Web Workers don’t have window/document access.
If you need to affect the UI, send data back to the main thread via postMessage(), then update the DOM in your page code. Keep the worker focused on pure computation.
No. Service Workers don’t have DOM access.
To influence what the user sees, communicate with controlled pages via messaging (for example using the Clients API + postMessage()), and let the page update the UI.
Use postMessage() on both sides.
worker.postMessage(data)self.postMessage(result)For large binary data, prefer transferables (like ArrayBuffer) to avoid copying:
Service Workers sit between your app and the network and can respond to requests using the Cache Storage API.
Common strategies:
Pick a strategy per resource type (app shell vs API data), not one global rule.
Yes, but keep responsibilities clear.
A common pattern is:
This avoids mixing UI logic into background contexts and keeps performance predictable.
Use the right DevTools surface for each.
onmessage, and profile to confirm the main thread stays responsive.When debugging caching bugs, always verify what’s actually served (network vs cache) and test offline/throttling.
worker.postMessage(buffer, [buffer]);