
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
template
styles
templateUrl
styleUrls
@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
TestBed
zone.js
NoopZone
Zone
// 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()