基于 Ionic 2 多主题、多租户构建方案探索-程序员宅基地

技术标签: ui  json  移动开发  

项目背景

公司的产品是一款2B的在线教育产品,已有的客户大多数都有定制化的需求,主要包括UI主题和二次开发的功能。本文围绕的主要内容是如何基于 Ionic 2 平台提供的工具,实现灵活的多主题方案。

Ionic 2 提供的主题方案

Ionic 2 使用 $color map 的 key 作为组件的输入属性,用于设置组件的样式。$colors map 中的内容如下:

// variables.scss 文件(路径: src/theme/variables.scss )
$colors: {
  primary: #387ef5,
  secondary: #32db64,
  danger: #f53d3d,
  light: #f4f4f4,
  dark: #222,
  favorite: #69BB7B
};

使用示例:

<ion-item-options side="right">
    <button ion-button color="primary" (click)="buttonOne(page.title)">
        <ion-icon name="text"></ion-icon>
        BUTTON 1
    </button>
    <button ion-button color="secondary" (click)="buttonTwo(page.title)">
        <ion-icon name="call"></ion-icon>
        BUTTON 2
    </button>
</ion-item-options>

此外 $colors map 还支持字面量形式,对象内部有 base 和 contrast 属性

  • base: 用于标识组件的背景颜色

  • contract: 用于标识组件的文本颜色

备注:Ionic 框架内部使用 node_modules/ionic-angular/themes/ionic.functions.scss 中的颜色处理函数,解析 map中设置的 base 和 contrast 值。

使用示例:

$colors: (
 twitter: {
       base: #55acee,
    contrast: #ffffff
 },
 facebook: {
     base: #38669f;
    contrast: #ffffff
 }
);

切换 Ionic 的主题:

在 src/theme/variables.scss 文件中导入 Ionic 预置的黑色主题

@import "ionic.build.dark";

自定义主题

  • 修改Variables文件中,$colors map 定义的属性值

  • 覆写已有的变量值

  • 自定义 Sass 变量

  • 自定义组件样式

  • 配置组件的mode(模式)

1.修改Variables文件中,$colors map 定义的属性值

// variables.scss 文件(路径: src/theme/variables.scss )
$colors: (
  primary: #387ef5,
  secondary: #32db64,
  danger: #f53d3d,
  light: #f4f4f4,
  dark: #222,
  favorite: #69BB7B,
  
  twitter:(
      base: #55acee,
      contrast: #ffffff
  ),
  
  facebook:(
      base: #38669f,
      contrast: #ffffff
  )
);

<button ion-button color="facebook" (click)="buttonOne(page.title)">
  <ion-icon name="text"></ion-icon>
  BUTTON 1
</button>

<button ion-button color="twitter" (click)="buttonTwo(page.title)">
  <ion-icon name="call"></ion-icon>
  BUTTON 2
</button>

在任意自定义组件中,可以使用 color 函数获取相应的颜色值:

my-component {
  background: color($colors, twitter, base);
}

2.覆写已有的变量值

$text-color: #686868;
$font-size-base: 1.6rem;
$list-ios-background-color: #ffffff;
$list-md-background-color: #ffffff;
$list-wp-background-color: #ffffff;

Ionic 中可以覆写的 Sass 变量列表:overriding-ionic-variables

3.自定义 Sass 变量

// variables.scss 文件(路径: src/theme/variables.scss )
$colors: (
  ...
);
$my-padding: 20px; // Custom Sass variables

4.自定义组件样式

// about.scss 文件 (路径: myApp/src/pages/about/about.scss)
page-about {
  .isSuccess {
    color: #1E88E5 !important;
  }
  .isError {
    color: #D43669 !important;
  }  
}

about.scss 文件中的内容将会被编译到 main.css文件中

page-home .isSuccess {
    color: #1E88E5 !important;
}
page-home .isError {
    color: #D43669 !important;
}

5.配置组件的mode(模式)

每个平台都有对应的模式:

  • md (Android)

  • ios (iOS)

  • wp (Windows Phone)

  • md (Core - used for any platform other than the above)

我们也可以通过 Ionic 的 Config API 方便地配置 mode 下可配置字段的值,具体如下:

imports: [
  IonicModule.forRoot(MyApp, {
      backButtonText: "",
      backButtonIcon: "md-arrow-back",
      iconMode: "md",
     modalEnter: "modal-md-slide-in",
      modalLeave: "modal-md-slide-out",
      pageTransition: "md"
  });
]

以上的配置信息,用于设置在 iOS 平台下,App 的风格采用 Android material 设计。

我们也可以单独针对特定的平台,进行配置:

imports: [
    IonicModule.forRoot(MyApp, {
    platforms: {
      android: {
            backButtonText: "",
            backButtonIcon: "md-arrow-back",
            iconMode: "md",
            modalEnter: "modal-md-slide-in",
            modalLeave: "modal-md-slide-out",
            pageTransition: "md",
      },
      ios : {
            backButtonText: "Previous",
            backButtonIcon: "ios-arrow-back",
            iconMode: "ios",
            modalEnter: "modal-ios-slide-in",
            modalLeave: "modal-ios-slide-out",
            pageTransition: "ios",
     }
}];

此外,通过 Config API 提供的方法,我们可以在 TypeScript classes 中,方便的设置特定平台下的配置信息,具体如下:

config.set('ios', 'textColor', '#AE1245');

该方法接受三个参数:

  • platform (optional - 'ios' or 'android', if omitted this will apply to all platforms)

  • key (optional - The name of the key used to store our value I.e. 'textColor')

  • value (optional - The value for the key I.e. '#AE1245')

通过 Config API 提供的 get 方法获取配置的值:

config.get('textColor');

我们也能够在组件层级,方便地配置组件,如通过 ion-tabs 的输入属性 tbasPlacement 设置 ion-tabs 组件的显示位置:

<ion-tabs tabsPlacement="bottom">
    <ion-tab tabTitle="Dash" tabIcon="pulse" [root]="tabRoot"></ion-tab>
</ion-tabs>

配置指定平台的样式

Ionic 使用 mode 来定义组件的外观。每个平台都有默认的 mode , 任何 mode 下的样式信息,都能被我们覆写。我们可以在 ion-app 中指定mode的值,具体如下:

<ion-app class="md">

覆写 md 模式下的样式

.md button {
  text-transform: capitalize;
}

覆写 md 下 Sass 变量的值

$button-md-border-radius: 8px;

// Ionic Sass
// ---------------------------------
@import "ionic";

动态的设置组件的属性

<ion-list [attr.no-lines]="isMD ? '' : null"

EXE - 多主题、多租户构建方案

Ionic 2 团队基于 webpack 开发了项目的构建工具 - ionic-app-scripts

Ionic-app-scripts 的功能很强大,通过它我们可以非常灵活地控制项目构建的每个环节。比如,可以通过 command-line 指定某个环节使用的配置文件:

npm run build --rollup ./config/rollup.config.js

此外,也可以在 package.json 文件中设置配置文件的路径和系统构建参数的值:

"config": {
  "t": "sf", // 租户的名称
  "l": "zh-cn", // 默认的语言包
  "ionic_sass": "./config/sass.config.js", // 自定义Sass构建环节的配置文件 
  "ionic_copy": "./config/copy.config.js" // 自定义Copy构建环节的配置文件
}

copy.config.js 文件 - 用于配置项目构建过程中文件拷贝的环节:

// copy.config.js 代码片段
module.exports = {
  copyResources: {
    src: ['{
    {ROOT}}/materials/' + process.env.npm_package_config_t + '/resources/**/*'],
    dest: '{
    {ROOT}}/resources'
  }
}

备注:根目录下的 '{ {ROOT}}/materials/' 目录下,用于存放不同租户自定义的资源,如 icon.png 和 splash.png 等图片资源文件。

sass.config.js 文件 - 用于配置项目构建过程中 Sass 编译的环节:

// sass.config.js 代码片段
module.exports = {
  variableSassFiles: [
    '{
    {SRC}}/theme/variables.scss',
    `{
    {SRC}}/theme/${process.env.npm_package_config_t}.theme.scss` 
  ]
}

备注:不同租户的主题的命名规则:租户名 + .theme.scss 。项目构建时通过动态设置 process.env.npm_package_config_t 的值,来实现动态构建。

我有话说

1.为什么在 variables.scss 文件中 @import "ionic.globals" 、@import "ionic.ionicons" 能正常导入对应的文件:

在 Scss 文件中导入其他依赖的 *.scss 文件,我们一般使用相对路径的方式。但 variables.scss 导入 ionic.globals 或 ionic.ionicons 文件却不是使用相对路径的方式,此外在我们项目的 src 目录下也没有对应的文件。怎么会那么神奇,刚开始接触的时候,我也一脸懵逼。后面通过深入发掘,终于解开了疑惑。

看完下面的代码,你应该也猜到了答案:

// sass.config.js 代码片段
{
  ...,
  includePaths: [
   'node_modules/ionic-angular/themes',
   'node_modules/ionicons/dist/scss',
   'node_modules/ionic-angular/fonts'
  ]
}

总结

目前的主题方案,还比较初级,后续还有很多地方需要优化和升级,我们会持续更新相关的内容,有兴趣的小伙伴可以一起探讨哈。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34187862/article/details/89107231

智能推荐

OpenSuse系列之安装gcc和g++_opensuse g++-程序员宅基地

文章浏览阅读680次。2.1 opensuse默认是不安装gcc的,因此需要我们自己安装。opensuse的包管理器为ZYpp,zypper是原生ZYpp包管理器的命令行界面。我们可以使用zypper来进行安装、删除等操作。在suse上安装gcc,g++首先的,打开suse命令行窗口。_opensuse g++

Android在针式打印机上通过ESC/P指令打印二维码-程序员宅基地

文章浏览阅读1.3k次。Android在针式打印机上通过ESC/P指令打印二维码前言正文前言最近有个需求就是在rk3399上通过usb口打印发票单,各大品牌的针式打印机几乎都没有Android平台的SDK,后查找相关材料发现,可通过ESC/P指令利用usb口通信进行打印。正文1.注册usb服务,打开usb通信,网上相关资料很多,这边简单列举一下,注意配置usb权限private void init(Context context) { mContext = context; mUsbManager = (_esc/p

我的 MacBook M1 使用体验-程序员宅基地

文章浏览阅读1.2k次。点击上方“五分钟学算法”,选择“星标”公众号 重磅干货,第一时间送达 前言 2020年11月11日双十一上午,苹果发布了M1芯片的新款Mac,其最大的变化就是将处理器从Intel换成了苹果自研的ARM芯片M1。 上一次苹果更换Mac芯片要追溯到2006年,14年前,苹果选择从PowerPc转向Intel,事实证明当时的换代给Mac带来了..._mac book m1 使用

acwing蓝桥杯活动-程序员宅基地

文章浏览阅读248次,点赞5次,收藏3次。本题目要求你输出一个由数字组成的等腰三角形。

计算机网络 初中信息技术教案,初中信息技术教案-程序员宅基地

文章浏览阅读326次。其他教案-初识PowerPoint 2000初识PowerPoint 2000一、教学目标 ㈠知识目标 1、使学生了解PowerPoint 2000,学会启动PowerPoint 2000选择幻灯片版式的方法。 2、 学生掌握在幻灯片上文字输入、格式设置的方法。 3、 学生理解建立新幻灯片和插入幻灯片的不同命令。 4、能用PowerPoint 2000制作两页幻灯片。 ㈡能力目标浏览Int..._初中网络文明信息技术教案

python手势识别控制幻灯片翻页系统_实战1.2-利用手势识别器,实现视图的手势控制...-程序员宅基地

文章浏览阅读838次。title: 实战1.2-利用手势识别器,实现视图的手势控制知识预备什么是仿射变换?从视觉效果上来理解,仿射变换是通过一系列原子变换复合而来的变换。包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和错切(Shear)(图像的错切实际上是平面景物在投影平面上的非垂直投影)。iOS 视图的 frame 和 bounds 属性的区别frame 描述了该..._python 手势 操控 ppt

随便推点

模型对象CSS2DObject始终在画布的左上角(问题解决)_three.js css2dobject在模型上方-程序员宅基地

文章浏览阅读516次。我们可以看到 是在设置渲染输入尺寸范围之前调用render方法的,将render方法放到setSize之后即可解决。写了个简单案例模拟一下这个问题,看下图片。下面看下c2渲染器相关代码部分。_three.js css2dobject在模型上方

Android布局文件xml中的android、app、tools_布局文件中tools-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏5次。因此为了在 ide 中预览效果,你必须在 xml 中为 TextView 控件设置 android:text 属性,为了减轻工作量和开发负担,这里就要使用 tools:text 辅助属性。tools可以告诉Android Studio,哪些属性在运行的时候是被忽略的,只在设计布局的时候有效。app 命名空间并不特定于库,它用于应用程序中定义的所有属性,无论是你通过代码还是通过导入的库,它是一个全局命名空间可用于你自定义的属性,即 android 未定义的属性。那它们有什么用和区别呢?_布局文件中tools

Matlab中的符号工具箱_dsolve' 需要 symbolic math toolbox。-程序员宅基地

文章浏览阅读1.2w次,点赞4次,收藏50次。Matlab符号运算是通过集成在Matlab中的符号数学工具箱(Symbolic Math Toolbox)来实现的。和别的工具箱有所不同,该工具箱不是基于矩阵的数值分析,而是使用字符串来进行符号分析与运算。实际上,Matlab中的符号数学工具箱是建立在Maple基础上的,当进行Matlab符号运算时,它就请求Maple软件去计算并将结果返回给Matlab。 Matlab的符号数学工_dsolve' 需要 symbolic math toolbox。

springboot 有bean(mapper、service)却找不到bean的问题解决方案_springboot service找不到bean-程序员宅基地

文章浏览阅读8.6k次,点赞6次,收藏7次。解决方案1在service的实现类添加@Service解决方案2在mapper接口添加@Mapper。如果mapper接口使用@Repository,需要在Application中添加@MapperScan(“com.mapper”)解决方案3在项目的maven包中添加一下依赖 <dependency> <groupId>org.myb..._springboot service找不到bean

[Pytorch]图像在卷积神经网络里都经历了什么?卷积神经网络特征图可视化(以yolov3为例)_yolov3特征图可视化-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏9次。文章目录前言一、Yolov31.Darknet53二、特征图像可视化1.可视化函数2.特征可视化总结前言图像卷积神经网络(Convolution Neural Network ,CNN)是通过Kernel对图像Tensor进行卷积(废话 )从而提取出高维向量,对图像进行分类,目标识别,语义分割。写网络的过程中,不由得好奇每个层中图像被提取出了什么特征,所以简单编写了一个以Yolov3为例的特征层可视化函数。一、Yolov3Yolov3是一个目标识别卷积神经网络,该网络均由Convolutiona_yolov3特征图可视化

spss统计分析基础教程(上)--自学_spss做最大似然估计-程序员宅基地

文章浏览阅读1.3w次,点赞4次,收藏48次。#第二章 SPSS统计分析前准备##2.1数据文件的建立新建数据文件直接打开已有数据文件利用数据库导入数据文本向导导入数据_spss做最大似然估计

推荐文章

热门文章

相关标签