ਆਧੁਨਿਕ ਫਰੰਟਐਂਡ ਇੰਜੀਨੀਅਰਿੰਗ ਇੱਕ ਦਹਾਕੇ ਪਹਿਲਾਂ ਵਰਗੀ ਨਹੀਂ ਰਹੀ। ਤੁਸੀਂ ਸਿਰਫ਼ HTML ਅਤੇ CSS ਨਹੀਂ ਲਿਖ ਰਹੇ ਹੋ। ਇੱਕ ਆਮ ਪ੍ਰੋਜੈਕਟ ਹੁਣ ਇੱਕ ਖਾਸ Node.js runtime, ਇੱਕ ਲੌਕਡ ਪੈਕੇਜ ਮੈਨੇਜਰ ਵਰਜ਼ਨ, ਬਿਲਡ ਟੂਲਜ਼ ਦੇ ਇੱਕ ਗੁੰਝਲਦਾਰ ਸਮੂਹ, ਅਤੇ ਡਿਪਲਾਈਮੈਂਟ ਪਾਈਪਲਾਈਨਾਂ ਦੇ ਨਾਲ ਆਉਂਦਾ ਹੈ ਜੋ ਉਮੀਦ ਕਰਦੇ ਹਨ ਕਿ ਸਭ ਕੁਝ ਬਿਲਕੁਲ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਲਾਈਨ ਵਿੱਚ ਹੋਵੇ। ਪਹਿਲੇ npm install ਅਤੇ ਅੰਤਿਮ ਪ੍ਰੋਡਕਸ਼ਨ ਬਿਲਡ ਦੇ ਵਿਚਕਾਰ ਕਿਤੇ, ਛੋਟੇ-ਮੋਟੇ ਅੰਤਰ ਪੈਦਾ ਹੋ ਜਾਂਦੇ ਹਨ। ਤੁਹਾਡਾ ਇੱਕ ਸਾਥੀ Node 20 ਚਲਾ ਰਿਹਾ ਹੈ। ਤੁਸੀਂ Node 18 ਚਲਾ ਰਹੇ ਹੋ। ਤੁਹਾਡੀ ਮਸ਼ੀਨ 'ਤੇ ਇੱਕ ਗਲੋਬਲ CLI ਟੂਲ ਦੂਜੇ ਦੀ ਮਸ਼ੀਨ 'ਤੇ ਮੌਜੂਦ ਕਿਸੇ ਗਲਤ ਡਿਪੈਂਡੈਂਸੀ ਨੂੰ ਛੁਪਾ ਲੈਂਦਾ ਹੈ। ਫਿਰ ਉਹ ਵਾਕ ਆਉਂਦਾ ਜੋ ਕੋਈ ਵੀ ਨਹੀਂ ਸੁਣਨਾ ਚਾਹੁੰਦਾ: "ਇਹ ਮੇਰੀ ਮਸ਼ੀਨ 'ਤੇ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ।"

Docker ਤੁਹਾਡੇ ਫਰੰਟਐਂਡ ਟੂਲਕਿੱਟ ਵਿੱਚ ਆਪਣੀ ਜਗ੍ਹਾ ਬਣਾਉਂਦਾ ਹੈ ਕਿਉਂਕਿ ਇਹ ਉਸ ਅਨਿਸ਼ਚਿਤਤਾ ਨੂੰ ਖਤਮ ਕਰ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਸਦੇ ਲੋੜੀਂਦੇ ਸਹੀ runtime, ਸਿਸਟਮ ਲਾਇਬ੍ਰੇਰੀਆਂ, ਅਤੇ ਡਿਪੈਂਡੈਂਸੀਜ਼ ਦੇ ਨਾਲ ਬੰਡਲ ਕਰ ਦਿੰਦਾ ਹੈ। ਭਾਵੇਂ ਤੁਸੀਂ Windows 'ਤੇ ਕੋਡਿੰਗ ਕਰ ਰਹੇ ਹੋ, macOS ਤੋਂ ਸ਼ਿਪ ਕਰ ਰਹੇ ਹੋ, ਜਾਂ Linux ਕਲਾਉਡ ਇੰਸਟੈਂਸ 'ਤੇ ਡਿਪਲੋਏ ਕਰ ਰਹੇ ਹੋ, ਇਸਦਾ ਵਿਵਹਾਰ ਬਿਲਕੁਲ ਇੱਕੋ ਜਿਹਾ ਰਹਿੰਦਾ ਹੈ।

ਫਰੰਟਐਂਡ ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਇਸ ਦੀ ਪਰਵਾਹ ਕਿਉਂ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ

Docker ਜਿਨ੍ਹਾਂ ਮੁਸ਼ਕਲਾਂ ਨੂੰ ਹੱਲ ਕਰਦਾ ਹੈ, ਉਹ ਸਿਰਫ਼ ਕਲਪਨਾਤਮਕ ਨਹੀਂ ਹਨ। ਉਹ ਹਰ ਸਪ੍ਰਿੰਟ ਵਿੱਚ ਸਾਹਮਣੇ ਆਉਂਦੀਆਂ ਹਨ।

ਵਰਜ਼ਨ ਦੇ ਟਕਰਾਅ (Version conflicts) ਸਮਾਂ ਬਰਬਾਦ ਕਰਦੇ ਹਨ। ਇੱਕ ਪੁਰਾਣੇ ਕਲਾਇੰਟ ਪ੍ਰੋਜੈਕਟ ਨੂੰ Node 18 ਦੀ ਲੋੜ ਹੈ, ਤੁਹਾਡੇ ਸਾਈਡ ਪ੍ਰੋਜੈਕਟ ਨੂੰ Node 20 ਦੀ ਲੋੜ ਹੈ, ਅਤੇ ਨਵੇਂ ਸਟਾਰਟਅੱਪ ਕੰਮ ਲਈ Node 22 ਦੀ ਲੋੜ ਹੈ। ਕੰਟੇਨਰਾਂ ਤੋਂ ਬਿਨਾਂ, ਤੁਸੀਂ ਇਸਨੂੰ ਵਰਜ਼ਨ ਮੈਨੇਜਰਾਂ ਰਾਹੀਂ ਸੰਭਾਲਦੇ ਹੋ। ਇਹ ਉਦੋਂ ਤੱਕ ਕੰਮ ਕਰਦਾ ਹੈ ਜਦੋਂ ਤੱਕ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਆਉਂਦੀ। npm ਦੇ ਵਰਜ਼ਨ ਵਿੱਚ ਇੱਕ ਮਾਮੂਲੀ ਅਸੰਤੁਲਨ peer dependencies ਦੇ ਹੱਲ ਹੋਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਤੁਹਾਡਾ ਬਿਲਡ ਖਰਾਬ ਹੋ ਸਕਦਾ ਹੈ ਜੋ ਕਿਸੇ ਹੋਰ ਲਈ ਬਿਲਕੁਲ ਠੀਕ ਚੱਲਦਾ ਹੈ। ਜਦੋਂ ਕੋਈ ਫਰੇਮਵਰਕ ਨਵਾਂ ਰਿਲੀਜ਼ ਐਲਾਨਦਾ ਹੈ, ਤਾਂ ਫੀਡਬੈਕ ਲੂਪ ਦੋ ਘੰਟੇ ਦੇ ਰੀ-ਇੰਸਟਾਲੇਸ਼ਨ ਦਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ। ਇਸਨੂੰ ਸਿਰਫ਼ ਇੱਕ ਫਾਈਲ ਬਦਲਾਅ ਅਤੇ ਇੱਕ ਕੰਟੇਨਰ ਰੀਸਟਾਰਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।

ਗਲੋਬਲ ਪੈਕੇਜ ਵੀ ਚੁੱਪਚਾਪ ਹੋਣ ਵਾਲੀਆਂ ਮੁਸ਼ਕਲਾਂ ਦਾ ਇੱਕ ਹੋਰ ਸਰੋਤ ਹਨ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਛੇ ਮਹੀਨੇ ਪਹਿਲਾਂ ਤੋਂ ਹੀ Angular CLI, Expo, ਜਾਂ Prisma ਗਲੋਬਲ ਰੂਪ ਵਿੱਚ ਇੰਸਟਾਲ ਹੋਵੇ। ਇੱਕ ਨਵਾਂ ਡਿਵੈਲਪਰ ਉਸੇ ਟੂਲ ਨੂੰ ਨਵੇਂ ਸਿਰੇ ਤੋਂ ਇੰਸਟਾਲ ਕਰਦਾ ਹੈ ਅਤੇ ਉਸਨੂੰ ਇੱਕ ਵੱਖਰਾ ਵਰਜ਼ਨ ਮਿਲਦਾ ਹੈ। ਅਚਾਨਕ ਤੁਹਾਡੇ ਬਿਲਡ ਸਕ੍ਰਿਪਟਾਂ ਵਿੱਚ ਅਜਿਹੀਆਂ ਚੇਤਾਵਨੀਆਂ (warnings) ਆਉਣ ਲੱਗਦੀਆਂ ਹਨ ਜੋ ਕਿਤੇ ਹੋਰ ਨਹੀਂ ਦਿਖਾਈ ਦਿੰਦੀਆਂ। Docker ਇਸਨੂੰ ਸਭ ਕੁਝ ਪ੍ਰੋਜੈਕਟ-ਲੋਕਲ ਰੱਖ ਕੇ ਠੀਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਆਪਣੀ Dockerfile ਵਿੱਚ Node ਵਰਜ਼ਨ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦੇ ਹੋ। ਡਿਪੈਂਡੈਂਸੀਜ਼ ਕੰਟੇਨਰ ਦੇ ਅੰਦਰ ਇੰਸਟਾਲ ਹੁੰਦੀਆਂ ਹਨ, ਜੋ ਤੁਹਾਡੇ ਹੋਸਟ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਤੋਂ ਵੱਖਰੀਆਂ ਹੁੰਦੀਆਂ ਹਨ। ਤੁਹਾਡਾ ਲੈਪਟਾਪ macOS, Windows, ਜਾਂ Ubuntu ਹੋ ਸਕਦਾ ਹੈ; ਐਪਲੀਕੇਸ਼ਨ ਹਰ ਵਾਰ ਬਿਲਕੁਲ ਇੱਕੋ ਜਿਹਾ ਮਾਹੌਲ ਦੇਖਦੀ ਹੈ।

ਆਨਬੋਰਡਿੰਗ (Onboarding) ਦੇ ਫਾਇਦੇ ਅਣਦੇਖੇ ਕਰਨਾ ਮੁਸ਼ਕਲ ਹੈ। ਨਵੇਂ ਕਰਮਚਾਰੀਆਂ ਨੂੰ Homebrew ਇੰਸਟਾਲੇਸ਼ਨ, nvm aliases, ਅਤੇ ਗਲੋਬਲ ਪਰਮਿਸ਼ਨ ਫਿਕਸਾਂ ਨੂੰ ਕਵਰ ਕਰਨ ਵਾਲੀ ਤਿੰਨ-ਪੰਨੇ ਦੀ readme ਦੀ ਲੋੜ ਨਹੀਂ ਹੁੰਦੀ। ਉਹ Docker ਇੰਸਟਾਲ ਕਰਦੇ ਹਨ, ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਕਲੋਨ ਕਰਦੇ ਹਨ, ਅਤੇ ਇੱਕ ਕਮਾਂਡ ਚਲਾਉਂਦੇ ਹਨ। ਇੱਕ ਸੈੱਟਅੱਪ ਜਿਸ ਵਿੱਚ ਪਹਿਲਾਂ ਇੱਕ ਦੁਪਹਿਰ ਲੱਗ ਜਾਂਦੀ ਸੀ, ਹੁਣ ਮਿੰਟਾਂ ਵਿੱਚ ਸਮਾ ਜਾਂਦਾ ਹੈ। ਅਤੇ ਜਦੋਂ ਉਹ ਪ੍ਰੋਜੈਕਟ ਬਦਲਦੇ ਹਨ, ਤਾਂ ਕੁਝ ਵੀ ਪਿੱਛੇ ਨਹੀਂ ਰਹਿ ਜਾਂਦਾ। ਕੋਈ ਬੇਕਾਰ ਪਏ ਗਲੋਬਲ ਟੂਲ ਨਹੀਂ। PATH ਦੀ ਤਰਜੀਹ ਲਈ ਲੜਦੇ ਹੋਏ ਕੋਈ ਵਰਜ਼ਨ ਮੈਨੇਜਰ ਨਹੀਂ। ਉਹਨਾਂ ਦੀ ਲੋਕਲ ਮਸ਼ੀਨ ਸਾਫ਼ ਰਹਿੰਦੀ ਹੈ।

ਇਮੇਜਿਸ ਅਤੇ ਕੰਟੇਨਰਜ਼: ਬੁਨਿਆਦੀ ਗੱਲਾਂ

ਜੇਕਰ Docker ਤੁਹਾਡੇ ਲਈ ਨਵਾਂ ਹੈ, ਤਾਂ ਇਸਦੀ ਸ਼ਬਦਾਵਲੀ ਸੁਣਨ ਵਿੱਚ ਜਿੰਨੀ ਗੁੰਝਲਦਾਰ ਲੱਗਦੀ ਹੈ, ਉਸ ਤੋਂ ਕਿਤੇ ਜ਼ਿਆਦਾ ਸਰਲ ਹੈ। ਇੱਕ Docker image ਇੱਕ ਬਲੂਪ੍ਰਿੰਟ (blueprint) ਹੈ। ਇਸ ਵਿੱਚ ਤੁਹਾਡਾ ਸੋਰਸ ਕੋਡ, Node.js runtime, ਤੁਹਾਡੀ lockfile, ਅਤੇ ਐਪ ਨੂੰ ਚਲਾਉਣ ਲਈ ਲੋੜੀਂਦੀ ਹਰ ਡਿਪ