@ngxtm/devkit 3.4.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/rules/README.md +141 -0
- package/rules/dart/best-practices/SKILL.md +23 -0
- package/rules/dart/language/SKILL.md +52 -0
- package/rules/dart/tooling/SKILL.md +43 -0
- package/rules/dotnet/aspnet-core/SKILL.md +92 -0
- package/rules/dotnet/aspnet-core/references/REFERENCE.md +335 -0
- package/rules/dotnet/best-practices/SKILL.md +101 -0
- package/rules/dotnet/best-practices/references/REFERENCE.md +256 -0
- package/rules/dotnet/blazor/SKILL.md +146 -0
- package/rules/dotnet/blazor/references/REFERENCE.md +392 -0
- package/rules/dotnet/language/SKILL.md +82 -0
- package/rules/dotnet/language/references/REFERENCE.md +222 -0
- package/rules/dotnet/patterns.rule.md +388 -0
- package/rules/dotnet/razor-pages/SKILL.md +124 -0
- package/rules/dotnet/razor-pages/references/REFERENCE.md +321 -0
- package/rules/dotnet/security/SKILL.md +89 -0
- package/rules/dotnet/security/references/REFERENCE.md +295 -0
- package/rules/dotnet/tooling/SKILL.md +92 -0
- package/rules/dotnet/tooling/references/REFERENCE.md +300 -0
- package/rules/flutter/auto-route-navigation/SKILL.md +43 -0
- package/rules/flutter/auto-route-navigation/references/REFERENCE.md +19 -0
- package/rules/flutter/auto-route-navigation/references/router-config.md +62 -0
- package/rules/flutter/bloc-state-management/SKILL.md +64 -0
- package/rules/flutter/bloc-state-management/references/REFERENCE.md +20 -0
- package/rules/flutter/bloc-state-management/references/auth-bloc-example.md +52 -0
- package/rules/flutter/bloc-state-management/references/equatable-usage.md +56 -0
- package/rules/flutter/bloc-state-management/references/property-based-state.md +68 -0
- package/rules/flutter/bloc.rule.md +76 -0
- package/rules/flutter/cicd/SKILL.md +48 -0
- package/rules/flutter/cicd/references/advanced-workflow.md +66 -0
- package/rules/flutter/cicd/references/fastlane.md +139 -0
- package/rules/flutter/cicd/references/github-actions.md +59 -0
- package/rules/flutter/dependency-injection/SKILL.md +42 -0
- package/rules/flutter/dependency-injection/references/REFERENCE.md +15 -0
- package/rules/flutter/dependency-injection/references/modules.md +37 -0
- package/rules/flutter/error-handling/SKILL.md +32 -0
- package/rules/flutter/error-handling/references/REFERENCE.md +19 -0
- package/rules/flutter/error-handling/references/error-mapping.md +31 -0
- package/rules/flutter/feature-based-clean-architecture/SKILL.md +46 -0
- package/rules/flutter/feature-based-clean-architecture/references/REFERENCE.md +14 -0
- package/rules/flutter/feature-based-clean-architecture/references/folder-structure.md +36 -0
- package/rules/flutter/getx-navigation/SKILL.md +70 -0
- package/rules/flutter/getx-navigation/references/app-pages.md +40 -0
- package/rules/flutter/getx-navigation/references/middleware-example.md +29 -0
- package/rules/flutter/getx-state-management/SKILL.md +76 -0
- package/rules/flutter/getx-state-management/references/binding-example.md +32 -0
- package/rules/flutter/getx-state-management/references/reactive-vs-simple.md +39 -0
- package/rules/flutter/go-router-navigation/SKILL.md +57 -0
- package/rules/flutter/idiomatic-flutter/SKILL.md +20 -0
- package/rules/flutter/layer-based-clean-architecture/SKILL.md +50 -0
- package/rules/flutter/layer-based-clean-architecture/references/REFERENCE.md +60 -0
- package/rules/flutter/layer-based-clean-architecture/references/repository-mapping.md +50 -0
- package/rules/flutter/localization/SKILL.md +50 -0
- package/rules/flutter/localization/references/REFERENCE.md +48 -0
- package/rules/flutter/localization/references/sheet-loader.md +33 -0
- package/rules/flutter/navigator-v1-navigation/SKILL.md +71 -0
- package/rules/flutter/navigator-v1-navigation/references/on-generate-route.md +48 -0
- package/rules/flutter/performance/SKILL.md +24 -0
- package/rules/flutter/retrofit-networking/SKILL.md +51 -0
- package/rules/flutter/retrofit-networking/references/REFERENCE.md +19 -0
- package/rules/flutter/retrofit-networking/references/token-refresh.md +40 -0
- package/rules/flutter/riverpod-state-management/SKILL.md +53 -0
- package/rules/flutter/riverpod-state-management/references/architecture.md +124 -0
- package/rules/flutter/riverpod-state-management/references/best-practices.md +89 -0
- package/rules/flutter/riverpod-state-management/references/testing.md +73 -0
- package/rules/flutter/riverpod.rule.md +78 -0
- package/rules/flutter/security/SKILL.md +33 -0
- package/rules/flutter/security/references/REFERENCE.md +15 -0
- package/rules/flutter/security/references/network-security.md +28 -0
- package/rules/flutter/testing/SKILL.md +44 -0
- package/rules/flutter/testing/references/REFERENCE.md +21 -0
- package/rules/flutter/testing/references/bloc-testing.md +38 -0
- package/rules/flutter/testing/references/integration-testing.md +128 -0
- package/rules/flutter/testing/references/robot-pattern.md +82 -0
- package/rules/flutter/testing/references/unit-testing.md +130 -0
- package/rules/flutter/testing/references/widget-testing.md +120 -0
- package/rules/flutter/widgets/SKILL.md +37 -0
- package/rules/golang/chi-router/SKILL.md +219 -0
- package/rules/golang/chi-router/references/REFERENCE.md +13 -0
- package/rules/golang/chi-router/references/routing-patterns.md +205 -0
- package/rules/golang/cobra-cli/SKILL.md +227 -0
- package/rules/golang/cobra-cli/references/REFERENCE.md +13 -0
- package/rules/golang/cobra-cli/references/command-patterns.md +224 -0
- package/rules/golang/core/SKILL.md +210 -0
- package/rules/golang/core/references/REFERENCE.md +14 -0
- package/rules/golang/core/references/concurrency-patterns.md +114 -0
- package/rules/golang/core/references/error-handling.md +87 -0
- package/rules/golang/echo-framework/SKILL.md +215 -0
- package/rules/golang/echo-framework/references/REFERENCE.md +14 -0
- package/rules/golang/echo-framework/references/middleware-patterns.md +141 -0
- package/rules/golang/echo-framework/references/routing-patterns.md +140 -0
- package/rules/golang/ent-orm/SKILL.md +239 -0
- package/rules/golang/ent-orm/references/REFERENCE.md +13 -0
- package/rules/golang/ent-orm/references/schema-patterns.md +255 -0
- package/rules/golang/fiber-framework/SKILL.md +196 -0
- package/rules/golang/fiber-framework/references/REFERENCE.md +13 -0
- package/rules/golang/fiber-framework/references/routing-patterns.md +191 -0
- package/rules/golang/gin-framework/SKILL.md +205 -0
- package/rules/golang/gin-framework/references/REFERENCE.md +14 -0
- package/rules/golang/gin-framework/references/middleware-patterns.md +119 -0
- package/rules/golang/gorm-orm/SKILL.md +196 -0
- package/rules/golang/gorm-orm/references/REFERENCE.md +14 -0
- package/rules/golang/gorm-orm/references/model-definitions.md +167 -0
- package/rules/golang/gorm-orm/references/query-patterns.md +161 -0
- package/rules/golang/grpc/SKILL.md +231 -0
- package/rules/golang/grpc/references/REFERENCE.md +13 -0
- package/rules/golang/grpc/references/service-patterns.md +276 -0
- package/rules/golang/testify/SKILL.md +239 -0
- package/rules/golang/testify/references/REFERENCE.md +13 -0
- package/rules/golang/testify/references/assert-patterns.md +170 -0
- package/rules/golang/validator/SKILL.md +234 -0
- package/rules/golang/validator/references/REFERENCE.md +13 -0
- package/rules/golang/validator/references/validation-tags.md +211 -0
- package/rules/golang/viper-config/SKILL.md +244 -0
- package/rules/golang/viper-config/references/REFERENCE.md +13 -0
- package/rules/golang/viper-config/references/config-loading.md +181 -0
- package/rules/golang/wire-di/SKILL.md +243 -0
- package/rules/golang/wire-di/references/REFERENCE.md +13 -0
- package/rules/golang/wire-di/references/provider-patterns.md +193 -0
- package/rules/golang/zap-logging/SKILL.md +203 -0
- package/rules/golang/zap-logging/references/REFERENCE.md +13 -0
- package/rules/golang/zap-logging/references/logger-config.md +165 -0
- package/rules/java/build-gradle/SKILL.md +92 -0
- package/rules/java/build-gradle/references/REFERENCE.md +14 -0
- package/rules/java/build-gradle/references/kotlin-dsl.md +118 -0
- package/rules/java/build-gradle/references/task-configuration.md +132 -0
- package/rules/java/build-maven/SKILL.md +86 -0
- package/rules/java/build-maven/references/REFERENCE.md +14 -0
- package/rules/java/build-maven/references/dependency-management.md +111 -0
- package/rules/java/build-maven/references/lifecycle-phases.md +114 -0
- package/rules/java/graalvm-native/SKILL.md +105 -0
- package/rules/java/graalvm-native/references/REFERENCE.md +12 -0
- package/rules/java/java-collections-streams/SKILL.md +148 -0
- package/rules/java/java-collections-streams/references/REFERENCE.md +15 -0
- package/rules/java/java-collections-streams/references/collectors-patterns.md +178 -0
- package/rules/java/java-collections-streams/references/stream-pipelines.md +165 -0
- package/rules/java/java-concurrency/SKILL.md +187 -0
- package/rules/java/java-concurrency/references/REFERENCE.md +17 -0
- package/rules/java/java-concurrency/references/completable-future.md +165 -0
- package/rules/java/java-concurrency/references/executor-patterns.md +176 -0
- package/rules/java/java-concurrency/references/virtual-threads.md +190 -0
- package/rules/java/java-core-language/SKILL.md +121 -0
- package/rules/java/java-core-language/references/REFERENCE.md +15 -0
- package/rules/java/java-core-language/references/jvm-memory-model.md +160 -0
- package/rules/java/java-core-language/references/modern-java-features.md +168 -0
- package/rules/java/java-project-structure/SKILL.md +195 -0
- package/rules/java/java-project-structure/references/REFERENCE.md +15 -0
- package/rules/java/java-project-structure/references/maven-project-layout.md +199 -0
- package/rules/java/java-project-structure/references/module-system.md +159 -0
- package/rules/java/micronaut-core/SKILL.md +99 -0
- package/rules/java/micronaut-core/references/REFERENCE.md +12 -0
- package/rules/java/micronaut-reactive/SKILL.md +68 -0
- package/rules/java/micronaut-reactive/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-core/SKILL.md +85 -0
- package/rules/java/quarkus-core/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-reactive/SKILL.md +67 -0
- package/rules/java/quarkus-reactive/references/REFERENCE.md +12 -0
- package/rules/java/spring-batch/SKILL.md +102 -0
- package/rules/java/spring-batch/references/REFERENCE.md +12 -0
- package/rules/java/spring-boot-architecture/SKILL.md +206 -0
- package/rules/java/spring-boot-architecture/references/REFERENCE.md +15 -0
- package/rules/java/spring-boot-architecture/references/auto-configuration.md +158 -0
- package/rules/java/spring-boot-architecture/references/configuration-properties.md +202 -0
- package/rules/java/spring-boot-web/SKILL.md +217 -0
- package/rules/java/spring-boot-web/references/REFERENCE.md +17 -0
- package/rules/java/spring-cloud/SKILL.md +109 -0
- package/rules/java/spring-cloud/references/REFERENCE.md +13 -0
- package/rules/java/spring-data-jpa/SKILL.md +241 -0
- package/rules/java/spring-data-jpa/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/SKILL.md +161 -0
- package/rules/java/spring-security/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/references/jwt-auth-flow.md +213 -0
- package/rules/java/testing-junit-mockito/SKILL.md +135 -0
- package/rules/java/testing-junit-mockito/references/REFERENCE.md +15 -0
- package/rules/java/testing-junit-mockito/references/junit5-patterns.md +159 -0
- package/rules/java/testing-junit-mockito/references/mockito-patterns.md +148 -0
- package/rules/java/testing-junit-mockito/references/spring-boot-testing.md +152 -0
- package/rules/javascript/best-practices/SKILL.md +64 -0
- package/rules/javascript/best-practices/references/REFERENCE.md +91 -0
- package/rules/javascript/language/SKILL.md +71 -0
- package/rules/javascript/language/references/REFERENCE.md +106 -0
- package/rules/javascript/tooling/SKILL.md +60 -0
- package/rules/javascript/tooling/references/REFERENCE.md +107 -0
- package/rules/metadata.json +54 -0
- package/rules/nestjs/api-standards/SKILL.md +47 -0
- package/rules/nestjs/api-standards/references/pagination-wrapper.md +87 -0
- package/rules/nestjs/architecture/SKILL.md +68 -0
- package/rules/nestjs/architecture/references/dynamic-module.md +53 -0
- package/rules/nestjs/caching/SKILL.md +51 -0
- package/rules/nestjs/caching/references/REFERENCE.md +13 -0
- package/rules/nestjs/caching/references/cache-patterns.md +183 -0
- package/rules/nestjs/configuration/SKILL.md +41 -0
- package/rules/nestjs/configuration/references/REFERENCE.md +13 -0
- package/rules/nestjs/configuration/references/config-patterns.md +184 -0
- package/rules/nestjs/controllers-services/SKILL.md +63 -0
- package/rules/nestjs/controllers-services/references/REFERENCE.md +14 -0
- package/rules/nestjs/controllers-services/references/controller-patterns.md +119 -0
- package/rules/nestjs/controllers-services/references/service-patterns.md +129 -0
- package/rules/nestjs/database/SKILL.md +102 -0
- package/rules/nestjs/database/references/REFERENCE.md +14 -0
- package/rules/nestjs/database/references/typeorm-patterns.md +156 -0
- package/rules/nestjs/deployment/SKILL.md +36 -0
- package/rules/nestjs/deployment/references/REFERENCE.md +13 -0
- package/rules/nestjs/deployment/references/deployment-patterns.md +140 -0
- package/rules/nestjs/documentation/SKILL.md +64 -0
- package/rules/nestjs/documentation/references/REFERENCE.md +13 -0
- package/rules/nestjs/documentation/references/swagger-patterns.md +139 -0
- package/rules/nestjs/error-handling/SKILL.md +55 -0
- package/rules/nestjs/error-handling/references/REFERENCE.md +13 -0
- package/rules/nestjs/error-handling/references/exception-filters.md +152 -0
- package/rules/nestjs/file-uploads/SKILL.md +35 -0
- package/rules/nestjs/file-uploads/references/REFERENCE.md +13 -0
- package/rules/nestjs/file-uploads/references/upload-patterns.md +125 -0
- package/rules/nestjs/observability/SKILL.md +39 -0
- package/rules/nestjs/observability/references/REFERENCE.md +13 -0
- package/rules/nestjs/observability/references/logging-metrics.md +175 -0
- package/rules/nestjs/performance/SKILL.md +60 -0
- package/rules/nestjs/performance/references/REFERENCE.md +13 -0
- package/rules/nestjs/performance/references/performance-patterns.md +107 -0
- package/rules/nestjs/real-time/SKILL.md +45 -0
- package/rules/nestjs/real-time/references/REFERENCE.md +13 -0
- package/rules/nestjs/real-time/references/websocket-patterns.md +121 -0
- package/rules/nestjs/scheduling/SKILL.md +39 -0
- package/rules/nestjs/scheduling/references/REFERENCE.md +13 -0
- package/rules/nestjs/scheduling/references/scheduling-patterns.md +137 -0
- package/rules/nestjs/search/SKILL.md +41 -0
- package/rules/nestjs/search/references/REFERENCE.md +13 -0
- package/rules/nestjs/search/references/search-patterns.md +137 -0
- package/rules/nestjs/security/SKILL.md +87 -0
- package/rules/nestjs/security/references/REFERENCE.md +14 -0
- package/rules/nestjs/security/references/authentication.md +151 -0
- package/rules/nestjs/testing/SKILL.md +40 -0
- package/rules/nestjs/testing/references/REFERENCE.md +14 -0
- package/rules/nestjs/testing/references/unit-testing.md +179 -0
- package/rules/nestjs/transport/SKILL.md +45 -0
- package/rules/nestjs/transport/references/REFERENCE.md +13 -0
- package/rules/nestjs/transport/references/microservices-patterns.md +170 -0
- package/rules/nextjs/app-router/SKILL.md +46 -0
- package/rules/nextjs/app-router/references/REFERENCE.md +14 -0
- package/rules/nextjs/app-router/references/routing-patterns.md +182 -0
- package/rules/nextjs/architecture/SKILL.md +44 -0
- package/rules/nextjs/architecture/references/fsd-structure.md +77 -0
- package/rules/nextjs/authentication/SKILL.md +29 -0
- package/rules/nextjs/authentication/references/auth-implementation.md +73 -0
- package/rules/nextjs/caching/SKILL.md +66 -0
- package/rules/nextjs/caching/references/REFERENCE.md +13 -0
- package/rules/nextjs/caching/references/cache-strategies.md +168 -0
- package/rules/nextjs/data-access-layer/SKILL.md +33 -0
- package/rules/nextjs/data-access-layer/references/patterns.md +66 -0
- package/rules/nextjs/data-fetching/SKILL.md +59 -0
- package/rules/nextjs/data-fetching/references/REFERENCE.md +13 -0
- package/rules/nextjs/data-fetching/references/fetch-patterns.md +160 -0
- package/rules/nextjs/internationalization/SKILL.md +105 -0
- package/rules/nextjs/internationalization/references/REFERENCE.md +13 -0
- package/rules/nextjs/internationalization/references/i18n-patterns.md +180 -0
- package/rules/nextjs/optimization/SKILL.md +64 -0
- package/rules/nextjs/optimization/references/REFERENCE.md +13 -0
- package/rules/nextjs/optimization/references/optimization-patterns.md +190 -0
- package/rules/nextjs/rendering/SKILL.md +91 -0
- package/rules/nextjs/rendering/references/REFERENCE.md +13 -0
- package/rules/nextjs/rendering/references/rendering-modes.md +163 -0
- package/rules/nextjs/server-actions/SKILL.md +46 -0
- package/rules/nextjs/server-actions/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-actions/references/action-patterns.md +188 -0
- package/rules/nextjs/server-components/SKILL.md +52 -0
- package/rules/nextjs/server-components/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-components/references/component-patterns.md +175 -0
- package/rules/nextjs/state-management/SKILL.md +73 -0
- package/rules/nextjs/state-management/references/REFERENCE.md +13 -0
- package/rules/nextjs/state-management/references/state-patterns.md +218 -0
- package/rules/nextjs/styling/SKILL.md +31 -0
- package/rules/nextjs/styling/references/implementation.md +56 -0
- package/rules/react/component-patterns/SKILL.md +66 -0
- package/rules/react/component-patterns/references/REFERENCE.md +126 -0
- package/rules/react/hooks/SKILL.md +60 -0
- package/rules/react/hooks/references/REFERENCE.md +132 -0
- package/rules/react/hooks.rule.md +79 -0
- package/rules/react/performance/SKILL.md +69 -0
- package/rules/react/performance/references/REFERENCE.md +143 -0
- package/rules/react/security/SKILL.md +46 -0
- package/rules/react/security/references/REFERENCE.md +170 -0
- package/rules/react/state-management/SKILL.md +56 -0
- package/rules/react/state-management/references/REFERENCE.md +137 -0
- package/rules/react/testing/SKILL.md +45 -0
- package/rules/react/testing/references/REFERENCE.md +149 -0
- package/rules/react/tooling/SKILL.md +39 -0
- package/rules/react/typescript/SKILL.md +53 -0
- package/rules/rust/actix-web/SKILL.md +160 -0
- package/rules/rust/actix-web/references/REFERENCE.md +13 -0
- package/rules/rust/actix-web/references/handler-patterns.md +198 -0
- package/rules/rust/async-graphql/SKILL.md +228 -0
- package/rules/rust/async-graphql/references/REFERENCE.md +13 -0
- package/rules/rust/async-graphql/references/schema-patterns.md +215 -0
- package/rules/rust/axum/SKILL.md +161 -0
- package/rules/rust/axum/references/REFERENCE.md +14 -0
- package/rules/rust/axum/references/handler-patterns.md +97 -0
- package/rules/rust/bevy/SKILL.md +206 -0
- package/rules/rust/bevy/references/REFERENCE.md +13 -0
- package/rules/rust/bevy/references/ecs-patterns.md +226 -0
- package/rules/rust/clap/SKILL.md +217 -0
- package/rules/rust/clap/references/REFERENCE.md +13 -0
- package/rules/rust/clap/references/derive-patterns.md +205 -0
- package/rules/rust/core/SKILL.md +154 -0
- package/rules/rust/core/references/REFERENCE.md +14 -0
- package/rules/rust/core/references/error-handling.md +92 -0
- package/rules/rust/diesel-orm/SKILL.md +176 -0
- package/rules/rust/diesel-orm/references/REFERENCE.md +13 -0
- package/rules/rust/diesel-orm/references/schema-patterns.md +206 -0
- package/rules/rust/rocket/SKILL.md +182 -0
- package/rules/rust/rocket/references/REFERENCE.md +13 -0
- package/rules/rust/rocket/references/handler-patterns.md +209 -0
- package/rules/rust/sea-orm/SKILL.md +230 -0
- package/rules/rust/sea-orm/references/REFERENCE.md +13 -0
- package/rules/rust/sea-orm/references/entity-patterns.md +221 -0
- package/rules/rust/serde-serialization/SKILL.md +150 -0
- package/rules/rust/serde-serialization/references/REFERENCE.md +13 -0
- package/rules/rust/serde-serialization/references/serialization-patterns.md +199 -0
- package/rules/rust/sqlx-database/SKILL.md +140 -0
- package/rules/rust/sqlx-database/references/REFERENCE.md +13 -0
- package/rules/rust/sqlx-database/references/query-patterns.md +210 -0
- package/rules/rust/tauri/SKILL.md +180 -0
- package/rules/rust/tauri/references/REFERENCE.md +13 -0
- package/rules/rust/tauri/references/command-patterns.md +209 -0
- package/rules/rust/tokio-runtime/SKILL.md +167 -0
- package/rules/rust/tokio-runtime/references/REFERENCE.md +14 -0
- package/rules/rust/tokio-runtime/references/async-patterns.md +137 -0
- package/rules/rust/tokio-runtime/references/synchronization.md +152 -0
- package/rules/rust/tonic/SKILL.md +231 -0
- package/rules/rust/tonic/references/REFERENCE.md +13 -0
- package/rules/rust/tonic/references/service-patterns.md +213 -0
- package/rules/rust/tracing/SKILL.md +214 -0
- package/rules/rust/tracing/references/REFERENCE.md +13 -0
- package/rules/rust/tracing/references/instrumentation.md +187 -0
- package/rules/typescript/best-practices/SKILL.md +108 -0
- package/rules/typescript/best-practices/references/REFERENCE.md +68 -0
- package/rules/typescript/language/SKILL.md +72 -0
- package/rules/typescript/language/references/REFERENCE.md +67 -0
- package/rules/typescript/patterns.rule.md +85 -0
- package/rules/typescript/security/SKILL.md +59 -0
- package/rules/typescript/security/references/REFERENCE.md +113 -0
- package/rules/typescript/tooling/SKILL.md +52 -0
- package/rules/typescript/tooling/references/REFERENCE.md +110 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Next.js Fetch Patterns
|
|
2
|
+
|
|
3
|
+
## Basic Fetching
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
// Server Component - direct fetch
|
|
7
|
+
async function UserProfile({ id }: { id: string }) {
|
|
8
|
+
const user = await fetch(`https://api.example.com/users/${id}`);
|
|
9
|
+
const data = await user.json();
|
|
10
|
+
return <div>{data.name}</div>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// With error handling
|
|
14
|
+
async function getData() {
|
|
15
|
+
const res = await fetch('https://api.example.com/data');
|
|
16
|
+
if (!res.ok) {
|
|
17
|
+
throw new Error('Failed to fetch');
|
|
18
|
+
}
|
|
19
|
+
return res.json();
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Caching & Revalidation
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
// Cache forever (default)
|
|
27
|
+
fetch('https://api.example.com/data');
|
|
28
|
+
|
|
29
|
+
// No cache
|
|
30
|
+
fetch('https://api.example.com/data', { cache: 'no-store' });
|
|
31
|
+
|
|
32
|
+
// Revalidate after 60 seconds
|
|
33
|
+
fetch('https://api.example.com/data', { next: { revalidate: 60 } });
|
|
34
|
+
|
|
35
|
+
// Revalidate on demand with tags
|
|
36
|
+
fetch('https://api.example.com/posts', { next: { tags: ['posts'] } });
|
|
37
|
+
|
|
38
|
+
// Trigger revalidation (Server Action or Route Handler)
|
|
39
|
+
import { revalidateTag, revalidatePath } from 'next/cache';
|
|
40
|
+
revalidateTag('posts');
|
|
41
|
+
revalidatePath('/blog');
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Page-Level Caching
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
// Force dynamic rendering
|
|
48
|
+
export const dynamic = 'force-dynamic';
|
|
49
|
+
|
|
50
|
+
// Force static rendering
|
|
51
|
+
export const dynamic = 'force-static';
|
|
52
|
+
|
|
53
|
+
// Revalidate every 60 seconds
|
|
54
|
+
export const revalidate = 60;
|
|
55
|
+
|
|
56
|
+
// Disable caching
|
|
57
|
+
export const revalidate = 0;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Parallel Fetching
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
// ✅ Good - parallel fetches
|
|
64
|
+
async function Dashboard() {
|
|
65
|
+
const [user, posts, analytics] = await Promise.all([
|
|
66
|
+
getUser(),
|
|
67
|
+
getPosts(),
|
|
68
|
+
getAnalytics(),
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<div>
|
|
73
|
+
<UserCard user={user} />
|
|
74
|
+
<PostsList posts={posts} />
|
|
75
|
+
<Analytics data={analytics} />
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ❌ Bad - sequential (waterfall)
|
|
81
|
+
async function Dashboard() {
|
|
82
|
+
const user = await getUser();
|
|
83
|
+
const posts = await getPosts();
|
|
84
|
+
const analytics = await getAnalytics();
|
|
85
|
+
// ...
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Request Deduplication
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import { cache } from 'react';
|
|
93
|
+
|
|
94
|
+
// Deduplicated across components in same request
|
|
95
|
+
export const getUser = cache(async (id: string) => {
|
|
96
|
+
const res = await fetch(`https://api.example.com/users/${id}`);
|
|
97
|
+
return res.json();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Multiple components can call getUser(id)
|
|
101
|
+
// Only one request is made
|
|
102
|
+
async function UserName({ id }: { id: string }) {
|
|
103
|
+
const user = await getUser(id);
|
|
104
|
+
return <span>{user.name}</span>;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function UserEmail({ id }: { id: string }) {
|
|
108
|
+
const user = await getUser(id);
|
|
109
|
+
return <span>{user.email}</span>;
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Database Queries
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
import { unstable_cache } from 'next/cache';
|
|
117
|
+
|
|
118
|
+
// Cache database queries
|
|
119
|
+
const getCachedUser = unstable_cache(
|
|
120
|
+
async (id: string) => {
|
|
121
|
+
return db.user.findUnique({ where: { id } });
|
|
122
|
+
},
|
|
123
|
+
['user-cache'],
|
|
124
|
+
{ revalidate: 3600, tags: ['users'] }
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// Usage
|
|
128
|
+
async function UserProfile({ id }: { id: string }) {
|
|
129
|
+
const user = await getCachedUser(id);
|
|
130
|
+
return <Profile user={user} />;
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Streaming
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
import { Suspense } from 'react';
|
|
138
|
+
|
|
139
|
+
// Stream slow data
|
|
140
|
+
async function Page() {
|
|
141
|
+
// Fast data renders immediately
|
|
142
|
+
const quickData = await getQuickData();
|
|
143
|
+
|
|
144
|
+
return (
|
|
145
|
+
<div>
|
|
146
|
+
<h1>{quickData.title}</h1>
|
|
147
|
+
|
|
148
|
+
{/* Slow data streams in */}
|
|
149
|
+
<Suspense fallback={<Loading />}>
|
|
150
|
+
<SlowComponent />
|
|
151
|
+
</Suspense>
|
|
152
|
+
</div>
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function SlowComponent() {
|
|
157
|
+
const slowData = await getSlowData();
|
|
158
|
+
return <div>{slowData.content}</div>;
|
|
159
|
+
}
|
|
160
|
+
```
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Next.js Internationalization (i18n)
|
|
3
|
+
description: Best practices for multi-language handling, locale routing, and detection middleware.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [nextjs, i18n, middleware, routing]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['middleware.ts', 'app/[lang]/**', 'messages/*.json']
|
|
8
|
+
keywords: [i18n, locale, translation, next-intl, redirect]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Internationalization (i18n)
|
|
12
|
+
|
|
13
|
+
## **Priority: P2 (MEDIUM)**
|
|
14
|
+
|
|
15
|
+
Use Sub-path Routing (`/en`, `/de`) and Server Components for translations.
|
|
16
|
+
|
|
17
|
+
## Principles
|
|
18
|
+
|
|
19
|
+
1. **Sub-path Routing**: Use URL segments (e.g., `app/[lang]/page.tsx`) to manage locales.
|
|
20
|
+
- _Why_: SEO friendly, sharable, and cacheable.
|
|
21
|
+
2. **Server-Side Translation**: Load dictionary files (`en.json`) in Server Components.
|
|
22
|
+
- _Why_: Reduces client bundle size. No huge JSON blobs sent to browser.
|
|
23
|
+
3. **Middleware Detection**: Use `middleware.ts` to detect `Accept-Language` headers and redirect users to their preferred locale.
|
|
24
|
+
4. **Type Safety**: Use robust typing for translation keys to prevent broken text UI.
|
|
25
|
+
|
|
26
|
+
## Implementation Pattern
|
|
27
|
+
|
|
28
|
+
### 1. Directory Structure
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
app/
|
|
32
|
+
├── [lang]/ # Dynamic Locale Segment
|
|
33
|
+
│ ├── layout.tsx # <html lang={params.lang}>
|
|
34
|
+
│ └── page.tsx
|
|
35
|
+
└── api/
|
|
36
|
+
messages/ # Translation Dictionaries
|
|
37
|
+
├── en.json
|
|
38
|
+
└── es.json
|
|
39
|
+
middleware.ts # Locale Redirection
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 2. Middleware (`middleware.ts`)
|
|
43
|
+
|
|
44
|
+
Redirect root traffic (`/`) to localized traffic (`/en`).
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { NextResponse } from 'next/server';
|
|
48
|
+
import type { NextRequest } from 'next/server';
|
|
49
|
+
import { match } from '@formatjs/intl-localematcher';
|
|
50
|
+
import Negotiator from 'negotiator';
|
|
51
|
+
|
|
52
|
+
const LOCALES = ['en', 'es', 'fr'];
|
|
53
|
+
const DEFAULT = 'en';
|
|
54
|
+
|
|
55
|
+
export function middleware(request: NextRequest) {
|
|
56
|
+
const { pathname } = request.nextUrl;
|
|
57
|
+
|
|
58
|
+
// 1. Check if path already has locale
|
|
59
|
+
const pathnameHasLocale = LOCALES.some(
|
|
60
|
+
(locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`,
|
|
61
|
+
);
|
|
62
|
+
if (pathnameHasLocale) return;
|
|
63
|
+
|
|
64
|
+
// 2. Detect locale (Header matching)
|
|
65
|
+
const headers = {
|
|
66
|
+
'accept-language': request.headers.get('accept-language') || '',
|
|
67
|
+
};
|
|
68
|
+
const languages = new Negotiator({ headers }).languages();
|
|
69
|
+
const locale = match(languages, LOCALES, DEFAULT);
|
|
70
|
+
|
|
71
|
+
// 3. Redirect
|
|
72
|
+
request.nextUrl.pathname = `/${locale}${pathname}`;
|
|
73
|
+
return NextResponse.redirect(request.nextUrl);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export const config = {
|
|
77
|
+
matcher: ['/((?!_next|api|static|favicon.ico).*)'],
|
|
78
|
+
};
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 3. Server Component Usage
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// app/[lang]/page.tsx
|
|
85
|
+
|
|
86
|
+
// 1. Dynamic Params ensure static generation works for each language
|
|
87
|
+
export async function generateStaticParams() {
|
|
88
|
+
return [{ lang: 'en' }, { lang: 'es' }];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export default async function Page({ params: { lang } }) {
|
|
92
|
+
// 2. Load Dictionary On Demand
|
|
93
|
+
const dict = await getDictionary(lang);
|
|
94
|
+
|
|
95
|
+
return <h1>{dict.home.title}</h1>;
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Redirect Handling Strategy
|
|
100
|
+
|
|
101
|
+
When handling redirects (Authentication, Legacy URLs) in an i18n app:
|
|
102
|
+
|
|
103
|
+
- **Always preserve locale**: Use `redirect(`/${lang}/login`)` instead of just `/login`.
|
|
104
|
+
- **Server Actions**: Return `redirect(...)` from actions.
|
|
105
|
+
- **Next Config**: Use `next.config.js` for legacy SEO 301s (e.g., old-site `/about-us` -> `/en/about`).
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Next.js Internationalization References
|
|
2
|
+
|
|
3
|
+
## References
|
|
4
|
+
|
|
5
|
+
- [**i18n Patterns**](i18n-patterns.md) - Routing, translations, locale detection
|
|
6
|
+
|
|
7
|
+
## Quick Checks
|
|
8
|
+
|
|
9
|
+
- [ ] Configure supported locales in next.config
|
|
10
|
+
- [ ] Use dynamic route segments for locale
|
|
11
|
+
- [ ] Implement locale detection middleware
|
|
12
|
+
- [ ] Load translations efficiently
|
|
13
|
+
- [ ] Handle RTL languages properly
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Next.js Internationalization Patterns
|
|
2
|
+
|
|
3
|
+
## App Router i18n Setup
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// middleware.ts
|
|
7
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
8
|
+
import Negotiator from 'negotiator';
|
|
9
|
+
import { match } from '@formatjs/intl-localematcher';
|
|
10
|
+
|
|
11
|
+
const locales = ['en', 'vi', 'ja'];
|
|
12
|
+
const defaultLocale = 'en';
|
|
13
|
+
|
|
14
|
+
function getLocale(request: NextRequest): string {
|
|
15
|
+
const headers = { 'accept-language': request.headers.get('accept-language') || '' };
|
|
16
|
+
const languages = new Negotiator({ headers }).languages();
|
|
17
|
+
return match(languages, locales, defaultLocale);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function middleware(request: NextRequest) {
|
|
21
|
+
const { pathname } = request.nextUrl;
|
|
22
|
+
|
|
23
|
+
// Check if locale is in pathname
|
|
24
|
+
const pathnameHasLocale = locales.some(
|
|
25
|
+
(locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
if (pathnameHasLocale) return;
|
|
29
|
+
|
|
30
|
+
// Redirect to locale path
|
|
31
|
+
const locale = getLocale(request);
|
|
32
|
+
request.nextUrl.pathname = `/${locale}${pathname}`;
|
|
33
|
+
return NextResponse.redirect(request.nextUrl);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const config = {
|
|
37
|
+
matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
|
|
38
|
+
};
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Directory Structure
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
app/
|
|
45
|
+
├── [locale]/
|
|
46
|
+
│ ├── layout.tsx
|
|
47
|
+
│ ├── page.tsx
|
|
48
|
+
│ └── about/
|
|
49
|
+
│ └── page.tsx
|
|
50
|
+
└── dictionaries/
|
|
51
|
+
├── en.json
|
|
52
|
+
├── vi.json
|
|
53
|
+
└── ja.json
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Dictionary Loading
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// dictionaries.ts
|
|
60
|
+
const dictionaries = {
|
|
61
|
+
en: () => import('./dictionaries/en.json').then((m) => m.default),
|
|
62
|
+
vi: () => import('./dictionaries/vi.json').then((m) => m.default),
|
|
63
|
+
ja: () => import('./dictionaries/ja.json').then((m) => m.default),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const getDictionary = async (locale: string) => {
|
|
67
|
+
return dictionaries[locale]?.() ?? dictionaries.en();
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// app/[locale]/page.tsx
|
|
71
|
+
export default async function Page({ params: { locale } }) {
|
|
72
|
+
const dict = await getDictionary(locale);
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<main>
|
|
76
|
+
<h1>{dict.home.title}</h1>
|
|
77
|
+
<p>{dict.home.description}</p>
|
|
78
|
+
</main>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Dictionary File
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
// dictionaries/en.json
|
|
87
|
+
{
|
|
88
|
+
"home": {
|
|
89
|
+
"title": "Welcome",
|
|
90
|
+
"description": "This is the home page"
|
|
91
|
+
},
|
|
92
|
+
"nav": {
|
|
93
|
+
"about": "About",
|
|
94
|
+
"contact": "Contact"
|
|
95
|
+
},
|
|
96
|
+
"common": {
|
|
97
|
+
"loading": "Loading...",
|
|
98
|
+
"error": "Something went wrong"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Layout with Locale
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// app/[locale]/layout.tsx
|
|
107
|
+
import { getDictionary } from '../dictionaries';
|
|
108
|
+
|
|
109
|
+
export async function generateStaticParams() {
|
|
110
|
+
return [{ locale: 'en' }, { locale: 'vi' }, { locale: 'ja' }];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export default async function LocaleLayout({
|
|
114
|
+
children,
|
|
115
|
+
params: { locale },
|
|
116
|
+
}: {
|
|
117
|
+
children: React.ReactNode;
|
|
118
|
+
params: { locale: string };
|
|
119
|
+
}) {
|
|
120
|
+
const dict = await getDictionary(locale);
|
|
121
|
+
|
|
122
|
+
return (
|
|
123
|
+
<html lang={locale} dir={locale === 'ar' ? 'rtl' : 'ltr'}>
|
|
124
|
+
<body>
|
|
125
|
+
<nav>
|
|
126
|
+
<a href={`/${locale}`}>{dict.nav.home}</a>
|
|
127
|
+
<a href={`/${locale}/about`}>{dict.nav.about}</a>
|
|
128
|
+
<LocaleSwitcher locale={locale} />
|
|
129
|
+
</nav>
|
|
130
|
+
{children}
|
|
131
|
+
</body>
|
|
132
|
+
</html>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Locale Switcher
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
'use client';
|
|
141
|
+
|
|
142
|
+
import { usePathname, useRouter } from 'next/navigation';
|
|
143
|
+
|
|
144
|
+
export function LocaleSwitcher({ locale }: { locale: string }) {
|
|
145
|
+
const pathname = usePathname();
|
|
146
|
+
const router = useRouter();
|
|
147
|
+
|
|
148
|
+
const switchLocale = (newLocale: string) => {
|
|
149
|
+
const newPath = pathname.replace(`/${locale}`, `/${newLocale}`);
|
|
150
|
+
router.push(newPath);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
return (
|
|
154
|
+
<select value={locale} onChange={(e) => switchLocale(e.target.value)}>
|
|
155
|
+
<option value="en">English</option>
|
|
156
|
+
<option value="vi">Tiếng Việt</option>
|
|
157
|
+
<option value="ja">日本語</option>
|
|
158
|
+
</select>
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## next-intl Integration
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
// For more advanced i18n, use next-intl
|
|
167
|
+
import { useTranslations } from 'next-intl';
|
|
168
|
+
|
|
169
|
+
export default function HomePage() {
|
|
170
|
+
const t = useTranslations('home');
|
|
171
|
+
|
|
172
|
+
return (
|
|
173
|
+
<div>
|
|
174
|
+
<h1>{t('title')}</h1>
|
|
175
|
+
<p>{t('greeting', { name: 'World' })}</p>
|
|
176
|
+
<p>{t('items', { count: 5 })}</p>
|
|
177
|
+
</div>
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Next.js Optimization
|
|
3
|
+
description: Image, Font, Script, and Metadata optimization strategies.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [nextjs, optimization, seo, performance]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/layout.tsx', '**/page.tsx']
|
|
8
|
+
keywords: [next/image, next/font, metadata, generateMetadata]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Optimization
|
|
12
|
+
|
|
13
|
+
## **Priority: P1 (HIGH)**
|
|
14
|
+
|
|
15
|
+
Core optimization primitives provided by Next.js. **Monitor First, Optimize Later.**
|
|
16
|
+
|
|
17
|
+
## Monitoring (Core Web Vitals)
|
|
18
|
+
|
|
19
|
+
Before applying optimizations, identify bottlenecks using:
|
|
20
|
+
|
|
21
|
+
- **LCP (Largest Contentful Paint)**: Initial load speed. Target < 2.5s.
|
|
22
|
+
- **CLS (Cumulative Layout Shift)**: Visual stability. Target < 0.1.
|
|
23
|
+
- **INP (Interaction to Next Paint)**: Responsiveness. Target < 200ms.
|
|
24
|
+
- **Tools**: Chrome DevTools "Performance" tab, `next/speed-insights`, or `React Profiler`.
|
|
25
|
+
|
|
26
|
+
## Images (`next/image`)
|
|
27
|
+
|
|
28
|
+
- **Component**: `<Image src="..." alt="..." width={500} height={300} />`.
|
|
29
|
+
- **Features**: Automatic resizing, lazy loading, format conversion (WebP/AVIF), and CLS prevention (placeholder sizing).
|
|
30
|
+
- **Remote**: Must configure `images.remotePatterns` in `next.config.js` for external URLs.
|
|
31
|
+
|
|
32
|
+
## Fonts (`next/font`)
|
|
33
|
+
|
|
34
|
+
- **Local**: `localFont({ src: ... })`.
|
|
35
|
+
- **Google**: `Inter({ subsets: ['latin'] })`.
|
|
36
|
+
- **Why**: Self-hosts fonts at build time. Zero Layout Shift.
|
|
37
|
+
|
|
38
|
+
## Metadata (SEO)
|
|
39
|
+
|
|
40
|
+
- **Static**: Export `metadata` object from `layout.tsx` or `page.tsx`.
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
export const metadata: Metadata = {
|
|
44
|
+
title: 'Dashboard',
|
|
45
|
+
description: '...',
|
|
46
|
+
};
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- **Dynamic**: Export `generateMetadata({ params })` function.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
export async function generateMetadata({ params }) {
|
|
53
|
+
const product = await getProduct(params.id);
|
|
54
|
+
return { title: product.name };
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- **Open Graph**: Use `openGraph` key for social cards.
|
|
59
|
+
|
|
60
|
+
## Scripts (`next/script`)
|
|
61
|
+
|
|
62
|
+
- **Loading Strategy**: Control when 3rd party scripts load.
|
|
63
|
+
- `strategy="afterInteractive"` (Default): Google Analytics.
|
|
64
|
+
- `strategy="lazyOnload"`: Chat widgets, low priority.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Next.js Optimization References
|
|
2
|
+
|
|
3
|
+
## References
|
|
4
|
+
|
|
5
|
+
- [**Optimization Patterns**](optimization-patterns.md) - Images, fonts, scripts, bundle
|
|
6
|
+
|
|
7
|
+
## Quick Checks
|
|
8
|
+
|
|
9
|
+
- [ ] Use next/image for automatic optimization
|
|
10
|
+
- [ ] Use next/font for font optimization
|
|
11
|
+
- [ ] Use next/script for third-party scripts
|
|
12
|
+
- [ ] Implement code splitting
|
|
13
|
+
- [ ] Analyze bundle with @next/bundle-analyzer
|