Angular CLI能否将特定于环境的设置传递给Sass变量?
在使用Angular CLI/webpack构建Angular 2应用程序时,我想为几个Sass变量指定值。例如,使一些Angular CLI能否将特定于环境的设置传递给Sass变量?,angular,sass,webpack,angular-cli,Angular,Sass,Webpack,Angular Cli,在使用Angular CLI/webpack构建Angular 2应用程序时,我想为几个Sass变量指定值。例如,使一些url(#{$mybase path}/…)或$fa font path指向生产中的CDN,或者简单地为验收和生产构建设置不同的背景颜色 我喜欢Angular CLI从中选择配置的方式,例如,environments/environment.prod.ts。但我也很乐意为ng build使用额外的命令行参数,但到目前为止运气不佳: 如果没有Angular CLI,我想我可以,
url(#{$mybase path}/…)
或$fa font path
指向生产中的CDN,或者简单地为验收和生产构建设置不同的背景颜色
我喜欢Angular CLI从中选择配置的方式,例如,environments/environment.prod.ts
。但我也很乐意为ng build
使用额外的命令行参数,但到目前为止运气不佳:
- 如果没有Angular CLI,我想我可以,但我不知道如何将该方法与Angular CLI一起使用
- 也许我可以指定一些特定的
的路径以用于所有Sass编译my variables.sccs
- Webpack的sass加载程序,但我不知道是否可以将其用于Angular CLI:
环境变量
如果要在实际条目文件之前预编Sass代码,可以
只需设置
选项。在这种情况下,sass加载程序将不会 覆盖数据
选项,但只附加条目的内容。这是 当某些Sass变量依赖于 环境:数据
{ loader: "sass-loader", options: { data: "$env: " + process.env.NODE_ENV + ";" } }
- 使用TS环境文件获取一些配置值(保存到全局变量或
中的某些内容-我认为在其他文件中加载它时会出现问题)main.TS
- 有两个封装为
,因此它们的SASS文件是全局的的空组件:ViewEncapsulation.None
这两个组件中的每一个都基于您从环境文件中存储的值*ngIf
另一种方法是调用
ng eject
,让CLI将项目转换为一个普通的网页包项目,您可以修改其配置(RC0及以上)。除了Arjan的评论之外,我还通过在.angular CLI.json
中创建多个具有不同.scss
文件的应用程序解决了这个问题
第1步:
为每个环境创建几个带有.scss
文件的文件夹,所有.scss
文件都具有相同的文件名
|- src
...
|- environments
|- environment-scss
|- globalVars.scss
|- environment-prod-scss
|- globalVars.scss
...
在src/environment scss/globalVars.scss中:
$my-base-path: 'YOUR/DEV/PATH'
$my-base-path: 'YOUR/PROD/PATH'
在src/environment prod scss/globalVars.scss中:
$my-base-path: 'YOUR/DEV/PATH'
$my-base-path: 'YOUR/PROD/PATH'
第二步:
在.angular cli.json
中添加多个应用程序,并在每个环境的每个应用程序对象中添加stylepreprocessions
条目
第三步:
在需要环境特定变量的位置导入globalVars.scss
不要使用相对路径
@import "globalVars";
当使用
ng build--app=dev
时,$my base path
将是'YOUR/dev/path'
,当使用ng build--app=prod
时,$my base path
将是'YOUR/prod/path'
,从第6页开始,生产版本的environment.ts
不再自动替换为environment.prod.ts
。相反,它是
对于未来的CLI 6.1,可以很好地对其进行扩展,以便对Sass文件使用相同的机制。只需创建一些environment.scss
和environment.prod.scss
,在Sass文件中引用一些@import./../environments/environment“
中的第一个,并调整angular.json
文件:
“defaultProject”:“ponyracer”,
...
“项目”:{
“波尼拉克”:{
...,
“建筑师”:{
“构建”:{
...,
“配置”:{
“生产”:{
“文件替换”:[
{
“替换”:“src/environments/environment.ts”,
“with”:“src/environments/environment.prod.ts”
},
{
//注意:这需要使用Angular CLI 6.1;请参见下文
“替换”:“src/environments/environment.scss”,
“with”:“src/environments/environment.prod.scss”
}
],
...
最后,使用build--prod
,ng build--configuration=production
或build-ponyracer--configuration=production
进行构建
简单且一致
但是,在Angular CLI 6.1发布之前,请注意上述内容:
目前,文件替换功能仅适用于TS文件。更具体地说,它仅适用于作为Web包编译器主机一部分的文件
显然,bug修复了。…但是:这意味着空组件需要包括所有Sass源(或者至少包括所有使用变量的源),如果许多真实组件都有自己的使用变量的Sass文件,这可能会很麻烦。仅供将来参考:我创建了3个虚拟组件,其中
样式URL
指向,例如,environment.prod.scss
。这些组件设置了一些Sass变量,然后@import
我真实组件用于在其中列出的Sasss样式URL
(现在为空)由于那些真正的组件使用了:host deep
和scoped CSS,我无法将样式设置为全局样式。相反,我重复嵌套:
非常难看,但现在可以使用了。很好,我们测试了,效果很好,并允许我们删除前面答案中引入的虚拟组件。从6.2.2开始,这对我不起作用,我很抱歉最晚阅读7.3版本的其他版本,但这仍然不起作用。这是一个很好的解决方法: