2026年2月

Nikon Z5 镜头推荐

目前 Nikon Z5 + 套头 24-50 + 铭匠鱼眼 11mm f2.8 。

现在想更新一个镜头,请各位推荐一个必入镜头,

要求:是 UWP 格式的,符合 Fluent UI

Unigram, Apple Music, Dev Toolbox, Harden System Security, App Control Manager, PowerToys, Minecraft Bedrock Edition

这是我目前的跑步水平,最近迷上跑鞋了,慢跑鞋、竞速鞋和比赛鞋都可以推荐给我,嘿嘿~

稍微有点扁平足,有没有懂鞋的老哥。

image

本文由体验技术团队张婷原创。

一、核心概念:两种架构的本质区别

无论是 Module 还是 Standalone,核心目标都是解决 Angular 应用中组件、指令、管道、服务的组织、依赖管理与复用问题,只是实现方式截然不同。

1. 传统架构:NgModule 模块机制

NgModule 是 Angular 原生的模块化方案,本质是一个“功能容器”,通过装饰器 @NgModule 定义,承担着“声明、导入、导出、提供”四大核心职责,将分散的功能聚合为一个可管理的单元。

其核心逻辑是“模块中心化”——所有组件必须归属某个模块,依赖通过模块统一导入,服务通过模块提供作用域,这种设计非常适合大型项目的分层与分工。

1.png

2. 革新方案:Standalone 独立组件

Standalone 是 Angular 为简化开发推出的轻量化方案,通过在组件装饰器中设置 standalone: true,让组件摆脱对 NgModule 的依赖,实现“组件自包含”。
其核心逻辑是“组件中心化”——组件自身可直接导入所需的模块、其他独立组件,无需在模块中声明,大幅精简了模板代码,降低了入门门槛。

2.png

二、实操对比:代码层面的直观差异

理论不如实操,我们通过一个简单的“根组件+头部组件”场景,对比两种模式的实现代码,感受其差异。

1. NgModule 实现方式

需创建模块文件(如 app.module.ts),集中管理组件、依赖和服务,步骤相对繁琐:
HeaderComponent 需单独创建 header.component.ts 文件,模板内容需完整定义,同时模块中必须声明所有用到的组件,否则会报“组件未注册”错误。

// header.component.ts(传统组件,需在模块中声明)
import { Component } from '@angular/core';

@Component({
  selector: 'app-header',
  template: `
    系统头部
  `,
  styles: [`
    .header { padding: 16px; background: #f5f5f5; border-bottom: 1px solid #eee; }
    nav { margin-top: 8px; color: #666; }
  `]
})
export class HeaderComponent { }

// app.component.ts(根组件)
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <app-header></app-header>
    Angular Module 模式示例
  `
})
export class AppComponent {
  showContent = true; // 控制内容显示,演示*ngIf指令用法
}

// app.module.ts(核心模块文件)
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { CommonModule } from '@angular/common'; // 提供*ngIf、*ngFor等基础指令

import { AppComponent } from './app.component';
import { HeaderComponent } from './header/header.component';

@NgModule({
  declarations: [
    // 声明模块内的组件、指令、管道(必须在此注册,否则无法使用)
    AppComponent,
    HeaderComponent
  ],
  imports: [
    // 导入依赖模块:BrowserModule用于浏览器渲染,CommonModule提供基础指令
    BrowserModule,
    CommonModule
  ],
  providers: [
    // 提供模块级服务(模块内所有组件共享同一个实例)
    { provide: 'API_BASE_URL', useValue: 'https://api.example.com' }
  ],
  bootstrap: [AppComponent] // 指定根组件,Angular启动时会渲染该组件
})
export class AppModule { }

// main.ts(应用启动入口文件)
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

// 通过编译模块启动应用,这是传统Module模式的标准启动方式
platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.error('应用启动失败:', err));

2.Standalone 实现方式

无需模块文件,组件自身声明依赖,启动流程更简洁。

补充说明:独立组件可直接导入其他独立组件,无需额外声明;依赖导入遵循“按需导入”原则,仅导入当前组件所需模块,减少冗余。


// header.component.ts(独立头部组件,无需模块声明)
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common'; // 自身导入所需模块

@Component({
  selector: 'app-header',
  standalone: true, // 标记为独立组件,摆脱模块依赖
  imports: [CommonModule], // 导入基础指令模块,用于后续可能的*ngIf等用法
  template: `
    独立组件头部<nav *首页 | 关于我们 | 联系我们
  `,
  styles: [`
    .header { padding: 16px; background: #e8f4f8; border-bottom: 1px solid #d1e7dd; }
    nav { margin-top: 8px; color: #333; }
  `]
})
export class HeaderComponent {
  showNav = true; // 组件内部状态,控制导航显示
}

// app.component.ts(独立根组件)
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HeaderComponent } from './header/header.component'; // 直接导入独立组件

// 抽离共享依赖(缓解重复导入问题,大型项目推荐用法)
const SharedDependencies = [CommonModule, HeaderComponent];

@Component({
  selector: 'app-root',
  standalone: true, // 核心标记:独立组件
  imports: [SharedDependencies], // 导入所需依赖(模块+独立组件)
  providers: [
    // 组件级服务:默认当前组件及子组件共享实例,若需全局单例可加providedIn: 'root'
    { provide: 'API_BASE_URL', useValue: 'https://api.example.com', providedIn: 'root' }
  ],
  template: `
<app-header></app-header>
    Angular Standalone 模式示例
  `
})
export class AppComponent {
  showContent = true;

  // 交互方法,演示组件基础功能
  toggleContent() {
    this.showContent = !this.showContent;
  }
}

// main.ts(独立组件启动入口)
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';

// 直接启动独立根组件,无需模块介入,启动流程更简洁
bootstrapApplication(AppComponent, {
  // 可选:全局配置,如提供全局服务(替代模块级providers)
  providers: [{ provide: 'GLOBAL_CONFIG', useValue: { env: 'production' } }]
})
  .catch(err => console.error('应用启动失败:', err));

三、传统与革新,孰优孰劣?

两种方案各有优劣,没有绝对的“完美”。

1. NgModule 的优缺点

优点:

  • 成熟稳定,生态兼容:作为 Angular 核心机制,兼容所有第三方库、插件和传统项目,几乎无适配风险,是老项目维护的首选。
  • 强模块化封装:适合大型团队协作,可按业务域(如用户模块、订单模块)拆分独立 NgModule,边界清晰,便于分工维护和权限管控。
  • 集中式依赖管理:模块级统一导入依赖,避免多个组件重复导入相同模块,减少冗余代码,适合大量组件共享依赖的场景。
  • 服务作用域清晰:模块级服务默认在模块内单例,无需额外配置即可实现“模块内共享、模块间隔离”,适合按模块隔离业务逻辑的场景。

缺点:

  • 模块代码冗余:即使是简单组件,也需创建模块文件,编写 @NgModule 装饰器及 declarations/imports 等配置,增加无业务价值的模块代码。
  • 学习成本:新手易混淆 declarations(声明组件)、imports(导入模块)、exports(导出组件)的用法,常出现“组件找不到”“指令未注册”等错误。
  • 编译效率略低:模块是编译基本单元,修改一个组件可能触发整个模块的重新编译,大型模块会增加编译耗时。
  • 组件复用成本高:组件必须绑定模块,跨项目复用单个组件时,需连带其所属模块一起复制,灵活性不足。

2. Standalone 的优缺点

优点:

  • 轻量化,开发效率高:无需创建模块文件,入门门槛低,中小型项目、原型开发速度大幅提升。
  • 精准依赖,代码精简:组件仅按需导入自身所需依赖,避免模块级导入带来的冗余依赖,代码更清晰、可维护性更强。
  • 编译性能更优:独立组件是最小编译单元,修改单个组件仅触发自身重新编译,大型项目编译速度提升明显。
  • 复用性强:组件完全独立于模块,跨项目复用只需复制组件文件,无需连带模块,是组件库开发的最优选择。

缺点:

  • 依赖重复导入:多个独立组件需同一模块(如 CommonModule)时,需各自导入,易出现重复代码(可通过抽离共享组件模块导入缓解,如下图)。

3.png

  • 部分老库适配不足:少数未升级的第三方库依赖模块级特性,需额外适配才能在独立组件中使用。
  • 服务作用域配置复杂默认是组件级单例,若需实现全局单例或模块级单例,需额外配置 providedIn: 'root' 或通过共享组件封装,比 NgModule 繁琐。

PS

  • 组件级单例:假如你有 3 个独立的 ButtonComponent,都注入了同一个 CountService,那么这 3 个组件会各有一个 CountService,点击按钮计数时,各自的数字不会互相影响。
  • 全局级单例:全局只有一个服务实例”(比如用户登录状态、全局缓存)。

四、各有优劣,如何选择?

NgModule 代表了 Angular 传统的“强模块化”设计理念,Standalone 则是 Angular 对“轻量化、高效化”的探索,两者并非非此即彼的替代关系,而可以是互补关系。

  • 全新中小型项目/原型开发:优先选择 Standalone 组件。轻量化特性可快速迭代,减少模板代码,降低团队协作成本。
  • 大型企业级项目/多人协作:采用混合模式。保留核心业务模块(NgModule)的封装性,新开发的组件、指令使用 Standalone 模式,逐步迁移老组件,兼顾稳定性和开发效率。

总结

作为开发者,我们无需纠结于“哪种更好”,而是要理解两种方案的设计初衷,根据项目规模、团队结构、复用需求灵活选型。在实际开发中,可以选择混合使用两种模式,既能保留传统架构的稳定性,又能享受新范式的高效性。

一点拙见分享,抛砖引玉,欢迎大家与我交流补充,共同进步 ~

关于OpenTiny

欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~
OpenTiny 官网:https://opentiny.design
OpenTiny 代码仓库:https://github.com/opentiny
TinyVue源码:https://github.com/opentiny/tiny-vue

欢迎进入代码仓库 Star🌟TinyVue、TinyEngine、TinyPro、TinyNG、TinyCLI、TinyEditor
如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

看到不少人因为被父母催婚都恐惧过年回家。这里讲讲我发小的故事。。

发小的爸爸是家里的男主人。实实在在的男主人。家里老婆儿子女儿包括上一辈的老顽固爸爸都得听他的。谁不听就拳脚相加。

早年女儿不知道怎么得罪他了。拎着头发在家门口路上拖着走。

然后每次过年聚会。发小都会掐着时间找借口说家里有事要先回家了。我们都知道他爸爸给他定了时间。有时候也会些许开玩笑嘲讽。都大学了怎么还这么乖。

后来他找了个女朋友。他爸爸不认可就吹了

然后去年前年发小开始站起来了。他过年聚会不再看时间了。还和爸爸一起吃鸡。爸爸让他帮忙干啥也敢开始打趣的回复了。以前那个被严格管教的发小不复存在了。什么事情都可以自己做主了。真替他开心

结论:家庭地位不平等状态是可以改变的。低处的可以跃升。当然我们也不要制造不平等
能基于理智和父母友好相处才是最好的

  1. 顶楼装修时候砸了,客厅阳台和客厅的之间的墙垛。看户型图,能确定这块是承重墙。
  2. 楼顶露台被物业封闭起来,顶楼业主屋内做了楼梯直达楼顶。咨询物业说,买房时候其他业主都签订了自愿放弃楼顶使用权协议,现在楼顶使用权被开发商卖给了 13 楼。(存疑)
  3. 楼顶露台正在搭建,似乎是在搭建阳光房之类的。

被楼上的装修噪音影响生活,上去询问重点是楼上态度非常不好。根据以上线索请问如何收拾这种人

马上放假了,在节日前送自己也送给 25 年一个礼物

使用过 idm,ndm,迅雷冲过年会员(最高等级的),各有各的不满意,索性自己+AI 开始做一个自己喜欢的

官方下载地址

https://fluxdown.zerx.dev/

技术栈

  • rust + tokio + reqwest 实现高速并行下载
  • flutter + shadcn-ui 实现高性能的 UI 与可接受的系统资源占用
  • wxt: 一次开发多个浏览器适配

预览

首页

创建下载任务

设置页面

功能支持情况

bt 协议支持中,年前发布

  • http 协议下载
  • 断点续传
  • 分片并发下载
  • ftp 协议

1. 我司影石 Insta360 已经连续多年在年会给优秀员工发车啦,去年一共发了 6 辆(其中一辆是抽奖送出去!)

2. 自去年科创板成功上市之后,第一位 90 后董事长诞生了,也是母校南京大学近期既地平线的余凯之后的又一位新晋百亿豪门的校友。

3. 公司目前处于高速增长期,相关业务已经是行业全球龙头。从近期上市的情况来看,资本市场也是非常看好未来的潜力(估值稳定在千亿上下)。目前我们部门(软件平台部)有几个非常关键的音视频职位火热招聘中:
https://arashivision.jobs.feishu.cn/social/position/7375433477015587082/detail
https://arashivision.jobs.feishu.cn/social/position/7505996084049676598/detail
https://arashivision.jobs.feishu.cn/social/position/7375433477015587082/detail

4. 欢迎投递简历至 [email protected] ,薪资可议。如果想了解我个人的履历情况,可以查看: https://maimai.cn/profile/detail?dstu=230660073

5. 考虑到该岗位非常关键,我这边会每天刷这条招聘帖子,有什么问题也欢迎留言交流哈

相比传统的 vpn 零信任 vpn 我感觉就是加了登录时的手机验证 但是传统的 vpn 不是也可以在服务端设置 Two-Factor Authentication 通过 microsoft authenticator 之类的 app 验证用户身份?

大致 10 年前注册的了那会为了省事直接用了 qq 号作为用户名。现在看起来好蠢回复的时候直接显示个 qq 号,看了眼设置只有修改密码的,有办法修改用户名吗

RT

OP 最近正需要制作 PPT 进行项目汇报,想用 AI 辅助制作 PPT

但是找来找去眼花缭乱,不知道有什么最佳实践,请大手子们指教一下

最好是能达到像用 CC 写代码这种全自动驾驶的感觉,不知道现在的 AI 生成 PPT 有没有达到这个模式?

看有的贴子说,这玩意没啥技术含量了,便宜的公模出的,百十块钱都能买到。
有些牌子也有三四千的,差价十几倍了。
我想买个带摄像头的,做猫眼用,想着要装 app ,鉴于不太想多装一个 app ,小米家的最便宜的带摄像头的小米智能门锁 E30 大屏猫眼 咋样?有人在用么?

过年打算带父母出游,目前看泰国、马来西亚、新加坡,这几个免签国家哪里人少一点好玩一点啊,也不需要太多景点,毕竟带着父母跑不了太多地方,就是想找个暖和的地方玩玩

先叠甲:坐标北京,多年联通宽带用户,本来觉得联通算北京最好的宽带了,结果还是踩坑了,分享下我的维权经历,给各位 v 友避坑。(目前还在用,不是故意黑联通,大家自己判断)

起因:1000M 宽带刷抖音都卡

家里装的联通 1000M 宽带,199 元/月的套餐,刚装完那会手机测速基本能到 800-900M ,偶尔还能超 1000M ,刷视频、玩游戏都丝滑得不行。

结果用了一年多,明显感觉不对劲:网速越来越卡,有时候刷个抖音都要缓冲,甚至加载不出来。但我当时没太在意,因为用百度网盘下载游戏,速度还能跑满带宽,就以为是 APP 本身的问题,不是宽带的锅。

直到最近,家里人也开始天天抱怨网卡,刷抖音、看视频都不顺畅,我才意识到事情不对劲,赶紧又测了几次速——好家伙,多次测速都只有 400-500M ,直接腰斩一半,这是 1000M 宽带该有的水平么?

报修过程:直接戳破“宽带共享”的核心问题

测速异常后,我立马打了联通客服投诉,不得不说维修师傅上门速度还挺快,来了之后测了下线路,说线路一切正常,偶尔跑不满带宽也属于正常现象,理由是“网速有使用高峰期,高峰时段慢一点很正常”。

我之前刷过不少宽带维权的案例,早就有心理准备,直接跟师傅摊牌:我办的是个人独享 1000M 宽带,独享的核心就是不受高峰时段影响,如果受高峰影响,说明根本不是独享,这就属于货不对板、虚假宣传了。

师傅被我说得没话接,也不辩解了,只说“回去跟领导反映一下情况”,然后就走了。说实话,当时我也没抱太大希望,以为又是不了了之的敷衍。

结果:换个光猫恢复满速,师傅劝我“别声张”

没想到过了三四天,之前的维修师傅又上门了,这次带了个新光猫,二话不说就给我换了。换完之后,师傅才悄悄跟我说:“目前你这片小区,就你家是真正的独享 1000M ,你这边速度恢复了就好,尽量别声张,免得其他人来投诉。”

我听完直接懵了,合着之前网速变慢,就是因为没给配独享的设备,宽带实际上就是共享的。不过换完光猫之后,效果确实立竿见影——再测速基本都能回到 800-900M ,和刚装宽带的时候一样,刷抖音、玩游戏也再也没卡过。

总结/提醒

  1. 别被“1000M 宽带”的宣传忽悠,哪怕是联通这种在北京口碑相对好的运营商,也可能存在“共享冒充独享”或者设备缩水的情况;

  2. 如果宽带用久了变慢,别只看下载速度(比如百度网盘),一定要定期用测速软件测实际网速,下载能跑满不代表日常使用不卡;

  3. 维权的时候别被“高峰时段正常”忽悠,独享宽带和高峰时段无关,只要测速长期不达标,就坚决要求维修或更换设备,态度要硬一点。

有没有 v 友遇到过类似的情况?这样的情况普遍么?