
Versatile Angular Style brings Modern Dev Tools to Angular

๐ Dev Tools Evolve & Proliferate
โฉ esbuild & โก๏ธ Vite
๐ค ... but what about Angular support?
{
// Nx
"executor": "@angular-devkit/build-angular:browser-esbuild",
// Angular CLI
"builder": "@angular-devkit/build-angular:browser-esbuild",
}๐ฆ mind the Rustaceans !
๐ด๐ผ Wait or Act ๐ช

๐ช JIT is the Golden Ticket
๐ Use inline template & styles
templatestylestemplateUrlstyleUrls
@Component({
...
template: `<h1>Hello!</h1>`,
styles: [
`
:host {
background: purple;
color: white;
}
`
]
})
class GreetingsComponent {}๐ Avoid Style Preprocessors
๐ Use inject() instead of Traditional DI
inject()@Component(...)
class GreetingsComponent {
constructor(greetings: GreetingsService) {}
}GreetingsService
emitDecoratorMetadata
emitDecoratorMetadata
Prefer inject() to @Inject()
inject()@Inject()@Component(...)
class GreetingsComponent {
constructor(@Inject(GreetingsService) greetings: GreetingsService) {}
}@Inject()
The best alternative is the inject() function.
inject()const GREETINGS_TOKEN = new InjectionToken<GreetingsService>('GREETINGS');
@Component(...)
class GreetingsComponent {
greetings = inject(GreetingsService); // GreetingsService
greetingsWithToken = inject(GREETINGS_TOKEN); // GreetingsService
greetingsOptional = inject(GreetingsService, {optional: true}); // GreetingsService | null
}๐ Use Standalone Components
mount()
๐คน Demo
โก๏ธ Vite
// vite.config.ts
import { defineConfig } from 'vite';
export default defineConfig({
root: 'src',
resolve: {
conditions: ['style'],
},
});โ
Vitest
zoneless & fine
TestBedzone.jsNoopZoneZone
// vitest.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'jsdom',
setupFiles: ['src/test-setup.ts']
},
});// test-setup.ts
import './app/testing/noop-zone';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
import { getTestBed } from '@angular/core/testing';
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);๐ฆ Jest + SWC
@swc/jest
// jest.config.ts
module.exports = {
setupFilesAfterEnv: ["<rootDir>/src/test-setup.ts"],
testEnvironment: "jsdom",
transform: {
"^.+\\.m?(t|j)sx?$": ["@swc/jest"],
},
/* We could get rid of this if we switch to ESM. */
transformIgnorePatterns: ["/node_modules/(?!(@angular/)"],
};๐ญ Playwright Component Testing
๐ข Progressive Migration to Versatile Angular Style
ษตษตdirectiveInject()inject()