Angular 18 の基本フレームワークの作成

DDD
リリース: 2024-09-13 22:16:32
オリジナル
184 人が閲覧しました

Создание базовой структуры для Angular 18

以前は、新しい Angular プロジェクトの作成と設定について説明しました。この記事では、基本的な構造を分析します。

このシリーズでは、航空券とホテルを検索するための Web アプリケーションの開発に焦点を当てていることを思い出してください。 このプロジェクトは、Alfa Travel - travel.alfabank.ru

のプロジェクトに基づいています。

サイトは次のブロックで構成されています:

  • 2 つの画面: モバイル バージョンとブラウザ バージョン;
  • フォームのブロックが変化する 4 つのメインページ;
  • 技術セクション;
  • チケットとホテルを検索する;
  • http エラー - 404、403、500 を表示します。

これにより、主要な部分を強調表示できます:

  • ヘッダー、コンテンツ、フッターを含む基本レイアウト;
  • 必要なフォームを表示する唯一のメイン フォームです。
  • 検索結果

AppComponentのセットアップ

routerOutlet のみを出力するように AppComponent を変更します。

import { ChangeDetectionStrategy, Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'baf-root', standalone: true, imports: [RouterOutlet], template: '', changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent {}
ログイン後にコピー

未使用のファイルを削除します: app.component.spec.ts、app.component.scss、app.component.html。

app.config.browser.ts にブラウザのバージョンの構成を追加します:

import { ApplicationConfig, mergeApplicationConfig } from '@angular/core'; import { provideAnimations } from '@angular/platform-browser/animations'; import { appConfig } from './app.config'; const browserConfig: ApplicationConfig = { providers: [provideAnimations()], }; export const config = mergeApplicationConfig(appConfig, browserConfig);
ログイン後にコピー

そしてそれを main.ts にインポートします:

import { bootstrapApplication } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { config } from './app/app.config.browser'; bootstrapApplication(AppComponent, config).catch((err) => console.error(err));
ログイン後にコピー

Hammerjs の追加

モバイル版ではタッチとスワイプを操作する必要があるため、hammerjs を使用します

依存関係をインストールします:

yarn add -D hammerjs @types/hammerjs
ログイン後にコピー

ブラウザでアニメーションと Hammerjs を接続します:

import 'hammerjs'; import { ApplicationConfig, mergeApplicationConfig } from '@angular/core'; import { provideAnimations } from '@angular/platform-browser/animations'; import { appConfig } from './app.config'; const browserConfig: ApplicationConfig = { providers: [provideAnimations()], }; export const config = mergeApplicationConfig(appConfig, browserConfig);
ログイン後にコピー

hammerjs の構成を設定する必要があります。

新しいコア フォルダーを作成します。このフォルダーに、プロジェクトに不可欠な要素をすべて保存します。

mkdir src/app/core mkdir src/app/core/lib echo >src/app/core/index.ts mkdir src/app/core/lib/hammer echo >src/app/core/lib/hammer/hammer.ts
ログイン後にコピー

hammer.ts で次の構成を指定します。

import { EnvironmentProviders, importProvidersFrom, Injectable, Provider } from '@angular/core'; import { HAMMER_GESTURE_CONFIG, HammerGestureConfig, HammerModule } from '@angular/platform-browser'; @Injectable() export class HammerConfig extends HammerGestureConfig { override overrides = { swipe: { velocity: 0.4, threshold: 20 }, pinch: { enable: false }, rotate: { enable: false }, }; } export function provideHammer(): (Provider | EnvironmentProviders)[] { return [ importProvidersFrom(HammerModule), { provide: HAMMER_GESTURE_CONFIG, useClass: HammerConfig, }, ]; }
ログイン後にコピー

src/app/core/index.ts にエクスポート:

export * from './lib/hammer/hammer';
ログイン後にコピー

簡単にアクセスするには、tsconfig.json にエイリアスを追加します。

{ "compileOnSave": false, "compilerOptions": { "outDir": "./dist/out-tsc", "strict": true, "noImplicitOverride": true, "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "skipLibCheck": true, "esModuleInterop": true, "sourceMap": true, "declaration": false, "experimentalDecorators": true, "moduleResolution": "bundler", "importHelpers": true, "target": "ES2022", "module": "ES2022", "useDefineForClassFields": false, "lib": ["ES2022", "dom"], "baseUrl": ".", "paths": { "@baf/core": ["src/app/core/index.ts"] } }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true, "strictInputAccessModifiers": true, "strictTemplates": true } }
ログイン後にコピー

baseUrl も指定する必要があることに注意してください。

ブラウザ版で接続します:

import { ApplicationConfig, mergeApplicationConfig } from '@angular/core'; import { provideAnimations } from '@angular/platform-browser/animations'; import { provideHammer } from '@baf/core'; import { appConfig } from './app.config'; const browserConfig: ApplicationConfig = { providers: [provideAnimations(), provideHammer()], }; export const config = mergeApplicationConfig(appConfig, browserConfig);
ログイン後にコピー

レイアウトの作成

レイアウトはWebアプリケーション全体で共通です。コンポーネントを保存する新しい UI フォルダーを追加しましょう。

mkdir src/app/ui mkdir src/app/ui/layout/lib echo >src/app/ui/layout/index.ts
ログイン後にコピー

コマンドを実行します:

yarn ng g c layout
ログイン後にコピー

コンテンツを src/app/ui/layout/lib に移動します。

必要な属性なしで、テスト ファイルを使用してすべてが作成されていることがわかります。

import { Component } from '@angular/core'; @Component({ selector: 'baf-layout', standalone: true, imports: [], templateUrl: './layout.component.html', styleUrl: './layout.component.scss' }) export class LayoutComponent {}
ログイン後にコピー

angular.json で次のプロパティを指定します。

{ "@schematics/angular:component": { "style": "scss", "changeDetection": "OnPush", "skipTests": true } }
ログイン後にコピー

レイアウトコンポーネントの編集:

import { ChangeDetectionStrategy, Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'baf-results', standalone: true, imports: [RouterOutlet], templateUrl: './layout.component.html', styleUrl: './layout.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, }) export class LayoutComponent {}
ログイン後にコピー

ヘッダー、コンテンツ、フッターを追加します:

 
ログイン後にコピー

いくつかのスタイル:

:host { display: flex; min-height: 100vh; flex-direction: column; } header, footer { flex-shrink: 0; } main { flex-grow: 1; overflow-x: hidden; }
ログイン後にコピー

コンポーネントを src/app/ui/layout/index.ts にエクスポートします:

export * from './lib/layout.component';
ログイン後にコピー

そして、tsconfig.json にエイリアスを書き込みます:

{ "paths": { "@baf/core": ["src/app/core/index.ts"], "@baf/ui/layout": ["src/app/ui/layout/index.ts"] } }
ログイン後にコピー

スタイルをリセットする

レイアウトを表示する前に、アプリケーションでスタイルを設定する必要があります。

ブラウザのデフォルトの外観をリセットするには、次のようにします:

/* You can add global styles to this file, and also import other style files */ @use '@angular/cdk' as cdk; // Hack for global CDK dialogs styles @include cdk.overlay(); *, *::before, *::after { box-sizing: border-box; } html { -moz-text-size-adjust: none; -webkit-text-size-adjust: none; text-size-adjust: none; } blockquote { margin: 0; padding: 1rem; } h1 { margin-block-start: 1.45rem; margin-block-end: 1.45rem; } h2 { margin-block-start: 1.25rem; margin-block-end: 1.25rem; } h3 { margin-block-start: 1.175rem; margin-block-end: 1.175rem; } h4 { margin-block-start: 1.15rem; margin-block-end: 1.15rem; } figure { margin: 0; } p { margin-block-start: 1rem; margin-block-end: 1rem; } ul[role='list'], ol[role='list'] { list-style: none; } body { margin: 0; min-height: 100vh; line-height: 1.5; font-family: Arial, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; font-size: 16px; } h1, h2, h3, h4, button, input, label { line-height: 1.1; } h1, h2, h3, h4 { text-wrap: balance; } a:not([class]) { text-decoration-skip-ink: auto; color: currentColor; } img, picture { max-width: 100%; display: block; } input, button, textarea, select { font: inherit; } textarea:not([rows]) { min-height: 10rem; } :target { scroll-margin-block: 5ex; }
ログイン後にコピー

リセットはstyles.scssに配置されます。

index.html を編集:

    BuyAndFly                
ログイン後にコピー

生成されたファビコンと他のファイルをパブリックに追加します:

browserconfig.xml:

     #172659   
ログイン後にコピー

site.webmanifest:

{ "name": "Buy & Fly", "short_name": "Buy & Fly", "icons": [ { "src": "/favicons/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/favicons/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], "theme_color": "#ffffff", "background_color": "#ffffff", "display": "standalone", "start_url": ".", "description": "Search for cheap flights and hotels.", "categories": ["travel", "education"], "screenshots": [ { "src": "screenshot.webp", "sizes": "1280x720", "type": "image/webp" } ] }
ログイン後にコピー

robots.txt:

User-agent: * Disallow: /api User-agent: Yandex Disallow: /api Clean-param: bonus&utm_source&utm_medium&utm_campaign&utm_term&utm_content&click_id&appstore&platform Host: https://buy-and-fly.fafn.ru Sitemap: https://buy-and-fly.fafn.ru/sitemap.xml
ログイン後にコピー

最後に、src/app/app.routes.ts のレイアウトを使用します。

import { Routes } from '@angular/router'; export const routes: Routes = [ { path: '', loadComponent: () => import('@baf/ui/layout').then((m) => m.LayoutComponent), children: [], }, ];
ログイン後にコピー

アプリケーションを起動します:

yarn serve
ログイン後にコピー
ログイン後にコピー

白い画面が表示されます :)

Добавление шапки и футера

Создадим шапку и подвал:

yarn ng g c header yarn ng g c footer
ログイン後にコピー

Перенесем в ui/layout и экспортируем:

export * from './lib/footer/footer.component'; export * from './lib/header/header.component'; export * from './lib/layout.component';
ログイン後にコピー

Подключим их в приложении:

import { Routes } from '@angular/router'; export const routes: Routes = [ { path: '', loadComponent: () => import('@baf/ui/layout').then((m) => m.LayoutComponent), children: [ { path: '', loadComponent: () => import('@baf/ui/layout').then((m) => m.HeaderComponent), outlet: 'header', }, { path: '', loadComponent: () => import('@baf/ui/layout').then((m) => m.FooterComponent), outlet: 'footer', }, ], }, ];
ログイン後にコピー

Запустим проект:

yarn serve
ログイン後にコピー
ログイン後にコピー

Видим созданные компоненты.

В следующей статье добавим core сервисы и интерфейсы.

Ссылки

Все исходники находятся на github, в репозитории - github.com/Fafnur/buy-and-fly

Демо можно посмотреть здесь - buy-and-fly.fafn.ru/

Мои группы: telegram, medium, vk, x.com, linkedin, site

以上がAngular 18 の基本フレームワークの作成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!