作为 React 和 Vue 开发人员学习 Angular 5
入门
最终项目
部署
后续步骤
我尽量避免卷入某些编程文章中那种“框架之战”的论调。不过,我承认我对 AngularJS(也就是 Angular 1)确实颇有微词。它的语法和结构在我看来常常显得笨重,而且错误信息也让人抓狂!随着 React 的兴起,我也更倾向于越来越流行的基于组件的架构。但迁移到 Angular 2 却遇到了坎坷,而且不向后兼容,这让我很失望,之后就不再关注 Angular 了。
最近,我听到了更多关于 Angular 5 的讨论,我想尝试一下,并将我的经验与使用 Vue 和 React 的经验进行比较,因为我经常使用它们。
入门
我先从 Angular 网站上的教程开始学习,它看起来非常直观,概念上也和其他框架类似。TypeScript 可能是它和 Angular 最大的区别,我非常喜欢它!看完他们的示例项目后,我感觉构建项目很轻松,尤其是它这么大!我花了几个小时才把它全部看完!
超级英雄主题非常可爱,我喜欢它包含路由、API 请求、CLI 和服务的功能。它对框架的介绍非常详尽!
最终项目
上周我用 Go 语言构建了一个显示代码资源的 API,所以这周我想为这个应用构建一个前端!目前我几乎只专注于“微服务”风格的应用:我更倾向于分别构建前端和后端。这个应用也不例外——本周的项目完全是静态的,托管在 GitHub 页面上。
我一开始设计了一个组件来存放我的代码资源,然后为这些资源定义了 TypeScript 模式,最后又设计了一个服务来连接 API。我始终保持着这种架构。由于这是一个非常简单的应用程序,所以当时我觉得没有必要再添加子组件之类的东西了。
该服务看起来是这样的:
@Injectable()
export class ResourcesService {
private resourcesUrl = 'https://helpful-coding-resources.herokuapp.com/resources';
constructor (
private http: HttpClient,
) {}
getResources (): Observable<Resource[]>{
return this.http.get<Resource[]>(this.resourcesUrl)
.pipe(
tap(resources => console.log('done! 😀'));
)
}
我觉得 Angular 有自己的 AJAX 服务,而不是你用你喜欢的,这挺有意思的。我通常用 Axios,用它应该没问题,但能把它包含在库里就更好了。
附注:我不习惯在 JavaScript 中使用分号,但我在这个项目中使用了它们,主要是因为 VSCode 会自动将它们插入到 TypeScript 文件中,而我懒得更改设置!
然后,我对组件本身进行了处理,最终结果如下:
export class ResourcesComponent implements OnInit {
resources: Resource[];
initialResources: Resource[];
showSearch: boolean;
constructor(private resourceService: ResourcesService) { }
ngOnInit() {
this.getResources();
}
getResources(): void {
this.resourceService.getResources()
.subscribe(resources => {
this.resources = resources;
this.initialResources = resources;
});
}
toggleSearch(): void {
this.showSearch = !this.showSearch;
}
search(val): void {
this.resources = this.initialResources.filter(resource => {
return resource.Tags.some(tag => {
return tag.toLowerCase().startsWith(val.toLowerCase());
});
});
}
}
我也很喜欢它的模板语言,感觉和 Vue 非常相似。此外,我发现 Angular 仍然保持了对 HTML 和 JS 代码的关注点分离,这一点很有意思,尤其是与 React 架构相比。
<div *ngIf="resources">
<div class="search-div">
<i
class="material-icons"
(click)="toggleSearch()"
>
search
</i>
<input
#searchInput
[ngClass]="{'shown': showSearch}"
class="search-box"
(keyup)="search(searchInput.value)"
type="text"
placeholder="Filter Resources"
/>
</div>
<div class="list">
<div class="resource" *ngFor="let resource of resources">
<a href="{{ resource.Link }}"><h3>{{ resource.Name }} <span class="author">{{ resource.Author }}</span></h3></a>
<p>{{ resource.Description }}</p>
</div>
</div>
</div>
<div *ngIf="!resources">
<div class="loader"></div>
</div>
我有两个数组,一个包含当前显示的资源,另一个包含从 API 获取的资源。这样我就可以轻松实现基于标签的过滤功能。我还设置了一个开关,可以在不使用搜索栏时隐藏它。最后,我还有一个搜索方法,可以过滤附加到资源的标签。
全部文章显示
搜索文章
我还很轻松地添加了动画。有一些文档教我如何直接在 Angular 中实现动画,但我选择在 CSS 中实现。我更习惯用 CSS 来实现,而且 CSS 也经过了优化。
部署
我找到了一个npm
可以将 Angular 5 应用部署到 GitHub 页面的包,我所有的静态托管服务都用这个包。它相对简单,我很容易就部署好了页面。
后续步骤
我很高兴看到 Angular 生态系统自 AngularJS 以来取得了长足的进步!我喜欢它的组件架构,语法似乎也得到了改进。我认为所有功能都集成得很好,而且 CLI 也很棒。
话虽如此,我个人并不觉得 Angular 5 有什么用处。这个包太庞大了,对我来说,找到问题支持比 React 或 Vue 难得多(可能是因为版本更新太快)。如果我想要静态类型,我可能会在 React 中使用 Flow,或者在 Vue 中集成 TypeScript。我认为 Angular 正在努力成为重视稳定性的企业级应用的首选框架。拥有 Google 的品牌支持至关重要,而且它覆盖的庞大领域可能也起了作用。我仍然更喜欢 React 和 Vue 代码的结构——我更喜欢它们提供的更高灵活性。
简而言之,我喜欢使用 Angular 5,如果有人邀请我使用它,我会毫不犹豫地使用它来开发另一个应用程序,但与其他框架相比,我自己不会选择使用它。Vue 非常容易学习,它的生态系统非常一致,而 React 的架构对整个行业来说具有变革性的意义。我并不讨厌 Angular 5 的任何地方,只是它不像其他工具那样吸引我。
我的“学习新事物”系列的一部分
鏂囩珷鏉ユ簮锛�https://dev.to/aspittel/learning-angular-5-as-a-react-and-vue-developer-5dp3