先说问题吧。
最近在看 primeng 的源码,框架是支持主题切换的,主题样式使用 sass,主题的切换是通过动态替换全局主题 css 文件来实现的。
1 | changeTheme(event: Event, theme: string) { |
所以想知道在使用 Angular CLI 构建项目过程中这些theme css
如何生成? primeng 源码本身貌似是使用了 gulp,但是 Angular CLI 本身应该也可以做到,一探究竟。
Angular CLI: 6.1.1
Node: 10.7.0
OS: win32 x64
Angular:
…
通过在angular.json
文件的项目build
选项中配置styles
,我们可以添加更多的全局样式:
1 | "architect": { |
其中bundleName
指定了input
里面的样式编译后输出的目录,如果不使用这种对象格式,则会全部一起合并打包生成styles.js
(或者 styles.css)lazy: true
表示只生成该样式,但并不引入到index.html
文件中。否则,会自动在index.html
中引入生成的文件。
使用 –extract-css build 或者 prod 模式则会生成.css
所以如果使用ng run build --extract-css
, 上述配置将会把 resouces 下相应的 theme.scss 编译成 css 并放入 assets/themes 目录下。
另外一个问题,如果使用生产模式编译,最终生成的 css 会附带 hash 串。
通过--output-hashing
可以设置输出 hash 的模式,可能的值有:
none
: no hashing performedmedia
: only add hashes to files processed via [url|file]-loadersbundles
: only add hashes to the output bundlesall
: add hashes to both media and bundles
none is the default for the development target.
all is the default for the production target.
目前想到的解决方法:在 build 完成后,使用脚本去修改名称。类似
1 | // rename.js file - location, right next to package.json |
和
1 | "scripts":{ |
1 | alert('Hello World!'); |
second
[TO BE UPDATED IN FUTURE]
references:
- https://stackoverflow.com/questions/46152593/lazy-load-application-theme-styles-with-angular-cli
- https://github.com/angular/angular-cli/wiki/stories-global-styles
- https://github.com/angular/angular-cli/pull/3885
- https://stackoverflow.com/questions/43257694/custom-bundle-file-name-angular-cli/43258641#43258641