前言

Angular 绝对有很多缺陷,Issue 非常多,workaround 非常多。

我以前至少有 subscribe 超过 20 个 Issues,几年都没有 right way 处理的。

Angular 不支持 Custom @Decorator

Angular 自己是有在用 Decorator (旧版,不是 TypeScript 5.0 后的版本) 的,但是我们可用不了。

相关 Github Issues:

Class decorator stopped working on angular@15

Custom decorators not working using AoT

Angular 不支持 PostCSS Configuration

Angular CLI 自己是有在用 PostCSS 来支持 Tailwind CSS 的。但是!它不允许我们设置。

连 postcss-preset-env 我们都设置不了。

像下图这样,办不到

相关 Github Issues:

Add postcss-preset-env to Angular build process / allow for configuring custom PostCSS plugins

而且短期没有任何计划要支持

Angular 不支持 Static Image Hash

Template

<div class="bg-img"></div>

Styles

.bg-img {
background-image: url('../../public/nana.jpg');
background-size: cover;
width: 360px;
aspect-ratio: 16 / 9;
}

ng build

两个知识点

  1. path 换了

    原本是 '../../public/nana.jpg' (我们写的时候是依据开发时的文件路径)

    变成了 './media/nana-LHLWYWZO.jpg' (这是依据项目发布后的文件路径)

  2. file 换了

    原本是 nana.jpg 换成了 nana-LHLWYWZO.jpg

    有了这个 hash 就可以做缓存了

结论:Angular 在 build 的时候会对 CSS background-image 做 hash 处理。

好,我们接着来看 <img> element。

Template

<img src="../../public/nana.jpg" alt="yangmi">

ng build

两个知识点:

  1. path 没有换

    Angular 没有把开发路径换成发布后的路径,如果我们不做处理会导致最终图片访问失败。

  2. 没有 hash 版本的 img

    Angular 也没有创建出 hash 版本的 img。

结论:<img> element 需要我们自己处理路径和 hash,Angular 完全没有处理,CSS background-image 才有。

解决方案:通常路径可以直接写发布后的路径,hash 可以使用 hash-file.online,总之就是没有工程化了。

相关 Github Issue – Images in templates are not fingerprinted

Angular Team 没有打算去支持它,目前也没有任何 workaround (工程化的方案)。

@Directive 指令不支持 CSS

这个 Github Issue – @Directive should support styles and styleUrls properties 排在第 5 名。

组件可以封装 CSS Styles,独立一个 .css 或者 .scss 文件,这个非常方便。

指令虽然没有 Template,但它的职责是 decorate 组件或 Element。你可以用指令去 add class,但这个 class 的样式谁负责呢?

为什么不可以是指令负责?

这就是大家正在争取的 feature,虽然已经争取了 7 年 (from 2017),而且还是第 5 名,但 Angular Team 任然无动于衷...

Workaround follow Angular Material

也谈不上 workaround 吧,就是一些粗糙的手法。

作为 UI 组件库,Angular Material 自然会遇到这个问题,那它怎么弄呢?

简单 -- 全局 CSS Styles

MatRipple 是一个指令

使用方式

<button matRipple>Submit</button>

在任意一个 Element 上添加 attribute matRipple。

效果

点击后出现波纹。

MatRipple 的 CSS Styles 写在 _ripple.scss 里

咦...它们怎么连上的呢?

指令添加了 class

然后在项目的 styles.scss 里 @use @angular/material + @include mat.core

styles.scss 是全局 CSS Styles,每一个组件都会被 effect 到。

mat.core() 会把 _ripple.scss 放到全局,所以它们就连上了。

这个方案最大的问题就是无法按需打包,无论你有没有用到 MapRipple 指令,_ripple.scss 的 CSS Styles 都会被打包进项目里。

Angular 18+ 高级教程 – Angular 的局限和 Github Issues的更多相关文章

  1. Angular CLI 使用教程指南参考

    Angular CLI 使用教程指南参考 Angular CLI 现在虽然可以正常使用但仍然处于测试阶段. Angular CLI 依赖 Node 4 和 NPM 3 或更高版本. 安装 要安装Ang ...

  2. angular.js高级程序设计书本开头配置环境出错,谁能给解答一下

    server.jsvar connect=require('connect');serveStatic=require('serve-static');var app=connect();app.us ...

  3. NgRx/Store 4 + Angular 5使用教程

    这篇文章将会示范如何使用NgRx/Store 4和Angular5.@ngrx/store是基于RxJS的状态管理库,其灵感来源于Redux.在NgRx中,状态是由一个包含action和reducer ...

  4. Siki_Unity_2-9_C#高级教程(未完)

    Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...

  5. Pandas之:Pandas高级教程以铁达尼号真实数据为例

    Pandas之:Pandas高级教程以铁达尼号真实数据为例 目录 简介 读写文件 DF的选择 选择列数据 选择行数据 同时选择行和列 使用plots作图 使用现有的列创建新的列 进行统计 DF重组 简 ...

  6. ios cocopods 安装使用及高级教程

    CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ...

  7. 【读书笔记】.Net并行编程高级教程(二)-- 任务并行

    前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...

  8. 【读书笔记】.Net并行编程高级教程--Parallel

    一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...

  9. 分享25个新鲜出炉的 Photoshop 高级教程

    网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...

  10. 展讯NAND Flash高级教程【转】

    转自:http://wenku.baidu.com/view/d236e6727fd5360cba1adb9e.html 展讯NAND Flash高级教程

随机推荐

  1. 国内版Unity 6 Preview编辑器无法切换到DX12的解决方案(6000.0.5f1c1已解决)

    先放解决方案的链接:https://www.cnblogs.com/horeaper/p/18200364 6000.0.0f1c1问题依旧,仍然是没有D3D12文件夹: 不仅新文件不加,旧文件(ha ...

  2. PHP中substr() mb_substr() mb_struct()的区别和用法

    PHP substr() 函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函 数,mb_substr() /mb_strcut的 ...

  3. webpack4.15.1 学习笔记(六) — 代码拆分(Code Splitting)

    目录 入口起点 防止重复 动态导入(dynamic imports) 代码拆分能够将代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件.代码拆分可以用于获取更小的 bundle,以 ...

  4. [MAUI 项目实战] 笔记App:程序设计

    前言 有人说现在记事类app这么多,市场这么卷,为什么还想做一个笔记类App? 一来,去年小孩刚出生,需要一个可以记录喂奶时间的app,发现市面上没有一款app能够在两步内简单记录一个时间,可能iOS ...

  5. 阅读翻译Prompting Engineering Guides之Introduction(提示工程简介)

    阅读翻译Prompting Engineering Guides之Introduction(提示工程简介) 关于 首次发表日期:2024-07-19 Prompting Engineering Gui ...

  6. SQL Server 帐号权限管理及C#编程应用(图解)

    昨晚在群里讲解这部分内容,因为好久没操作过了,差点翻车...今天把它整理一下发出来,方便没听明白的小伙伴学习和理解. 我们平时学习数据库时,要么使用sa帐号,要么用windows默认帐号登录,总之都拥 ...

  7. 一文全解:LVM(逻辑卷管理器)

    前两篇文章已经讲了关于磁盘分区和磁盘阵列的相关内容: 一文全懂:Linux磁盘分区 一文全懂:独立冗余磁盘阵列(RAID) 但是磁盘分区完后再想扩容或者缩容就比较麻烦了,甚至很多时候不能扩容或者缩容, ...

  8. Known框架实战演练——进销存业务单据

    本文介绍如何实现进销存管理系统的业务单据模块,业务单据模块包括采购进货单.采购退货单.销售出货单.销售退货单4个菜单页面.由于进销单据字段大同小异,因此设计共用一个页面组件类. 项目代码:JxcLit ...

  9. Windows下UI自动化工具Inspect

    windows系统下的UI自动化工具Inspect是包含在WindowsSDK包里的,所以需要先下载SDK包,然后在SDK包路径下找到Inspect工具并打开使用就可以了. 官网下载链接:https: ...

  10. python中pip安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))…………或无法pip install packname安装依赖包

    问题: 安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connec ...