Angular ਢਾਂਚਾ ਅਤੇ ਨਿਯਮਾਂ ਨੂੰ ਤਰਜੀਹ ਦਿੰਦਾ ਹੈ ਤਾਂ ਜੋ ਵੱਡੀਆਂ ਟੀਮਾਂ ਰਖ-ਰਖਾਅਯੋਗ ਐਪ ਬਣਾ ਸਕਣ: ਇਕਸਾਰ ਪੈਟਰਨ, ਟੂਲਿੰਗ, TypeScript, Dependency Injection, ਅਤੇ ਸਕੇਲ ਯੋਗ ਆਰਕੀਟੈਕਚਰ।

Angular ਨੂੰ ਅਕਸਰ opinionated ਕਿਹਾ ਜਾਂਦਾ ਹੈ। ਫਰੇਮਵਰਕ ਦੇ ਤੌਰ 'ਤੇ, ਇਸਦਾ ਮਤਲਬ ਇਹ ਨਹੀਂ ਕਿ ਇਹ ਸਿਰਫ਼ ਨਿਰਮਾਣ ਬਲਾਕ ਦਿੰਦਾ ਹੈ—ਇਹ ਇਹ ਵੀ ਸੁਝਾਅ ਦੇਂਦਾ ਹੈ (ਅਤੇ ਕਈ ਵਾਰੀ ਲਾਗੂ ਵੀ ਕਰਦਾ ਹੈ) ਕਿ ਉਨ੍ਹਾਂ ਨੂੰ ਕਿਸ ਤਰ੍ਹਾਂ ਜੋੜਨਾ ਚਾਹੀਦਾ ਹੈ। ਤੁਹਾਨੂੰ ਕੁਝ ਫਾਈਲ ਲੇਆਉਟ, ਪੈਟਰਨ, ਟੂਲਿੰਗ ਅਤੇ ਰਿਵਾਜਾਂ ਵੱਲ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਕਿ ਵੱਖ-ਵੱਖ ਟੀਮਾਂ ਵੱਲੋਂ ਬਣੇ ਦੋ Angular ਪ੍ਰੋਜੈਕਟਾਂ ਵਿੱਚ ਇੱਕ ਦੋਹਾਂ-ਜਿਹੀ ਮਹਿਸੂਸ ਹੁੰਦੀ ਹੈ।
Angular ਦੀਆਂ ਰਾਇਆਂ ਇਹਨਾਂ ਗੱਲਾਂ ਵਿੱਚ ਨਜ਼ਰ ਆਉਂਦੀਆਂ ਹਨ ਕਿ ਤੁਸੀਂ ਕੰਪੋਨੈਂਟ ਕਿਵੇਂ ਬਣਾਉਂਦੇ ਹੋ, ਫੀਚਰ ਕਿਵੇਂ ਆਯੋਜਿਤ ਕਰਦੇ ਹੋ, Dependency Injection ਮੂਲ ਰੂਪ ਵਿੱਚ ਕਿਵੇਂ ਵਰਤੀ ਜਾਂਦੀ ਹੈ, ਅਤੇ ਰੂਟਿੰਗ ਆਮ ਤੌਰ 'ਤੇ ਕਿਵੇਂ ਕੰਫਿਗਰ ਹੁੰਦੀ ਹੈ। ਕਈ ਮੁਕਾਬਲائی ਤਰੀਕਿਆਂ ਵਿੱਚੋਂ ਚੁਣਨ ਦੀ ਬਜਾਏ, Angular ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ ਚੋਣਾਂ ਦੀ ਗਿਣਤੀ ਘਟਾ ਦਿੰਦਾ ਹੈ।
ਇਹ ਟਰੇਡ-ਆਫ ਜਾਣਜੋਗ ਹੈ:
ਛੋਟੇ ਐਪ ਤਜਰਬੇਬਾਜ਼ੀ ਠੀਕ ਠਾਕ ਬਰਦਾਸ਼ਤ ਕਰ ਲੈਂਦੇ ਹਨ: ਵੱਖ-ਵੱਖ ਕੋਡਿੰਗ ਅੰਦਾਜ਼, ਅਸਲ ਹੀ ਵੱਖ-ਵੱਖ ਲਾਇਬ੍ਰੇਰੀਆਂ, ਜਾਂ ਅਡ-ਹਾਕ ਪੈਟਰਨ ਜੋ ਸਮੇਂ ਦੇ ਨਾਲ ਵਿਕਸਿਤ ਹੁੰਦੇ ਹਨ। ਵੱਡੇ Angular ਐਪ—ਖਾਸ ਕਰਕੇ ਜਿਹੜੇ ਸਾਲਾਂ ਤੱਕ ਮੈਨਟੇਨ ਕੀਤੇ ਜਾਂਦੇ ਹਨ—ਉਸ ਲਚਕੀਲੇਪਣ ਲਈ ਵੱਡੀ ਕੀਮਤ ਚੁਕਾਉਂਦੇ ਹਨ। ਵੱਡੇ ਕੋਡਬੇਸ ਵਿੱਚ ਸਭ ਤੋਂ ਮੁਸ਼ਕਲ ਸਮੱਸਿਆਵਾਂ ਆਮ ਤੌਰ 'ਤੇ ਕੋਆਰਡਿਨੇਸ਼ਨ ਦੀਆਂ ਹੁੰਦੀਆਂ ਹਨ: ਨਵੇਂ ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਆਨਬੋਰਡ ਕਰਨਾ, ਪਲ ਰਿਕਵੈਸਟ ਤੇਜ਼ੀ ਨਾਲ ਸਮੀਖਿਆ ਕਰਨੀ, ਸੁਰੱਖਿਅਤ ਤਰੀਕੇ ਨਾਲ ਰੀਫੈਕਟਰ ਕਰਨਾ, ਅਤੇ ਡਜੀਨ ਤੇ ਦਰਜਨ ਫੀਚਰਾਂ ਨੂੰ ਇਕੱਠੇ ਚਲਾਉਣਾ।
Angular ਦਾ ਢਾਂਚਾ ਇਹਨਾਂ ਗਤਿਵਿਧੀਆਂ ਨੂੰ ਪੇਸ਼ਗੀ ਬਣਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਪੈਟਰਨ ਇਕਸਾਰ ਹੁੰਦੇ ਹਨ, ਟੀਮਾਂ ਵਿਸ਼ਵਾਸ ਪੂਰਵਕ ਫੀਚਰਾਂ ਵਿੱਚ ਘੁੰਮ ਸਕਦੀਆਂ ਹਨ ਅਤੇ ਪ੍ਰੋਡਕਟ ਕੰਮ 'ਤੇ ਜ਼ਿਆਦਾ ਧਿਆਨ ਦੇ ਸਕਦੀਆਂ ਹਨ ਨ ਕਿ "ਇਸ ਹਿੱਸੇ ਨੂੰ ਕਿਵੇਂ ਬਣਾਇਆ ਗਿਆ" ਦੁਬਾਰਾ ਸਿੱਖਣ ਵਿੱਚ।
ਬਾਕੀ ਲੇਖ Angular ਦੇ ਢਾਂਚੇ ਦੇ ਸਰੋਤ ਦੀ ਖੋਜ ਕਰਦਾ ਹੈ—ਇਸ ਦੀਆਂ ਆਰਕੀਟੈਕਚਰ ਚੋਣਾਂ (ਕੰਪੋਨੈਂਟ, modules/standalone, DI, ਰੂਟਿੰਗ), ਇਸ ਦੀ ਟੂਲਿੰਗ (Angular CLI), ਅਤੇ ਇਹ ਰਾਇਆਂ ਕਿਵੇਂ ਟੀਮ-ਵਰਕ ਅਤੇ ਲੰਬੇ ਸਮੇਂ ਦੀ ਮੈਨਟੇਨੈਂਸ ਨੂੰ ਸਹਾਰਾ ਦਿੰਦੀਆਂ ਹਨ।
ਛੋਟੇ ਐਪ ਬਹੁਤ ਸਾਰੀਆਂ “ਜੋ ਵੀ ਚਲਦਾ ਹੈ” ਫੈਸਲਿਆਂ ਨੂੰ ਬਰਦਾਸ਼ਤ ਕਰ ਸਕਦੇ ਹਨ। ਵੱਡੇ Angular ਐਪ ਆਮਤੌਰ 'ਤੇ ਨਹੀਂ ਕਰ ਸਕਦੇ। ਜਦੋਂ ਕਈ ਟੀਮਾਂ ਇੱਕੋ ਕੋਡਬੇਸ ਨੂੰ ਛੂਹਦੀਆਂ ਹਨ, ਤ 작은 ਅਸਮਰੂਪਤਾਵਾਂ ਵੱਡੇ ਲਾਗਤਾਂ ਵਿੱਚ ਬਦਲ ਜਾਂਦੀਆਂ ਹਨ: ਡੁਪਲਿਕੇਟ ਯੂਟਿਲਿਟੀਜ਼, ਹਲਕਾ ਫਰਕ ਫੋਲਡਰ ਸਟਰੱਕਚਰ, ਇਕੋ ਕੰਮ ਲਈ ਮੁਕਾਬਲਤੀ ਸਟੇਟ ਪੈਟਰਨ, ਅਤੇ ਇਕੋ API ਐਰਰ ਨੂੰ ਸਾਂਭਣ ਦੇ ਤਿੰਨ ਤਰੀਕੇ।
ਜਿਵੇਂ-ਜਿਵੇਂ ਟੀਮ ਵੱਧਦੀ ਹੈ, ਲੋਕ ਕੁਦਰਤੀ ਤੌਰ 'ਤੇ ਨੇੜੇ ਦਿਖਾਈ ਦੇ ਰਹੇ ਕੋਡ ਦੀ ਨਕਲ ਕਰ ਲੈਂਦੇ ਹਨ। ਜੇ ਕੋਡਬੇਸ ਪਸੰਦੀਦਾ ਪੈਟਰਨ ਸਪਸ਼ਟ ਨਹੀਂ ਦਿਖਾਉਂਦਾ, ਨਤੀਜਾ ਕੋਡ ਡ੍ਰਿਫਟ ਹੁੰਦਾ ਹੈ—ਨਵੇਂ ਫੀਚਰ ਆਖਰੀ ਡਿਵੈਲਪਰ ਦੀਆਂ ਆਦਤਾਂ ਨੂੰ ਫਾਲੋ ਕਰਦੇ ਹਨ, ਨਾ ਕਿ ਇੱਕ ਸਾਂਝੇ ਅਪ੍ਰੋਚ ਨੂੰ।
ਕਨਵੇਂਸ਼ਨਾਂ ਘੱਟ ਫੈਸਲਿਆਂ ਦੀ ਗਿਣਤੀ ਕਰਦੀਆਂ ਹਨ ਜੋ ਹਰ ਫੀਚਰ ਤੇ ਡਿਵੈਲਪਰ ਨੂੰ ਲੈਣੀ ਪੈਂਦੀ ਹੈ। ਇਸ ਨਾਲ ਆਨਬੋਰਡਿੰਗ ਟਾਈਮ ਘੱਟ ਹੁੰਦਾ ਹੈ (ਨਵੇਂ ਹਾਇਰ "Angular ਦਾ ਤਰੀਕਾ" ਤੇਜ਼ੀ ਨਾਲ ਰੀਪ ਕਰੋ) ਅਤੇ ਸਮੀਖਿਆ ਘਰੜਿਆਂ ਘਟਦੇ ਹਨ (ਘੱਟ ਤਿੱਖੇ ਟਿੱਪਣੀਆਂ ਜਿਵੇਂ "ਇਹ ਸਾਡੇ ਪੈਟਰਨ ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ")।
ਐਂਟਰਪ੍ਰਾਈਜ਼ ਫਰੰਟਐਂਡ ਅਕਸਰ "ਮੁਕੰਮਲ" ਨਹੀਂ ਹੁੰਦੇ। ਉਹ ਮੈਟੇਨੈਂਸ, ਰੀਫੈਕਟਰ, ਰੀਡਿਜ਼ਾਈਨ ਅਤੇ ਲਗਾਤਾਰ ਫੀਚਰ ਚਰਨ ਰਾਹੀਂ ਜੀਉਂਦੇ ਹਨ। ਇਸ ਮਾਹੌਲ ਵਿੱਚ, ਢਾਂਚਾ ਸੁੰਦਰਤਾ ਨਹੀਂ—ਜਿੰਦਗੀ ਦੀ ਬਚਾਅ ਹੈ:
ਵੱਡੇ ਐਪ ਲਾਜ਼ਮੀ ਤੌਰ 'ਤੇ ਰੂਟਿੰਗ, permissions, ਅੰਤਰਰਾਸ਼ਟਰੀਕਰਨ, ਟੈਸਟਿੰਗ, ਅਤੇ ਬੈਕਐਂਡ ਇੰਟਿਗਰੇਸ਼ਨ ਵਰਗੀਆਂ ਕ੍ਰਾਸ-ਕਟਿੰਗ ਲੋੜਾਂ ਸਾਂਝੀਆਂ ਕਰਦੇ ਹਨ। ਜੇ ਹਰ ਫੀਚਰ ਟੀਮ ਇਹਨਾਂ ਨੂੰ ਵੱਖ-ਵੱਖ ਤਰੀਕੇ ਨਾਲ ਹੱਲ ਕਰਦੀ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਇੰਟਰੈਕਸ਼ਨਾਂ ਦੀ ਡੀਬੱਗਿੰਗ ਕਰਦੇ ਰਹਿ ਜਾਵੋਗੇ ਬਜਾਏ ਪ੍ਰੋਡਕਟ ਬਣਾਉਣ ਦੇ।
Angular ਦੀਆਂ ਰਾਇਆਂ—modules/standalone ਸੀਮਾਵਾਂ, Dependency Injection ਡਿਫਾਲਟ, ਰੂਟਿੰਗ, ਅਤੇ ਟੂਲਿੰਗ ਦੇ ਆਸਪਾਸ—ਇਹਨਾਂ ਚਿੰਤਾਵਾਂ ਨੂੰ ਡਿਫਾਲਟ ਰੂਪ ਵਿੱਚ ਇਕਸਾਰ ਬਣਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੀਆਂ ਹਨ। ਨਤੀਜਾ ਸਿੱਧਾ ਹੈ: ਘੱਟ ਵਿਸ਼ੇਸ਼ ਕੇਸ, ਘੱਟ ਮੁੜਕੰਮ, ਅਤੇ ਸਾਲਾਂ ਦੌਰਾਨ ਸੁਗਮ ਸਹਿਕਾਰ।
Angular ਦੀ ਮੂਲ ਇਕਾਈ ਕੰਪੋਨੈਂਟ ਹੈ: UI ਦਾ ਇੱਕ ਖੁਦ-ਮੁਖਤਾਰ ਹਿੱਸਾ ਜਿਸ ਦੀਆਂ ਸਪਸ਼ਟ ਸੀਮਾਵਾਂ ਹੁੰਦੀਆਂ ਹਨ। ਜਦੋਂ ਇੱਕ ਪ੍ਰੋਡਕਟ ਵੱਡਾ ਹੁੰਦਾ ਹੈ, ਇਹ ਸੀਮਾਵਾਂ ਪੰਨਿਆਂ ਨੂੰ ਉਹਨਾਂ ਵੱਡੀਆਂ ਫਾਈਲਾਂ ਵਿੱਚ ਬਦਲਣ ਤੋਂ ਰੋਕਦੀਆਂ ਹਨ ਜਿੱਥੇ "ਹਰ ਚੀਜ਼ ਹਰ ਚੀਜ਼ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦੀ ਹੈ"। ਕੰਪੋਨੈਂਟ ਇਹ ਸੰਕੇਤ ਦਿੰਦੇ ਹਨ ਕਿ ਕੋਈ ਫੀਚਰ ਕਿੱਥੇ ਹੈ, ਇਹ ਕਿੰਨੀ ਜ਼ਿੰਮੇਵਾਰ ਹੈ (ਟੈਮਪਲੇਟ, ਸਟਾਈਲ, ਬਿਹੇਵੀਅਰ), ਅਤੇ ਇਹ ਕਿਵੇਂ ਦੁਬਾਰਾ ਵਰਤ ਸਕਦੇ ਹਨ।
ਇੱਕ ਕੰਪੋਨੈਂਟ ਇਕ ਟੈਮਪਲੇਟ (HTML ਜੋ ਉਪਭੋਗਤਾਵਾਂ ਨੂੰ ਵੇਖਾਉਂਦਾ ਹੈ) ਅਤੇ ਇੱਕ ਕਲਾਸ (TypeScript ਜੋ ਸਟੇਟ ਅਤੇ ਬਿਹੇਵੀਅਰ ਰੱਖਦਾ ਹੈ) ਵਿੱਚ ਵੰਡਿਆ ਜਾਂਦਾ ਹੈ। ਇਸ ਵਿਭਾਜਨ ਨਾਲ ਪ੍ਰਸਤੁਤੀ ਅਤੇ ਲੋਜਿਕ ਦੇ ਵਿਚਕਾਰ ਸਾਫ਼ ਵੰਡ ਹੋਂਦੀ ਹੈ:
// user-card.component.ts
@Component({ selector: 'app-user-card', templateUrl: './user-card.component.html' })
export class UserCardComponent {
@Input() user!: { name: string };
@Output() selected = new EventEmitter<void>();
onSelect() { this.selected.emit(); }
}
<!-- user-card.component.html -->
<h3>{{ user.name }}</h3>
<button (click)="onSelect()">Select</button>
Angular ਇੱਕ ਸਿੱਧੇ ਸੰਚਾਰ ਦਾ ਢਾਂਚਾ ਪ੍ਰੋਮੋਟ ਕਰਦਾ ਹੈ:
@Input() ਪੇਰੈਂਟ ਤੋਂ ਚਾਈਲਡ ਵੱਲ ਡਾਟਾ ਭੇਜਦਾ ਹੈ।@Output() ਚਾਈਲਡ ਤੋਂ ਪੇਰੈਂਟ ਵੱਲ ਸਮਾਗਮ ਭੇਜਦਾ ਹੈ।ਇਹ ਰਿਵਾਜ ਵੱਡੇ Angular ਐਪਾਂ ਵਿੱਚ ਡੇਟਾ ਫਲੋ ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਸਮਝਣਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਕੰਪੋਨੈਂਟ ਨੂੰ ਖੋਲ੍ਹਦੇ ਹੋ, ਤੁਸੀਂ ਤੁਰੰਤ ਪਛਾਣ ਸਕਦੇ ਹੋ:
ਕੰਪੋਨੈਂਟ ਜਦ ਇੱਕਸਾਰ ਪੈਟਰਨ (ਸੈਲੇਕਟਰ, ਫਾਈਲ ਨేమਿੰਗ, ਡੈਕੋਰੇਟਰ, ਬਾਈਂਡਿੰਗ) ਫਾਲੋ ਕਰਦੇ ਹਨ, ਤਾਂ ਡਿਵੈਲਪਰਾਂ ਲਈ ਢਾਂਚਾ ਇਕ ਨਜ਼ਰ ਵਿੱਚ ਪਹਚਾਣਯੋਗ ਹੋ ਜਾਂਦਾ ਹੈ। ਇਹ ਸਾਂਝੀ "ਆਕਾਰ" ਹੇਡੋਵਰ ਘੰਟਾ ਘਟਾਉਂਦੀ ਹੈ, ਸਮੀਖਿਆ ਤੇਜ਼ ਕਰਦੀ ਹੈ, ਅਤੇ ਰੀਫੈਕਟਰਿੰਗ ਨੂੰ ਸੁਰੱਖਿਅਤ ਬਣਾਉਂਦੀ—ਬਿਨਾਂ ਹਰ ਕਿਸੇ ਨੂੰ ਹਰ ਫੀਚਰ ਲਈ ਅਲੱਗ ਕਸਟਮ ਨਿਯਮ ਯਾਦ ਕਰਨ ਦੀ ਲੋੜ ਪੈਣ ਦੇ।
ਜਿਵੇਂ-ਜਿਵੇਂ ਐਪ ਵਧਦਾ ਹੈ, ਸਭ ਤੋਂ ਮੁਸ਼ਕਲ ਸਮੱਸਿਆ ਅਕਸਰ ਨਵਾਂ ਫੀਚਰ ਲਿਖਣਾ ਨਹੀਂ ਹੁੰਦੀ—ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਉਸਨੂੰ ਕਿੱਥੇ ਰੱਖਿਆ ਜਾਵੇ ਅਤੇ ਕਿਸ ਦੀ ਮਾਲਕੀ ਹੈ ਇਹ ਸਮਝਣਾ। Angular ਢਾਂਚੇ ਵਿੱਚ ਜ਼ੋਰ ਦਿੰਦਾ ਹੈ ਤਾਂ ਕਿ ਟੀਮਾਂ ਬਿਨਾਂ ਲਗਾਤਾਰ ਨਿਯਮਾਂ ਦੀ ਪੁਨਰ-ਚਰਚਾ ਕੀਤੇ ਅੱਗੇ ਵੱਧ ਸਕਣ।
ਇਤਿਹਾਸਕ ਤੌਰ 'ਤੇ, NgModules ਸੰਬੰਧਤ ਕੰਪੋਨੈਂਟ, ਡਾਇਰੈਕਟਿਵ ਅਤੇ ਸਰਵਿਸਜ਼ ਨੂੰ ਇੱਕ ਫੀਚਰ ਬਾਊਂਡਰੀ ਵਿੱਚ ਗਰੁੱਪ ਕਰਦੇ ਸਨ (ਉਦਾਹਰਨ ਲਈ OrdersModule)। ਆਧੁਨਿਕ Angular standalone components ਨੂੰ ਭੀ ਸਹਾਰੇ ਦਿੰਦਾ ਹੈ, ਜੋ NgModules ਦੀ ਲੋੜ ਘਟਾਉਂਦੇ ਹੋਏ ਵੀ ਰੂਟਿੰਗ ਅਤੇ ਫੋਲਡਰ ਸਟਰੱਕਚਰ ਰਾਹੀਂ ਸਪਸ਼ਟ ਫੀਚਰ ਸਲਾਈਸ ਉਤਪੰਨ ਕਰਦੇ ਹਨ।
ਦੋਹਾਂ ਦਾ ਹੇਠਾਂ ਉਦੇਸ਼ ਇੱਕੋ ਹੈ: ਫੀਚਰਾਂ ਨੂੰ ਖੋਜਯੋਗ ਬਣਾਉਣਾ ਅਤੇ ਨਿਰਣਤ dependencies ਰੱਖਣਾ।
ਇੱਕ ਆਮ ਸਕੇਲਬਲ ਪੈਟਰਨ ਫੀਚਰ ਅਨੁਸਾਰ ਆਯੋਜਨ ਹੈ ਨਾ ਕਿ ਕਿਸਮ ਅਨੁਸਾਰ:
features/orders/ (ਪੰਨੇ, ਕੰਪੋਨੈਂਟ, ਸਰਵਿਸਜ਼ ਜੋ orders ਨਾਲ ਸਬੰਧਿਤ ਹਨ)features/billing/features/admin/ਜਦੋਂ ਹਰ ਫੀਚਰ ਫੋਲਡਰ ਵਿੱਚ ਜ਼ਰੂਰੀ ਚੀਜ਼ਾਂ ਹੋਂਦੀਆਂ ਹਨ, ਇੱਕ ਡਿਵੈਲਪਰ ਇਕ ਡਾਇਰੈਕਟਰੀ ਖੋਲ੍ਹ ਕੇ ਤੇਜ਼ੀ ਨਾਲ ਸਮਝ ਸਕਦਾ ਹੈ ਕਿ ਉਹ ਖੇਤਰ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ। ਇਹ ਟੀਮ ਮਾਲਕੀ ਨਾਲ ਵੀ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ: “Orders ਟੀਮ features/orders ਹੇਠਾਂ ਦੀਆਂ ਚੀਜ਼ਾਂ ਦੀ ਮਾਲਿਕ ਹੈ।”
Angular ਟੀਮਾਂ ਆਮ ਤੌਰ 'ਤੇ ਦੁਹਰਾਏ ਜਾਣ ਵਾਲੇ ਕੋਡ ਨੂੰ ਤਿੰਨ ਹਿੱਸਿਆਂ ਵਿੱਚ ਵੰਡਦੀਆਂ ਹਨ:
ਆਮ ਗਲਤੀ ਇਹ ਹੈ ਕਿ shared/ ਨੂੰ ਸਾਰੇ ਕੁਝ ਪਾਉਣ ਲਈ ਇੱਕ ਥੈਲਾ ਬਣਾ ਦਿੱਤਾ ਜਾਵੇ। ਜੇ "shared" ਸਭ ਕੁਝ ਇੰਪੋਰਟ ਕਰਦਾ ਹੈ ਅਤੇ ਹਰ ਕੋਈ "shared" ਨੂੰ ਇੰਪੋਰਟ ਕਰਦਾ ਹੈ, ਤਾਂ dependencies ਗੁੰਝਲਦਾਰ ਹੋ ਜਾਂਦੀਆਂ ਹਨ ਅਤੇ ਬਿਲਡ ਸਮਾਂ ਵੱਧ ਜਾਂਦਾ ਹੈ। ਇਕ ਚੰਗੀ ਪਹੁੰਚ ਇਹ ਹੈ ਕਿ shared ਟੁਕੜੇ ਛੋਟੇ, ਕੇਂਦਰਿਤ ਅਤੇ dependency-हलਕੇ ਰੱਖੇ ਜਾਣ।
Module/standalone ਸੀਮਾਵਾਂ, Dependency Injection ਡਿਫਾਲਟ, ਅਤੇ ਰੂਟਿੰਗ-ਅਧਾਰਤ ਫੀਚਰ ਐਂਟਰੀ ਪੌਇੰਟਸ ਦੇ ਵਿੱਚਕਾਰ, Angular ਕੁਦਰਤੀ ਤੌਰ 'ਤੇ ਟੀਮਾਂ ਨੂੰ ਇਕ ਪੇਸ਼ਗੀ ਫੋਲਡਰ ਲੇਆਉਟ ਅਤੇ ਸਪਸ਼ਟ dependency ਗ੍ਰਾਫ ਵੱਲ ਧਕਦਾ ਹੈ—ਇਹ ਵੱਡੇ Angular ਐਪ ਲਈ ਕੁੰਜੀ ਉਂਗਰੀਆਂ ਹਨ ਜੋ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਮੈਨਟੇਨ ਯੋਗ ਰਹਿੰਦੇ ਹਨ।
Angular ਦੀ Dependency Injection (DI) ਕੋਈ ਵਿਕਲਪੀ ਐਡੀ-ਅਨ ਨਹੀਂ—ਇਹ ਤੁਹਾਡੇ ਐਪ ਨੂੰ ਜੁੜਨ ਦਾ ਉਮੀਦ ਕੀਤਾ ਗਿਆ ਤਰੀਕਾ ਹੈ। ਕੰਪੋਨੈਂਟਾਂ ਵੱਲੋਂ ਆਪਣੇ ਸਹਾਇਕ ਬਣਾਉਣ ਦੀ ਬਜਾਏ (new ApiService()), ਉਹ ਆਪਣੀਆਂ ਲੋੜਾਂ ਮੰਗਦੇ ਹਨ ਅਤੇ Angular ਠੀਕ ਇੰਸਟੈਂਸ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ। ਇਸ ਨਾਲ UI (ਕੰਪੋਨੈਂਟ) ਅਤੇ ਬਿਹੇਵੀਅਰ (ਸਰਵਿਸ) ਵਿਚਕਾਰ ਸਾਫ਼ ਵੰਡ ਹੋਣ ਦੀ ਪ੍ਰੇਰਣਾ ਮਿਲਦੀ ਹੈ।
DI ਵੱਡੇ ਕੋਡਬੇਸਾਂ ਵਿੱਚ ਤਿੰਨ ਮੁੱਖ ਚੀਜ਼ਾਂ ਆਸਾਨ ਕਰਦੀ ਹੈ:
ਕਿoਂਕਿ ਨਿਰਭਰਤਾਵਾਂ ਕਨਸਟਰਕਟਰਾਂ ਵਿੱਚ ਘੋਸ਼ਿਤ ਹੁੰਦੀਆਂ ਹਨ, ਤੁਸੀਂ ਤੇਜ਼ੀ ਨਾਲ ਦੇਖ ਸਕਦੇ ਹੋ ਕਿ ਕਿਸ ਇੱਕ ਕਲਾਸ ਨੂੰ ਕੀ ਲੋੜ ਹੈ—ਜਦ ਰੀਫੈਕਟਰਿੰਗ ਜਾਂ ਅਣਜਾਣ ਕੋਡ ਦੀ ਸਮੀਖਿਆ ਕੀਤੀ ਜਾ ਰਹੀ ਹੋਵੇ ਤਾਂ ਇਹ ਫਾਇਦੇਮੰਦ ਹੁੰਦਾ ਹੈ।
ਕਿੱਥੇ ਤੁਸੀਂ ਇੱਕ ਸਰਵਿਸ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹੋ ਉਸਨੂੰ ਇਸ ਦੀ ਲਾਈਫਟਾਈਮ ਨਿਰਧਾਰਿਤ ਕਰਦੀ ਹੈ। root ਵਿੱਚ ਪ੍ਰਦਾਨ ਕੀਤੀ ਸਰਵਿਸ (ਉਦਾਹਰਨ ਲਈ, providedIn: 'root') ਐਪ-ਵਿਆਪਕ ਸਿੰਗਲਟਨ ਵਾਂਗ ਕੰਮ ਕਰਦੀ ਹੈ—ਕ੍ਰਾਸ-ਕਟਿੰਗ ਚਿੰਤਾਵਾਂ ਲਈ ਵਧੀਆ, ਪਰ ਜੇ ਇਹ ਸ਼ਾਂਤੀ ਨਾਲ ਸਟੇਟ ਇਕੱਠਾ ਕਰਨ ਲੱਗੀ ਤਾਂ ਖਤਰਨਾਕ ਹੋ ਸਕਦਾ ਹੈ।
ਫੀਚਰ-ਸਤਰ ਦੇ ਪ੍ਰੋਵਾਈਡਰ ਉਸ ਫੀਚਰ (ਜਾਂ ਰੂਟ) ਲਈ ਸਕੋਪ ਕੀਤੇ ਇੰਸਟੈਂਸ ਬਣਾਉਂਦੇ ਹਨ, ਜੋ ਅਚਾਨਕ ਸਾਂਝੇ ਸਟੇਟ ਤੋਂ ਬਚਾਉਂਦੇ ਹਨ। ਮੂਲ ਗੱਲ ਇਹ ਹੈ ਕਿ ਨਿਰਣੈਤ ਹੋਵੋ: stateful ਸਰਵਿਸਾਂ ਦੀ ਸਪਸ਼ਟ ਮਾਲਕੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ, ਅਤੇ “ਮਿਸਟਰੀ ਗਲੋਬਲ” ਤੋਂ ਬਚਣਾ ਚਾਹੀਦਾ ਹੈ ਜੋ ਸਿਰਫ਼ ਸਿੰਗਲਟਨ ਹੋਣ ਕਰਕੇ ਡਾਟਾ ਸਟੋਰ ਕਰ ਲੈਂਦਾ ਹੈ।
ਆਮ ਤੌਰ 'ਤੇ DI-ਫ੍ਰੈਂਡਲੀ ਸਰਵਿਸਜ਼ ਵਿੱਚ ਸ਼ਾਮਲ ਹਨ API/data access (HTTP calls ਨੂੰ ਐਨਕੈਪਸुलेਟ ਕਰਨਾ), auth/session (ਟੋਕਨ, ਯੂਜ਼ਰ ਸਟੇਟ), ਅਤੇ logging/telemetry (ਕੇਂਦਰੀ ਐਰਰ ਰਿਪੋਰਟਿੰਗ)। DI ਇਹਨਾਂ ਚਿੰਤਾਵਾਂ ਨੂੰ ਇਕਸਾਰ ਰੱਖਦਾ ਹੈ ਬਿਨਾਂ ਕੰਪੋਨੈਂਟਾਂ ਦੇ ਨਾਲ ਘੁੰਝਲਦਾਰ ਕਰਨ ਦੇ।
Angular ਰੂਟਿੰਗ ਨੂੰ ਐਪ ਡਿਜ਼ਾਈਨ ਦਾ ਮੁੱਖ ਭਾਗ ਮੰਨਦਾ ਹੈ, ਨਾ ਕਿ ਬਾਅਦ ਦੀ ਸੋਚ। ਇਹ ਰਾਇ ਮਹੱਤਵਪੂਰਨ ਹੁੰਦੀ ਹੈ ਜਦੋਂ ਐਪ ਕੁਝ ਸਕ੍ਰੀਨਾਂ ਤੋਂ ਬਹੁਤ ਵੱਧ ਹੋ ਜਾਵੇ: ਨੈਵੀਗੇਸ਼ਨ ਇੱਕ ਸਾਂਝਾ ਐਗਰੀਮੈਂਟ ਬਣ ਜਾਂਦਾ ਹੈ ਜਿਸ 'ਤੇ ਹਰ ਟੀਮ ਅਤੇ ਫੀਚਰ ਨਿਰਭਰ ਕਰਦੇ ਹਨ। ਕੇਂਦਰਿਤ Router, ਇਕਸਾਰ URL ਪੈਟਰਨ, ਅਤੇ ਡਿਕਲੇਰੇਟਿਵ ਰੁਟ ਕੰਫਿਗਰੇਸ਼ਨ ਨਾਲ ਇਹ ਸਮਝਣਾ ਆਸਾਨ ਹੁੰਦਾ ਹੈ ਕਿ “ਤੁਸੀਂ ਕਿੱਥੇ ਹੋ” ਅਤੇ ਵਰਤੋਂਕਾਰ ਜਦ ਘੁੰਮਦਾ ਹੈ ਤਾਂ ਕੀ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।
Lazy loading Angular ਨੂੰ ਫੀਚਰ ਕੋਡ ਕਿਸੇ ਰੇਸ਼ਾ 'ਤੇ ਹੀ ਲੋਡ ਕਰਨ ਦਿੰਦਾ ਹੈ ਜਦ ਯੂਜ਼ਰ ਉਹਥੇ ਨੈਵੀਗੇਟ ਕਰਦਾ ਹੈ। ਫਾਇਦਾ ਤੁਰੰਤ ਪ੍ਰਦਰਸ਼ਨ ਹੈ: ਛੋਟੇ ਸ਼ੁਰੂਆਤੀ ਬੰਡਲ, ਤੇਜ਼ स्टਾਰਟਅਪ, ਅਤੇ ਘੱਟ ਰਿਸੋਰਸਜ਼ ਜਿਹੜੇ ਉਹ ਯੂਜ਼ਰ ਡਾਊਨਲੋਡ ਕਰਦਾ ਹੈ ਜੋ ਕੁਝ ਖੇਤਰ ਕਦੇ ਨਹੀਂ ਵੇਖਦਾ।
ਲੰਬੇ ਸਮੇਂ ਦਾ ਫਾਇਦਾ sangਠਨਾਤਮਕ ਹੈ। ਜਦੋਂ ਹਰ ਮੱਖ ਫੀਚਰ ਦੀ ਆਪਣੀ ਰੂਟ ਐਂਟਰੀ ਹੁੰਦੀ ਹੈ, ਤੁਸੀਂ ਟੀਮਾਂ ਵਿਚਕਾਰ ਕੰਮ ਵੰਡ ਸਕਦੇ ਹੋ ਅਤੇ ਹਰ ਟੀਮ ਆਪਣੀ ਖੇਤਰਕੋਡ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ ਬਿਨਾਂ ਗਲੋਬਲ ਐਪ ਵਾਇਰਿੰਗ ਨੂੰ ਬਾਰ-ਬਾਰ ਛੂਹਦਿਆਂ—ਇਸ ਨਾਲ ਮੇਰਜ ਕਾਨਫ਼ਲਿਕਟ ਤੇ ਅਣਚਾਹੇ coupling ਘਟਦੇ ਹਨ।
ਵੱਡੇ ਐਪਾਂ ਨੂੰ ਅਕਸਰ ਨੈਵੀਗੇਸ਼ਨ ਦੇ ਆਏ ਕਈ ਨਿਯਮ ਲੋੜ ਹੁੰਦੇ ਹਨ: authentication, authorization, unsaved changes, feature flags, ਜਾਂ ਲੋੜੀਂਦਾ ਸੰਦਰਭ। Angular ਰੂਟ ਗਾਰਡ ਇਹਨਾਂ ਨਿਯਮਾਂ ਨੂੰ ਰੂਟ ਸਤਰ 'ਤੇ ਸਪਸ਼ਟ ਬਣਾਉਂਦੇ ਹਨ ਨ ਕਿ ਕੰਪੋਨੈਂਟਾਂ ਵਿੱਚ ਵੰਡਿਆ ਹੋਇਆ।
Resolvers ਰੂਟ ਐਕਟਿਵੇਸ਼ਨ ਤੋਂ ਪਹਿਲਾਂ ਲੋੜੀਂਦਾ ਡੇਟਾ ਲੈ ਕੇ ਆਉਂਦੇ ਹਨ, ਜੋ ਸਕਰੀਨਾਂ ਨੂੰ ਅੱਧ-ਤੈਯਾਰ ਸਥਿਤੀਆਂ 'ਚ ਰੇਂਡਰ ਹੋਣ ਤੋਂ ਰੋਕਦਾ ਹੈ ਅਤੇ ਇਹ ਪਤਾ ਲਗਾਉਂਦਾ ਹੈ ਕਿ "ਇਸ ਪੇਜ਼ ਲਈ ਕਿਹੜਾ ਡੇਟਾ ਲਾਜ਼ਮੀ ਹੈ"—ਇਹ ਉਦਯੋਗਿਕ ਮੈਨਟੇਨੈਂਸ ਅਤੇ ਆਨਬੋਰਡਿੰਗ ਲਈ ਕਾਰਗਰ ਹੈ।
ਇੱਕ ਸਕੇਲ-ਅਨੁਕੂਲ ਪਹੁੰਚ ਫੀਚਰ-ਅਧਾਰਤ ਰੂਟਿੰਗ ਹੈ:
/admin, /billing, /settings) ਰੱਖੋ।ਇਹ ਢਾਂਚਾ ਲਗਾਤਾਰ URL ਇਕਸਾਰਤਾ, ਸਪਸ਼ਟ ਸੀਮਾਵਾਂ, ਅਤੇ ਇੰਕ੍ਰੀਮੈਂਟਲ ਲੋਡਿੰਗ ਨੂੰ ਬੜਾਵਾ ਦਿੰਦਾ—ਉਹੀ ਤਰ੍ਹਾਂ ਦਾ ਢਾਂਚਾ ਜੋ ਵੱਡੇ Angular ਐਪਾਂ ਨੂੰ ਸਮੇਂ ਦੇ ਨਾਲ ਅਸਾਨੀ ਨਾਲ ਵਿਕਸਤ ਕਰਨ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ।
Angular ਦਾ TypeScript ਨੂੰ ਡਿਫਾਲਟ ਬਣਾਉਣਾ ਸਿਰਫ਼ ਸਿੰਟੈਕਸ ਦੀ ਪਸੰਦ ਨਹੀਂ—ਇਹ ਇਸ ਗੱਲ ਦੀ ਰਾਇ ਹੈ ਕਿ ਵੱਡੇ ਐਪ ਕਿਵੇਂ ਵਿਕਸਤ ਹੋਣ ਚਾਹੀਦے ਹਨ। ਜਦੋਂ ਦਹਾਂਆਂ ਲੋਕ ਸਾਲਾਂ ਦੇ ਦੌਰਾਨ ਇੱਕੋ ਕੋਡਬੇਸ ਛੂਹਦੇ ਹਨ, "ਹੁਣ ਠੀਕ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ" ਕਾਫੀ ਨਹੀਂ ਹੁੰਦਾ। TypeScript ਤੁਹਾਨੂੰ ਆਪਣੀ ਕੋਡ ਦੀ ਉਮੀਦ ਦਰਸਾਉਣ ਲਈ ਧੱਕਦਾ ਹੈ, ਤਾਂ ਜੋ ਬਦਲਾਅ ਬਿਨਾਂ ਅਣਜਾਣ ਟੁੱਟਣ ਦੇ ਆਸਾਨ ਹੋ ਜਾਣ।
ਡਿਫਾਲਟ ਰੂਪ ਵਿੱਚ, Angular ਪ੍ਰੋਜੈਕਟ ਇਸ ਤਰ੍ਹਾਂ ਸੈਟ ਹੁੰਦੇ ਹਨ ਕਿ ਕੰਪੋਨੈਂਟ, ਸਰਵਿਸਜ਼ ਅਤੇ APIs ਦੇ ਸਪਸ਼ਟ ਸ਼ੇਪ ਹੁੰਦੇ ਹਨ। ਇਹ ਟੀਮਾਂ ਨੂੰ ਪ੍ਰੇਰਿਤ ਕਰਦਾ ਹੈ:
ਇਹ ਢਾਂਚਾ ਕੋਡਬੇਸ ਨੂੰ ਸਕ੍ਰਿਪਟਾਂ ਦੇ ਸੰਗ੍ਰਹਿ ਦੀ ਤਰ੍ਹਾਂ ਨਹੀਂ ਲੱਗਣ ਦਿੰਦਾ, ਸਗੋਂ ਇੱਕ ਐਪ ਜਿਵੇਂ ਮਹਿਸੂਸ ਕਰਾਂਦਾ ਹੈ ਜਿਸ ਦੀਆਂ ਸਪਸ਼ਟ ਸੀਮਾਵਾਂ ਹਨ।
TypeScript ਦਾ ਅਸਲੀ ਮੁੱਲ ਐਡੀਟਰ ਸਹਾਇਤਾ ਵਿੱਚ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ। ਟਾਈਪ ਹੋਣ ਨਾਲ, IDE ਭਰੋਸੇਯੋਗ autocomplete ਦੇ ਸਕਦਾ ਹੈ, ਰਨਟਾਈਮ ਤੋਂ ਪਹਿਲਾਂ ਗਲਤੀਆਂ ਪਕੜ ਸਕਦਾ ਹੈ, ਅਤੇ ਜ਼ਿਆਦਤਰੀਨ ਸੁਰੱਖਿਅਤ ਰੀਫੈਕਟਰ ਕਰਨ ਵਿਚ ਮਦਦ ਕਰਦਾ ਹੈ।
ਉਦਾਹਰਨ ਵਜੋਂ, ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਸਾਂਝੇ ਮਾਡਲ ਵਿੱਚ ਇੱਕ ਫੀਲਡ ਦਾ ਨਾਮ ਬਦਲਦੇ ਹੋ, ਟੂਲਿੰਗ ਟੈਮਪਲੇਟਾਂ, ਕੰਪੋਨੈਂਟਾਂ, ਅਤੇ ਸਰਵਿਸਜ਼ ਵਿੱਚ ਹਰ ਰੇਫਰੈਂਸ ਲੱਭ ਸਕਦੀ ਹੈ—ਇਸ ਨਾਲ "ਖੋਜ ਅਤੇ ਉਮੀਦ" ਧੰਗ ਘਟਦਾ ਹੈ ਜੋ ਅਕਸਰ ਛੁੱਟੇ ਹੋਏ ਕੇਸ ਛੱਡ ਦਿੰਦਾ ਹੈ।
ਵੱਡੇ ਐਪ ਲਗਾਤਾਰ ਬਦਲਦੇ ਰਹਿੰਦੇ ਹਨ: ਨਵੇਂ ਲੋੜ, API ਸੁਧਾਰ, ਫੀਚਰ ਮੁੜ-ਸੰਗਠਨ, ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਕੰਮ। ਟਾਈਪਸ ਗਾਰਡਰੇਲ ਵਾਂਗ ਕੰਮ ਕਰਦੀਆਂ ਹਨ ਜਦ ਇਹ ਬਦਲਾਅ ਹੁੰਦੇ ਹਨ। ਜਦੋਂ ਕੁਝ ਉਮੀਦ ਕੀਤੀ ਗਈ ਸਹਿਮਤੀ ਨਾਲ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ, ਤੁਸੀਂ ਵਿਕਾਸ ਜਾਂ CI ਦੌਰਾਨ ਪਤਾ ਲਗਾਉਂਦੇ ਹੋ—ਨ ਕਿ ਉਪਭੋਗਤਾ ਕਿਸੇ ਕਮੀਨ ਰਾਹ 'ਤੇ ਪਹੁੰਚ ਕੇ।
ਟਾਈਪਸ ਸਹੀ ਲੋਜਿਕ, ਬਿਹਤਰੀਨ UX, ਜਾਂ ਪੂਰੀ ਵੈਲਿਡੇਸ਼ਨ ਦੀ ਗਾਰੰਟੀ ਨਹੀਂ ਦਿੰਦੇ। ਪਰ ਉਹ ਟੀਮ ਸੰਚਾਰ ਨੂੰ ਬਹੁਤ ਸੁਧਾਰਦੇ ਹਨ: ਕੋਡ ਖੁਦ ਇਰਾਦਾ ਦੱਸਦਾ ਹੈ। ਨਵੇਂ ਸਾਥੀ ਸਮਝ ਸਕਦੇ ਹਨ ਕਿ ਕੋਈ ਸਰਵਿਸ ਕੀ ਰੀਟਰਨ ਕਰਦੀ ਹੈ, ਕੋਈ ਕੰਪੋਨੈਂਟ ਕੀ ਲੋੜ ਰੱਖਦਾ ਹੈ, ਅਤੇ "ਵੈਧ ਡੇਟਾ" ਕੀ ਹੈ—ਬਿਨਾਂ ਹਰ ਇੰਪਲੀਮੇੰਟੇਸ਼ਨ ਵੇਰਵਾ ਪੜ੍ਹਨ ਦੇ।
Angular ਦੀਆਂ ਰਾਇਆਂ ਸਿਰਫ਼ ਫਰੇਮਵਰਕ API ਵਿੱਚ ਨਹੀਂ—ਉਹ ਇਸ ਗੱਲ ਵਿੱਚ ਵੀ ਹਨ ਕਿ ਟੀਮਾਂ ਪ੍ਰੋਜੈਕਟ ਬਣਾਉਂਦੀਆਂ, ਬਿਲਡ ਕਰਦੀਆਂ ਅਤੇ ਮੈੰਟੇਨ ਕਰਦੀਆਂ ਹਨ। Angular CLI ਇਸਦਾ ਇਕ ਵੱਡਾ ਕਾਰਨ ਹੈ ਕਿ ਵੱਡੇ Angular ਐਪ ਅਕਸਰ ਵੱਖ-ਵੱਖ ਕੰਪਨੀਆਂ ਵਿੱਚ ਵੀ ਇਕਸਾਰ ਮਹਿਸੂਸ ਹੁੰਦੇ ਹਨ।
ਪਹਿਲੇ ਕਮਾਂਡ ਤੋਂ ਹੀ, CLI ਇੱਕ ਸਾਂਝੀ ਬੇਸਲਾਈਨ ਸੈੱਟ ਕਰਦਾ ਹੈ: ਪ੍ਰੋਜੈਕਟ ਸਟਰੱਕਚਰ, TypeScript ਕੰਫਿਗਰੇਸ਼ਨ, ਅਤੇ ਸੁਝਾਏ ਗਏ ਡਿਫਾਲਟ। ਇਹ ਹਰ روزਮਰਾ ਟਾਸਕਾਂ ਲਈ ਇੱਕ ਇਕਸਾਰ ਇੰਟਰਫੇਸ ਵੀ ਦਿੱਂਦਾ ਹੈ:
ਇਹ ਸਥਿਰਤਾ ਇਸ ਲਈ ਮਹੱਤਵਪੂਰਨ ਹੈ ਕਿਉਂਕਿ ਬਿਲਡ ਪਾਈਪਲਾਈਨ ਆਮ ਤੌਰ 'ਤੇ ਉਹ ਥਾਂ ਹੁੰਦੀ ਹੈ ਜਿੱਥੇ ਟੀਮਾਂ ਵੱਖ-ਵੱਖ ਹੋ ਕੇ "ਸਪੈਸ਼ਲ ਕੇਸ" ਇਕੱਠੇ ਕਰ ਲੈਂਦੀਆਂ ਹਨ। Angular CLI ਨਾਲ, ਇਨ੍ਹਾਂ ਚੋਣਾਂ ਵਿੱਚੋਂ ਬਹੁਤ ਸਾਰੀਆਂ ਇੱਕ ਵਾਰੀ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਅਤੇ ਵਿਆਪਕ ਢੰਗ ਨਾਲ ਸਾਂਝੀਆਂ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ।
ਵੱਡੀਆਂ ਟੀਮਾਂ ਨੂੰ ਰਿਪੀਟੀਬਿਲਟੀ ਚਾਹੀਦੀ ਹੈ: ਹਰ ਲੈਪਟਾਪ ਅਤੇ CI ਵਿੱਚ ਇੱਕੋ ਐਪ ਇਕੋ ਤਰ੍ਹਾਂ ਆਚਰਨ ਕਰੇ। CLI ਇੱਕ ਸਿੰਗਲ ਕੰਫਿਗਰੇਸ਼ਨ ਸਰੋਤ ਨੂੰ ਉਤਸ਼ਾਹਿਤ ਕਰਦਾ ਹੈ (ਉਦਾਹਰਣ ਲਈ, ਬਿਲਡ ਵਿਕਲਪ ਅਤੇ environment-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗਾਂ) ਬਜਾਏ ਕਿ ad-hoc ਸਕ੍ਰਿਪਟਾਂ ਦੇ ਇੱਕ集合 ਦੇ।
ਇਸ ਇਕਸਾਰਤਾ ਨਾਲ "ਮੇਰੇ ਕੰਮ ਤੇ ਠੀਕ ਹੈ" ਵਾਲੀਆਂ ਸਮੱਸਿਆਵਾਂ ਘੱਟ ਹੁੰਦੀਆਂ—ਜਿੱਥੇ ਲੋਕਲ ਸਕ੍ਰਿਪਟ, mismatch Node ਵਰਜਨ, ਜਾਂ ਸ਼ੇਅਰ ਨਾ ਕੀਤੇ ਬਿਲਡ ਫਲੈਗ ਅਜਿਹੀਆਂ ਕੀਟਾਂ ਪੈਦਾ ਕਰਦੇ ਹਨ ਜੋ ਦੁਹਰਾਉਣ ਵੇਲੇ ਮੁਸ਼ਕਲ ਹੁੰਦੀਆਂ ਹਨ।
Angular CLI schematics ਟੀਮਾਂ ਨੂੰ ਇੱਕ ਇਕਸਾਰ ਸ਼ੈਲੀ ਵਿੱਚ ਕੰਪੋਨੈਂਟ, ਸਰਵਿਸ, ਮੌਡੀਊਲ, ਅਤੇ ਹੋਰ ਬਿਲਡਿੰਗ ਬਲਾਕ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਦੇ ਹਨ। ਹਰ ਕੋਈ ਬਾਇਲਰਪਲੇਟ ਹੱਥੋਂ ਨਾ ਰੋਲ ਕਰ ਰਿਹਾ ਹੁੰਦਾ, ਜਨਰੇਸ਼ਨ ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਇੱਕੋ ਨਾਂਕਰਨ, ਫਾਈਲ ਲੇਆਉਟ, ਅਤੇ ਵਾਇਰਿੰਗ ਪੈਟਰਨ ਵੱਲ ਧੱਕਦਾ ਹੈ—ਜਿਹੜਾ ਛੋਟੀ ਨਿਯਮਬੱਧਤਾ ਵੱਡੇ ਕੋਡਬੇਸ ਵਿੱਚ ਫਲ ਦਿੰਦਾ ਹੈ।
ਜੇ ਤੁਸੀਂ ਲੋੜੀਂਦੇ ਹੋ ਕਿ ਪਹਿਲੇ ਚਰਣ ਵਿੱਚ ਹੀ ਵਰਕਫਲੋ ਨੂੰ ਸਥਿਰ ਕਰਨਾ ਹੈ—ਖਾਸ ਕਰਕੇ ਤੁਰੰਤ proof-of-concepts ਲਈ—ਤਾਂ ਪਲੇਟਫਾਰਮਾਂ ਜਿਵੇਂ Koder.ai ਟੀਮਾਂ ਨੂੰ ਚੈਟ ਤੋਂ ਵਰਕਿੰਗ ਐਪ ਜਨਰੇਟ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰ ਸਕਦੇ ਹਾਂ, ਫਿਰ ਸਰੋਤ ਕੋਡ ਐਕਸਪੋਰਟ ਕਰਕੇ ਅਤੇ ਜਦ ਦਿਸ਼ਾ ਸਪਸ਼ਟ ਹੋਵੇ ਤਦ ਹੋਰ ਇਟਰੇਟ ਕਰ ਸਕਦੇ ਹੋ। ਇਹ Angular ਦਾ ਵਿਕਲਪ ਨਹੀਂ ਹੈ (ਇਸਦਾ ਡਿਫਾਲਟ ਸਟੈਕ React + Go + PostgreSQL ਅਤੇ Flutter ਟਾਰਗਟ ਕਰਦਾ ਹੈ), ਪਰ ਬੁਨਿਆਦੀ ਵਿਚਾਰ ਇਕੋ ਹੈ: ਸੈਟਅਪ friction ਘੱਟ ਕਰੋ ਤਾਂ ਕਿ ਟੀਮ ਜ਼ਿਆਦਾ ਸਮਾਂ ਪ੍ਰੋਡਕਟ ਫੈਸਲਿਆਂ 'ਤੇ ਬਿਤਾ ਸਕੇ ਅਤੇ ਘੱਟ ਸਮਾਂ ਸਕੈਫੋਲਡਿੰਗ 'ਤੇ।
Angular ਦੀ opinionated ਟੈਸਟਿੰਗ ਸਟੋਰੀ ਇੱਕ ਕਾਰਨ ਹੈ ਕਿ ਵੱਡੀਆਂ ਟੀਮਾਂ ਗੁਣਵੱਤਾ ਨੂੰ ਉੱਚ ਰੱਖ ਸਕਦੀਆਂ ਹਨ ਬਿਨਾਂ ਹਰੇਕ ਫੀਚਰ ਲਈ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਦੁਬਾਰਾ ਖੋਜਣ ਦੇ। ਫਰੇਮਵਰਕ ਸਿਰਫ਼ ਟੈਸਟਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦਾ—ਇਹ ਤੁਹਾਨੂੰ ਦੁਹਰਾਏ ਜਾਣ ਵਾਲੇ ਪੈਟਰਨ ਵੱਲ ਧੱਕਦਾ ਹੈ ਜੋ ਸਕੇਲ ਹੁੰਦੇ ਹਨ।
ਅਕਸਰ Angular ਯੂਨਿਟ ਅਤੇ ਕੰਪੋਨੈਂਟ ਟੈਸਟਾਂ ਦੀ ਸ਼ੁਰੂਆਤ TestBed ਨਾਲ ਹੁੰਦੀ ਹੈ, ਜੋ ਟੈਸਟ ਲਈ ਇੱਕ ਛੋਟਾ, ਸੰਰਚਿਤ Angular "ਮਿਨੀ ਐਪ" ਬਣਾਉਂਦਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਤੁਹਾਡੇ ਟੈਸਟ ਸੈਟਅੱਪ ਵਿੱਚ ਅਸਲੀ Dependency Injection ਅਤੇ ਟੈਮਪਲੇਟ ਕੰਪਾਈਲੇਸ਼ਨ ਦਾ ਦਰਸਾਵਾ ਹੁੰਦਾ ਹੈ—ਅਡ-ਹਾਕ ਵਾਇਰਿੰਗ ਦੀ ਥਾਂ।
ਕੰਪੋਨੈਂਟ ਟੈਸਟਾਂ ਆਮ ਤੌਰ ਤੇ ComponentFixture ਵਰਤਦੀਆਂ ਹਨ, ਜੋ ਟੈਮਪਲੇਟ ਨੂੰ ਰੇਂਡਰ ਕਰਨ, ਚੇਂਜ ਡਿਟੈਕਸ਼ਨ ਟ੍ਰਿਗਰ ਕਰਨ, ਅਤੇ DOM 'ਤੇ ਐਸਰਟ ਕਰਨ ਲਈ ਇੱਕ ਇੱਕਸਾਰ ਤਰੀਕਾ ਦਿੰਦੀਆਂ ਹਨ।
ਕਿਉਂਕਿ Angular ਬਹੁਤ Dependency Injection 'ਤੇ ਨਿਰਭਰ ਹੈ, mocking ਸਿੱਧਾ ਹੁੰਦਾ ਹੈ: providers ਨੂੰ fakes, stubs, ਜਾਂ spies ਨਾਲ ਓਵਰਰਾਈਡ ਕਰੋ। ਆਮ ਸਹਾਇਕ ਜਿਵੇਂ HttpClientTestingModule (HTTP calls ਨੂੰ ਇੰਟਰਸੈਪਟ ਕਰਨ ਲਈ) ਅਤੇ RouterTestingModule (ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਫੇਕ ਕਰਨ ਲਈ) ਟੀਮਾਂ ਵਿੱਚ ਇਹੋ ਜਿਹੇ ਸੈਟਅੱਪ ਨੂੰ ਬੜਾਵਾ ਦਿੰਦੇ ਹਨ।
ਜਦੋਂ ਫਰੇਮਵਰਕ ਉਹੀ ਮੌਡੀਊਲ ਇੰਪੋਰਟ, ਪ੍ਰੋਵਾਈਡਰ ਓਵਰਰਾਈਡ, ਅਤੇ fixture flow ਨੂੰ ਉਤਸ਼ਾਹਿਤ ਕਰਦਾ ਹੈ, ਟੈਸਟ ਕੋਡ ਪਛਾਣਯੋਗ ਬਣ ਜਾਂਦਾ ਹੈ। ਨਵੇਂ ਸਾਥੀ ਟੈਸਟਾਂ ਨੂੰ ਡਾਕੂਮੈਂਟੇਸ਼ਨ ਵਾਂਗ ਪੜ੍ਹ ਸਕਦੇ ਹਨ, ਅਤੇ ਸਾਂਝੇ ਉਪਕਰਣ (ਟੈਸਟ ਬਿਲਡਰ, ਆਮ ਮੌਕਸ) ਪੂਰੇ ਐਪ 'ਚ ਕੰਮ ਕਰਦੇ ਹਨ।
ਯੂਨਿਟ ਟੈਸਟ ਉਸ ਵੇਲੇ ਵਧੀਆ ਹਨ ਜਦੋਂ ਤਰ੍ਹਾਂ pure ਸਰਵਿਸ ਅਤੇ ਬਿਜ਼ਨਸ ਰੁਲਜ਼: ਤੇਜ਼, ਕੇਂਦਰਿਤ, ਅਤੇ ਹਰ ਬਦਲਾਅ ਤੇ ਚਲਾਏ ਜਾਣ ਯੋਗ।
ਇੰਟੀਗਰੇਸ਼ਨ ਟੈਸਟ "ਕੰਪੋਨੈਂਟ + ਉਸਦੀ ਟੈਮਪਲੇਟ + ਕੁਝ ਅਸਲੀ Dependencies" ਲਈ ਉਚਿਤ ਹਨ ਤਾਂ ਕਿ ਵਾਇਰਿੰਗ ਮੁੱਦਿਆਂ ਨੂੰ ਪਕੜਿਆ ਜਾ ਸਕੇ (ਬਾਈਂਡਿੰਗ, ਫਾਰਮ ਬਿਹੇਵੀਅਰ, ਰੂਟਿੰਗ ਪੈਰਾਮ) ਬਿਨਾਂ ਪੂਰੇ end-to-end ਰਨ ਦੀ ਲਾਗਤ ਲਈ।
E2E ਟੈਸਟ ਘੱਟ ਅਤੇ ਮੁੱਖ ਯੂਜ਼ਰ ਯਾਤਰਾਵਾਂ (authentication, checkout, ਕੋਰ ਨੈਵੀਗੇਸ਼ਨ) ਲਈ ਰੱਖੇ ਜਾਣੇ ਚਾਹੀਦੇ ਹਨ—ਜਿੱਥੇ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਹੋ ਕਿ ਸਿਸਟਮ ਇੱਕੱਠੇ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਕਰੇ।
ਸਰਵਿਸਜ਼ ਨੂੰ ਪ੍ਰਾਇਮਰੀ ਲੌਜਿਕ ਮਾਲਕ ਵਜੋਂ ਟੈਸਟ ਕਰੋ (ਵੈਲਿਡੇਸ਼ਨ, ਗਣਨਾਵਾਂ, ਡੇਟਾ ਮੈਪਿੰਗ)। ਕੰਪੋਨੈਂਟਾਂ ਨੂੰ ਪਤਲਾ ਰੱਖੋ: ਇਨ੍ਹਾਂ ਨੂੰ ਟੈਸਟ ਕਰੋ ਕਿ ਉਹ ਸਹੀ ਸਰਵਿਸ ਮੈਥਡ ਕਾਲ ਕਰਦੇ ਹਨ, outputs 'ਤੇ ਪ੍ਰਤੀਕਿਰਿਆ ਕਰਦੇ ਹਨ, ਅਤੇ ਸਥਿਤੀਆਂ ਨੂੰ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਰੇਂਡਰ ਕਰਦੇ ਹਨ। ਜੇ ਕਿਸੇ ਕੰਪੋਨੈਂਟ ਟੈਸਟ ਨੂੰ ਭਾਰੀ mocking ਦੀ ਲੋੜ ਹੈ, ਇਹ ਸੰਕੇਤ ਹੈ ਕਿ ਲੋਜਿਕ ਸ਼ਾਇਦ ਸਰਵਿਸ ਵਿੱਚ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।
Angular ਦੀਆਂ ਰਾਇਆਂ ਦੋ ਰੋਜ਼ਾਨਾ ਖੇਤਰਾਂ ਵਿੱਚ ਸਪਸ਼ਟ ਨਜ਼ਰ ਆਉਂਦੀਆਂ ਹਨ: ਫਾਰਮ ਅਤੇ ਨੈੱਟਵਰਕ ਕਾਲ। ਜਦੋਂ ਟੀਮਾਂ ਬਿਲਟ-ਇਨ ਪੈਟਰਨ 'ਤੇ ਸਮਝੌਤਾ ਕਰਦੀਆਂ ਹਨ, ਕੋਡ ਰੀਵਿਊ ਤੇਜ਼ ਹੁੰਦੇ ਹਨ, ਬਗਾਂ ਨੂੰ ਦੁਹਰਾਉਣਾ ਆਸਾਨ ਹੁੰਦਾ ਹੈ, ਅਤੇ ਨਵੇਂ ਫੀਚਰ ਇਕੋ ਹੀ ਪਲੰਬਿੰਗ ਨੂੰ ਦੁਬਾਰਾ ਨਹੀਂ ਬਣਾਉਂਦੇ।
Angular template-driven ਅਤੇ reactive ਦੋਹਾਂ ਤਰੀਕੇ ਸਪੋਰਟ ਕਰਦਾ ਹੈ। Template-driven ਫਾਰਮ ਸਧਾਰਨ ਸਕ੍ਰੀਨਾਂ ਲਈ ਸਿੱਧੇ ਮਹਿਸੂਸ ਹੁੰਦੇ ਹਨ ਕਿਉਂਕਿ ਟੈਮਪਲੇਟ ਵਿੱਚ ਜ਼ਿਆਦਾਤਰ ਲੋਜਿਕ ਹੁੰਦੀ ਹੈ। Reactive forms TypeScript ਵਿੱਚ ਢਾਂਚਾ ਧਕਦੇ ਹਨ (FormControl, FormGroup ਵਰਗੇ), ਜੋ ਫਾਰਮ ਵੱਡੇ, ਡਾਇਨਾਮਿਕ, ਜਾਂ ਭਾਰੀ ਵੈਲਿਡੇਸ਼ਨ ਵਾਲੇ ਹੋਣ ਤੇ ਬਿਹਤਰ ਸਕੇਲ ਕਰਦੇ ਹਨ।
ਜੋ ਵੀ ਪਹੁੰਚ ਤੁਸੀਂ ਚੁਣੋ, Angular ਇਕਸਾਰ ਬਿਲਡਿੰਗ ਬਲਾਕਾਂ ਨੂੰ ਉਤਸ਼ਾਹਿਤ ਕਰਦਾ ਹੈ:
aria-describedby ਆਦਿ)ਟੀਮਾਂ ਆਮਤੌਰ 'ਤੇ ਇੱਕ ਸਾਂਝਾ “form field” ਕੰਪੋਨੈਂਟ ਮਿਆਰਿਤ ਕਰਦੀਆਂ ਹਨ ਜੋ ਹਰ ਥਾਂ ਲੇਬਲ, hints, ਅਤੇ ਐਰਰ ਸੁਨੇਹੇ ਇੱਕੋ ਤਰੀਕੇ ਨਾਲ ਰੇਂਡਰ ਕਰੇ—ਇਸ ਨਾਲ ਇਕ-ਆਫ਼ UI ਲੋジਿਕ ਘੱਟ ਹੁੰਦੀ ਹੈ।
Angular ਦਾ HttpClient ਇਕਸਾਰ ਰਿਕਵੇਸਟ ਮਾਡਲ (observables, typed responses, ਕੇਂਦਰੀ ਕੰਫਿਗ) ਨੂੰ ਤਰਜੀਹ ਦਿੰਦਾ ਹੈ। ਸਕੇਲ ਫਾਇਦਾ interceptors ਹਨ, ਜੋ ਤੁਹਾਨੂੰ ਗਲੋਬਲ ਤੌਰ 'ਤੇ ਕ੍ਰਾਸ-ਕਟਿੰਗ ਵਰਤਾਰਵ ਲਗਾਉਣ ਦਿੰਦੇ ਹਨ:
ਦਸੋ ਕਿ ਹਰ ਇਕ ਸਰਵਿਸ ਵਿੱਚ "ਜੇ 401 ਤਾਂ redirect" ਵੰਡ-ਵੰਡ ਕੇ ਮੋਕਾ ਨਹੀਂ ਬਣਣਾ—ਤੁਸੀਂ ਇਹ ਇਕ ਵਾਰੀ ਲਾਗੂ ਕਰਦੇ ਹੋ। ਇਹ ਇਕਸਾਰਤਾ ਡੁਪਲਿਕੇਸ਼ਨ ਘਟਾਉਂਦੀ ਹੈ, ਵਿਹੇਵਿਅਰ ਨੂੰ ਪੇਸ਼ਗੋਈਯੋਗ ਬਣਾਉਂਦੀ ਹੈ, ਅਤੇ ਫੀਚਰ ਕੋਡ ਨੂੰ ਬਿਜ਼ਨਸ ਲੌਜਿਕ 'ਤੇ ਕੇਂਦਰਿਤ ਰੱਖਦੀ ਹੈ।
Angular ਦੀ ਪ੍ਰਦਰਸ਼ਨ ਕਹਾਣੀ ਘਣਤਾ ਨਾਲ ਪੇਸ਼ਗੀਪਣ ਨਾਲ ਜੁੜੀ ਹੈ। "ਕਿਧਰੇ ਵੀ ਕੁਝ ਕਰੋ" ਦੀ ਸਲਾਹ ਦੇਣ ਦੀ ਬਜਾਏ, ਇਹ ਤੁਹਾਨੂੰ ਸੋਚਣ ਲਈ ਪ੍ਰੇਰਿਤ ਕਰਦਾ ਹੈ ਕਿ UI ਕਦੋਂ ਅਪਡੇਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਅਤੇ ਕਿਉਂ।
Angular view ਨੂੰ change detection ਰਾਹੀਂ ਅੱਪਡੇਟ ਕਰਦਾ ਹੈ। ਸਧਾਰਨ ਭਾਸ਼ਾ ਵਿੱਚ: ਜਦੋਂ ਕੁਝ "ਸ਼ਾਇਦ" ਬਦਲਿਆ ਹੋਇਆ ਹੋ ਸਕਦਾ ਹੈ (ਇਕ ਇਵੈਂਟ, ਇੱਕ async callback, ਇੱਕ input ਅਪਡੇਟ), Angular<Component templates ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ ਅਤੇ DOM ਨੂੰ ਜਿੱਥੇ ਜ਼ਰੂਰੀ ਹੈ ਰੀਫ੍ਰੇਸ਼ ਕਰਦਾ ਹੈ।
ਵੱਡੇ ਐਪ ਲਈ ਮੁੱਖ ਮਨੋਦਰਸ਼ਨ ਇਹ ਹੈ: ਅਪਡੇਟ ਇਰਾਦੇਵਾਲੇ ਅਤੇ ਸਥਾਨਕ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ। ਜਿੰਨਾ ਹੋਰ ਤੁਹਾਡੀ ਕੰਪੋਨੈਂਟ ਟ੍ਰੀ ਬਿਨਾ ਲੋੜ ਦੇ ਚੈੱਕ ਹੋਵੇਗੀ, ਉਨ੍ਹਾਂ ਦਾ ਪ੍ਰਦਰਸ਼ਨ ਵੱਧ ਸਕਦਾ ਹੈ।
Angular ਉਹ ਪੈਟਰਨ ਬੇਅਨ ਕਰਦਾ ਹੈ ਜੋ ਟੀਮਾਂ ਵੱਲੋਂ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਲਗਾਤਾਰ ਲਾਗੂ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ:
ChangeDetectionStrategy.OnPush: ਦੱਸਦਾ ਹੈ ਕਿ ਕੰਪੋਨੈਂਟ ਮੁੱਖ ਤੌਰ 'ਤੇ ਉਦੋਂ ਹੀ ਰੀ-render ਕਰੇ ਜਦੋਂ ਉਸਦੇ @Input() ਰੈਫਰੈਂਸ ਬਦਲੇ, ਉਸ ਦੇ ਅੰਦਰ ਇਵੈਂਟ ਹੋਵੇ, ਜਾਂ observable async ਰਾਹੀਂ emit ਕਰੇ।trackBy in *ngFor: Angular ਨੂੰ ਲਿਸਟ ਅਪਡੇਟ ਹੋਣ 'ਤੇ DOM ਨੋਡ ਮੁੜ-ਬਨਾਉਣ ਤੋਂ ਰੋਕਦਾ ਹੈ, ਜੇ ਆਈਟਮ ਦੀ ਪਰਛਾਣ ਸਥਿਰ ਰਹੇ।ਇਹ ਸਿਰਫ਼ “ਸੁਝਾਅ” ਨਹੀਂ—ਇਹ ਉਹ ਰਿਵਾਜ ਹਨ ਜੋ ਨਵੇਂ ਫੀਚਰ ਜਦ ਤੇਜ਼ੀ ਨਾਲ ਜੋੜੇ ਜਾਣ ਤਾਂ ਅਣਜਾਣ ਰੈਗ੍ਰੈਸ਼ਨ ਤੋਂ ਰੋਕਦੇ ਹਨ।
ਪੇਸ਼ਕਾਰੀ ਕੰਪੋਨੈਂਟਾਂ ਲਈ 默默 OnPush ਨੂੰ ਡਿਫਾਲਟ ਰੱਖੋ, ਅਤੇ ਡੇਟਾ ਨੂੰ immutable-ਇਸਟਲ ਰੱਖੋ (arrays/objects ਨੂੰ mutate ਕਰਨ ਦੀ ਬਜਾਏ, ਨਵੀਆਂ ਨਕਲਾਂ ਪਾਸ ਕਰੋ)।
ਲਿਸਟਾਂ ਲਈ: ਹਮੇਸ਼ਾ trackBy ਜੋੜੋ, ਜਦੋਂ ਲਿਸਟ ਵੱਡੀ ਹੋਵੇ ਤਾਂ pagination ਜਾਂ virtualization ਵਰਤੋ, ਅਤੇ ਟੈਮਪਲੇਟਾਂ ਵਿੱਚ ਮਹਿੰਗੇ ਕੰਪਿਊਟੇਸ਼ਨ ਤੋਂ ਬਚੋ।
ਰੂਟਿੰਗ ਬਾਊਂਡਰੀਜ਼ ਨੂੰ ਮਹੱਤਵਪੂਰਨ ਰੱਖੋ: ਜੇ ਇੱਕ ਫੀਚਰ ਨੈਵੀਗੇਸ਼ਨ ਤੋਂ ਖੁਲ ਸਕਦਾ ਹੈ, ਤਾਂ ਆਮਤੌਰ 'ਤੇ ਇਹ lazy-load ਲਈ ਚੰਗਾ ਉਮੀਦਵਾਰ ਹੁੰਦਾ ਹੈ।
ਨਤੀਜਾ ਇੱਕ ਐਸਾ ਕੋਡਬੇਸ ਹੈ ਜਿਸ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸਮਝਣਯੋਗ ਰਹਿੰਦੀਆਂ ਹਨ—ਭਾਵੇਂ ਕਿ ਐਪ ਅਤੇ ਟੀਮ ਕਿੰਨੀ ਵੀ ਵਧ ਜਾਣ।
Angular ਦਾ ਢਾਂਚਾ ਫਾਇਦਾ ਦਿੰਦਾ ਹੈ ਜਦੋਂ ਐਪ ਵੱਡਾ, ਲੰਬੇ ਸਮੇਂ ਤਕ ਚੱਲਣ ਵਾਲਾ, ਅਤੇ ਕਈ ਲੋਕਾਂ ਵੱਲੋਂ ਰੱਖਿਆ ਜਾਂਦਾ ਹੈ—ਪਰ ਇਹ ਮੁਫਤ ਨਹੀਂ।
ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਸੀਖਣ ਦੀ ਵੱਕਤੀ ਕ੍ਰਿਵ: Dependency Injection, RxJS ਢਾਂਚੇ, ਅਤੇ ਟੈਮਪਲੇਟ ਸਿੰਟੈਕਸ ਨੂੰ ਅੰਗੀਕਾਰ ਕਰਨ ਵਿੱਚ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ, ਖ਼ਾਸ ਕਰਕੇ ਉਹ ਟੀਮਾਂ ਜੋ ਸਿੰਪਲ ਸੈਟਅਪ ਤੋਂ ਆ ਰਹੀਆਂ ਹਨ।
ਦੂਜਾ verbosity ਹੈ। Angular ਜ਼ਿਆਦਾ explicit configuration ਅਤੇ ਸਪਸ਼ਟ ਸੀਮਾਵਾਂ ਨੂੰ ਤਰਜੀਹ ਦਿੰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਛੋਟੇ ਫੀਚਰਾਂ ਲਈ ਵੱਧ ਫਾਈਲਾਂ ਅਤੇ "ceremony" ਹੋ ਸਕਦੀ ਹੈ।
ਤੀਜਾ ਘੱਟ ਆਜ਼ਾਦੀ ਹੈ। ਕਨਵੇਂਸ਼ਨਾਂ (ਅਤੇ "Angular ਤਰੀਕਾ") ਪ੍ਰਯੋਗ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦੇ ਹਨ। ਤੁਸੀਂ ਫਿਰ ਵੀ ਹੋਰ ਟੂਲਾਂ ਜੋੜ ਸਕਦੇ ਹੋ, ਪਰ ਅਕਸਰ ਉਹਨਾਂ ਨੂੰ Angular ਦੇ ਪੈਟਰਨ ਦੇ ਅਨੁਕੂਲ ਢੰਗ ਨਾਲ ਮੇਲ ਕਰਨਾ ਪੈਂਦਾ ਹੈ, ਨਾ ਕਿ ਉਸ ਦੇ ਉਲਟ।
ਜੇ ਤੁਸੀਂ ਇੱਕ ਪ੍ਰੋਟੋਟਾਈਪ, ਮਾਰਕੇਟਿੰਗ ਸਾਈਟ, ਜਾਂ ਇੱਕ ਛੋਟਾ ਅੰਦਰੂਨੀ ਟੂਲ ਬਣਾ ਰਹੇ ਹੋ ਜਿਸਦੀ ਆਯੁੱਧ ਲੰਮੀ ਨਹੀਂ ਹੈ, ਤਾਂ ਓਹ overhead ਲਾਭ ਤੋਂ ਵੱਧ ਹੋ ਸਕਦੀ ਹੈ। ਛੋਟੀ ਟੀਮਾਂ ਜੋ ਤੇਜ਼ੀ ਨਾਲ ਸ਼ਿਪ ਕਰਦੀਆਂ ਹਨ ਅਤੇ ਬਾਰ-ਬਾਰ ਇਟਰਟ ਕਰਦੀਆਂ ਹਨ ਅਕਸਰ ਉਹ ਫਰੇਮਵਰਕ ਚਾਹੁੰਦੇ ਹਨ ਜਿਨ੍ਹਾਂ ਵਿੱਚ ਘੱਟ ਬਨਿਆਦੀ ਨਿਯਮ ਹੋਂਦੇ ਹਨ ਤਾਂ ਜੋ ਉਹ ਆਪਣੀ ਆਰਕੀਟੈਕਚਰ ਨੂੰ ਰਸਤੇ 'ਤੇ ਬਣਾਉਣ।
ਕੁਝ ਪ੍ਰਯੋਗਿਕ ਸਵਾਲ ਪੁੱਛੋ:
ਤੁਸੀਂ ਇਕ ਵਾਰੀ 'ਤੇ ਸਭ ਕੁਝ "go all in" ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ। ਬਹੁਤ ਸਾਰੀਆਂ ਟੀਮਾਂ ਰਿਵਾਜਾਂ ਕੜੇ ਕਰਨਾ (linting, folder structure, testing baselines) ਨਾਲ ਸ਼ੁਰੂ ਕਰਦੀਆਂ ਹਨ, ਫਿਰ ਸਮੇਂ ਨਾਲ standalone components ਅਤੇ ਵਧੇਰੇ ਕੇਂਦਰਿਤ ਫੀਚਰ ਬਾਉਂਡਰੀਜ਼ ਦੇ ਨਾਲ ਅਪਗਰੇਡ ਕਰਦੀਆਂ ਹਨ।
ਜੇ ਤੁਸੀਂ ਮਾਈਗ੍ਰੇਟ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਇਕ ਵੱਡੇ ਰੀਰਾਈਟ ਦੀ ਥਾਂ ਧੀਰੇ-ਧੀਰੇ ਸੁਧਾਰਾਂ ਤੇ ਧਿਆਨ ਦਿਓ—ਅਤੇ ਆਪਣੀਆਂ ਸਥਾਨਕ ਰੀਵਾਜ਼ਾਂ ਨੂੰ ਇਕ ਥਾਂ ਦਸਤਾਵੇਜ਼ ਕਰੋ ਤਾਂ ਕਿ ਤੁਹਾਡੇ ਰੀਪੋ ਵਿੱਚ "Angular ਤਰੀਕਾ" ਸੁਪਸ਼ਟ ਅਤੇ ਸਿੱਖਣ ਯੋਗ ਰਹੇ।
Angular ਵਿੱਚ “ਸੰਰਚਨਾ” ਉਹ ਡਿਫ਼ਾਲਟ ਪੈਟਰਨ ਹਨ ਜੋ ਫਰੇਮਵਰਕ ਅਤੇ ਟੂਲਿੰਗ ਪ੍ਰੋਮੋਟ ਕਰਦੇ ਹਨ: ਟੈਮਪਲੇਟ ਵਾਲੇ ਕੰਪੋਨੈਂਟ, Dependency Injection, ਰੂਟਿੰਗ ਵਿਵਸਥਾ, ਅਤੇ CLI ਦੁਆਰਾ ਬਣਾਈ ਗਈ ਆਮ ਪ੍ਰੋਜੈਕਟ ਲੇਆਉਟ।
“ਰਾਇਆਂ” ਉਹ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀਆਂ ਤਰੀਕੇ ਹਨ ਜਿਨ੍ਹਾਂ ਦਾ ਆਮ ਤੌਰ ਤੇ ਉਪਯੋਗ ਹੋਵੇ—ਇਸ ਲਈ ਜ਼ਿਆਦਾਤਰ Angular ਐਪ ਇੱਕੋ ਜਿਹੇ ਢੰਗ ਨਾਲ ਢਾਂਚਾਬੱਧ ਹੋ ਜਾਂਦੀਆਂ ਹਨ, ਜੋ ਵੱਡੀਆਂ ਕੋਡਬੇਸਾਂ ਨੂੰ ਸਮਝਣਾ ਅਤੇ ਮੈਨ ਟੇਨ ਕਰਨਾ ਆਸਾਨ ਬਣਾਉਂਦਾ ਹੈ।
ਇਹ ਵੱਡੀਆਂ ਟੀਮਾਂ ਵਿਚ ਸੰਚਾਲਨ ਦੇ ਖਰਚੇ ਘਟਾਉਂਦਾ ਹੈ। ਇਕਸਾਰ ਰਿਵਾਜਾਂ ਨਾਲ, ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਫੋਲਡਰ ਸਟਰੱਕਚਰ, ਸਟੇਟ ਬਾਊਂਡਰੀਜ਼ ਤੇ ਟੂਲਚੋਆਇਸਾਂ 'ਤੇ ਘੰਟਿਆਂ ਦੀ ਚਰਚਾ ਨਹੀਂ ਕਰਨੀ ਪੈਂਦੀ।
ਮੁੱਖ ਤਰਜੀਹ ਦੀ ਕੀਮਤ ਲਚਕੀਲੇਪਣ ਦੀ ਘਟ ਹੈ: ਜੇ ਤੁਹਾਡੀ ਟੀਮ ਬਹੁਤ ਵੱਖਰੀ ਆਰਕੀਟੈਕਚਰ ਚਾਹੁੰਦੀ ਹੈ, ਤਾਂ Angular ਦੀਆਂ ਡਿਫ਼ਾਲਟ ਚੀਜ਼ਾਂ ਨਾਲ ਟਕਰਾਅ ਹੋ ਸਕਦਾ ਹੈ।
Code drift ਉਹ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਡਿਵੈਲਪਰ ਨੇ ਨਜ਼ਦੀਕੀ ਕੋਡ ਦੀ ਨਕਲ ਕਰਕੇ ਸਮਾਂ ਦੇ ਨਾਲ ਥੋੜ੍ਹੀਆਂ-ਥੋੜ੍ਹੀਆਂ ਵੱਖਰੀਆਂ ਰੀਤਾਂ ਲਿਆ ਲੈਂਦੇ ਹਨ।
Drift ਘਟਾਉਣ ਲਈ:
features/orders/, features/billing/).Angular ਦੀਆਂ ਡਿਫ਼ਾਲਟਸ ਇਨ੍ਹਾਂ ਆਦਤਾਂ ਨੂੰ ਲਗਾਤਾਰ ਅਪਨਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਦੀਆਂ ਹਨ।
ਕੰਪੋਨੈਂਟ ਤੁਹਾਨੂੰ ਇੱਕ ਇਕਸਾਰ UI ਇਕਾਈ ਦਿੰਦੇ ਹਨ: ਟੈਮਪਲੇਟ (ਰੇਂਡਰਿੰਗ) + ਕਲਾਸ (ਸਟੇਟ/ਬਿਹੇਵੀਅਰ)।
ਇਹ ਸਕੇਲ ਕਰਨ ਯੋਗ ਹਨ ਕਿਉਂਕਿ ਸੀਮਾਵਾਂ ਸਪਸ਼ਟ ਹੋਂਦੀਆਂ ਹਨ:
@Input() ਮਾਪਿਆਂ ਤੋਂ ਚਾਈਲਡ ਨੂੰ ਡਾਟਾ ਭੇਜਦਾ ਹੈ; @Output() ਚਾਈਲਡ ਤੋਂ ਮਾਪੇ ਨੂੰ ਈਵੈਂਟ ਭੇਜਦਾ ਹੈ।
ਇਸ ਨਾਲ ਇੱਕ ਪੇਸ਼ਗੀ, ਅਸਾਨੀ ਨਾਲ ਰਿਵਿਊ ਹੋਣ ਵਾਲਾ ਡੇਟਾ ਫਲੋ ਬਣਦਾ ਹੈ:
NgModules ਰਿਵਾਇਤੀ ਤੌਰ 'ਤੇ ਸਮਬੰਧਤ ਕੰਪੋਨੈਂਟ, ਡਾਇਰੈਕਟਿਵ ਅਤੇ ਸਰਵਿਸ ਨੂੰ ਇੱਕ ਫੀਚਰ ਸੀਮਾ ਵਿੱਚ ਸਮੇਤਦੇ ਸਨ (ਜਿਵੇਂ OrdersModule)। Standalone components ਮੌਡੀਊਲ ਬਾਇਲਰਪਲੇਟ ਘਟਾਉਂਦੇ ਹਨ ਪਰ ਫੀਚਰ ਸਲਾਈਸ ਸੁਚੱਜੇ ਰੂਪ ਵਿੱਚ ਰੱਖਣ ਦੀ ਹਿੰਟ ਜਾਰੀ ਰੱਖਦੇ ਹਨ (ਰੂਟਿੰਗ ਅਤੇ ਫੋਲਡਰ ਢਾਂਚੇ ਰਾਹੀਂ)।
ਅਮਲੀ ਨਿਯਮ:
ਆਮ ਵੰਡ:
“ਗੌਡ shared module” ਤੋਂ ਬਚੋ: shared ਪੀਸਾਂ ਨੂੰ dependency-light ਰੱਖੋ ਅਤੇ ਹਰ ਫੀਚਰ ਲਈ ਸਿਰਫ਼ ਜੋ ਲੋੜੀਂਦਾ ਹੈ ਉਹੀ ਇੰਪੋਰਟ ਕਰੋ।
Dependency Injection (DI) ਨਿਰਭਰਤਾਵਾਂ ਨੂੰ ਸਪਸ਼ਟ ਅਤੇ ਬਦਲਣਯੋਗ ਬਣਾਉਂਦਾ ਹੈ:
ਇਸ ਦੀ ਥਾਂ new ApiService() ਕਰਨ ਦੀ ਬਜਾਏ, ਕੰਪੋਨੈਂਟ ਆਪਣੀਆਂ ਲੋੜਾਂ ਦੀ ਮੰਗ ਕਰਦੇ ਹਨ ਅਤੇ Angular ਠੀਕ ਇੰਸਟੈਂਸ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।
ਪ੍ਰੋਵਾਈਡਰ ਸਕੋਪ ਜੀਵਨਕਾਲ ਨਿਰਧਾਰਤ ਕਰਦਾ ਹੈ:
providedIn: 'root' ਇੱਕ ਐਪ-ਵਿਆਪਕ ਸਿੰਗਲਟਨ ਵਰਗੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ—ਕ੍ਰਾਸ-ਕਟਿੰਗ ਚਿੰਤਾਵਾਂ ਲਈ ਵਧੀਆ, ਪਰ ਗੁਪਤ state ਲਈ ਖਤਰਨਾਕ ਹੋ ਸਕਦਾ ਹੈ।ਦੀਗਰ ਦੱਸ: stateful ਸਰਵਿਸਾਂ ਦੀ ਸਪਸ਼ਟ ਮਾਲਕੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ; “ਮਿਸਟਰੀ ਗਲੋਬਲ” ਤੋਂ ਬਚੋ ਜੋ ਸਿਰਫ਼ ਸਿੰਗਲਟਨ ਹੋਣ ਕਰਕੇ ਡਾਟਾ ਇਕੱਠਾ ਕਰ ਲੈਂਦੇ ਹਨ।
ਲੇਜ਼ੀ ਲੋਡਿੰਗ ਪ੍ਰਦਰਸ਼ਨ ਬਹਿਤਰੀ ਲਈ ਅਤੇ ਟੀਮ ਬਾਊਂਡਰੀਜ਼ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਮਦਦ ਕਰਦੀ ਹੈ:
ਗਾਰਡ ਅਤੇ ਰੀਜ਼ੋਲਵਰ ਨੈਵੀਗੇਸ਼ਨ ਨਿਯਮਾਂ ਨੂੰ ਰੂਟ ਸਤਰ 'ਤੇ ਸਪਸ਼ਟ ਰੱਖਦੇ ਹਨ: auth/permissions, unsaved-changes ਜਾਂ ਲੋਡ ਕਰਨ ਲਈ ਲੋੜੀਂਦਾ ਡੇਟਾ ਪਹਿਲਾਂ ਲੈ ਲਿਆ ਜਾਵੇ।