惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - dudu

.NET CQRS 的实现中引入 ReadOnlyRepository 初试 .NET CQRS 开源库 LiteBus 什么是 Agentic ? 初试 Microsoft Agent Framework 初识 Microsoft Agent Framework:一句话介绍 ASP.NET Core 中读取 UserAgent 的正确姿势 记录一下对 ASP.NET Core Middleware 进行单元测试的代码 C# 实现通用的 IdEqualityComparer 用 Angular Signal Inputs 完成一个组件的重构 量子网络操作系统 QNodeOS 资料收集 Kubernetes 集群上部署 Open WebUI 在 Kubernetes 集群的 GPU 节点上部署 Ollama 尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1 阿里云 GPU 实例云服务器本地部署 DeepSeek R1 尝试使用阿里云计算巢部署 DeepSeek-R1 Angular 中依赖注入问题造成 Observable 订阅不更新 Angular 中使用 ChildContent 记录 园子博客后台升级至 angular 19 后 eslint 9 迁移记录 学习大模型(LLM)的英文好文收集
园子博客后台 Angular 升级:手工迁移至 Standalone Component
dudu · 2025-01-09 · via 博客园 - dudu

最近在将园子博客后台的前端框架从 angular 15 升级至 angular 19,这边博文记录的是迁移至 Standalone Component 的过程。

之前尝试使用 angular 19 提供的迁移命令自动迁移,但迁移失败,详见 https://q.cnblogs.com/q/150498

ng g @angular/core:standalone

改为手动迁移,记录一下迁移过程。

删除标记与 NgModule 文件

  • 删除所有 standalone: false,一共 198
  • 删除所有 NgModule 文件,一个 84 个文件
find . -name *.module.ts -exec git rm {} \;
  • 恢复测试中使用的 NgModule 文件 testing.module.ts

迁移至 standalone bootstrapping api

  • 修改 main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { appConfig } from './app/app.config';

bootstrapApplication(AppComponent, appConfig)
    .catch((err) => console.error(err));
  • 创建 app.config.ts 文件并将 app.module.ts 中的 providers 迁移过来
export const appConfig: ApplicationConfig = {
    providers: [
        provideHttpClient(withFetch()),
        provideAnimations(),
        provideZoneChangeDetection(
            {
                eventCoalescing: true
            }),
        provideRouter(
            routes,
            withRouterConfig({
                onSameUrlNavigation: 'reload'
            }),
            withPreloading(NoPreloading),
            withViewTransitions()
        ),
        NzModalService,
        LoggerService,
        // ...
    ]
};

针对 ngx-monaco-editor-v2,将

MonacoEditorModule.forRoot({
    baseUrl: environment.assets.monacoBase,
}),

改为

provideMonacoEditor({
    baseUrl: environment.assets.monacoBase,
}),
  • 恢复 app-routing.module.ts 文件并重命名为 app.routes.ts
git checkout HEAD~1 app-routing.module.ts
git mv app-routing.module.ts app.routes.ts
  • 处理 app.routes.ts 中通过 loadChildren 加载 NgModule 的代码
loadChildren: () => import('./pages/posts/posts.module').then(m => m.PostsModule)
  • 将 posts.module.ts 并转换为 posts.routes.ts
git checkout HEAD~1 ./pages/posts/posts.module.ts
git mv ./pages/posts/posts.module.ts ./pages/posts/posts.routes.ts
  • 修改 posts.routes.ts,改为 export const routes, 删除 NgModule 部分代码,修改路由部分代码
export const POSTS_ROUTES: Routes = [
    {
        path: '',
        component: PostMainComponent,
    }
]
  • 修改 app.routes.ts 中对应的 loadChildren 代码
loadChildren: () => import('./pages/posts/posts.routes').then(m => m.POSTS_ROUTES)
  • 在 app.config.ts 中添加 onSameUrlNavigation 与 preloadingStrategy 配置
export const appConfig: ApplicationConfig = {
    providers: [
        provideZoneChangeDetection(
            {
                eventCoalescing: true
            }),
        provideRouter(
            routes,
            withRouterConfig({
                onSameUrlNavigation: 'reload'
            }),
            withPreloading(NoPreloading)
        ),
        provideHttpClient(withFetch()),
    ]
};

添加 import

近 200 个 component 需要一个一个 component 添加所需的 import,这是迁移中工作量最大的部分,即使只是用到了 *ngIf 或者 [ngClass], 也要添加对应的 import,详见 https://q.cnblogs.com/q/151533

解决 ViewChild 的问题

详见博问:迁移到 Standalone Component 后 ViewChild 无法正常工作

处理 imports 中漏添加 Directive 的问题

一个 standalone component 的模板中用了某个 directive,如果没有在 imports 中添加,build 与运行是都不会报错,只是这个 directive 没有被执行。

在 app.routes.ts 添加 providers

将之前在各个 NgModule 中添加的 providers 迁移到 app.routes.ts 中

参考资料