一个web app有多主题,多环境

2023-11-13

在一个web app应用中,需要有多个运行环境,并且每个运行环境主题也是不一样。

本项目解决方案

import()

http://es6.ruanyifeng.com/#docs/module#import ES6 import() 可以动态加载,可以利用环境变量导入不同文件,

缺点:import() 是异步加载, 加载时,首先同步加载加载 import... from..., 然后加载 import(), 所以加载页面是会突然从一个样式跳到另一个样式。

通过 sass-loader 定义环境变量

https://www.npmjs.com/package/sass-loader 通过环境变量 设置一些共有属性

缺点: 如果样式完全不一样,需要定义的变量太多。

sass-resources-loader

https://www.npmjs.com/package/sass-resources-loader 目的: 所有的sass 文件都会自动@import 公共的样式和变量,方法等。

preprocess-loader 进行webpack 打包预处理

https://www.npmjs.com/package/preprocess-loader

本项目有interviewed-qa和simplyhired-qa两种环境,各个环境主题也是不一样的。

先安装相应插件:

 "preprocess-loader": "^0.3.0",
 "sass-loader": "^7.1.0",
 "sass-resources-loader": "^2.0.0",

新建一个style.js文件

const path = require('path');
const rootPath = path.resolve(__dirname, './../');
const whiteLabel = process.env.WHITE_LABEL === 'simplyhired' ? process.env.WHITE_LABEL : 'default';

module.exports = path.join(rootPath, `frontend/App/Common/Config/Config.${whiteLabel}.scss`);

在App/Common/Config目录下面,新建两个文件,分别配置两种环境的属性值:

default.scss文件

$font-family: "Roboto" !default;
$font-family-url: "Roboto" !default;
$bg-color: #f0f2f5 !default;
$fg-color: white !default;
$border-color: #dfe2e9 !default;
$nprogress-color: #488EFF !default;
$hover-color: #1497FF !default;
$background-light-color: #f2f7ff !default;
...

simplyhired.scss文件

$font-family: "Source Sans Pro" !default;
$font-family-url: "Source+Sans+Pro" !default;
$bg-color: #F3F3F3 !default;
$fg-color: white !default;
$border-color: #D8D8D8 !default;
$active-color: #0275d8 !default;
$nprogress-color: #ff6600 !default;
$hover-color: #ff8822 !default;
$background-light-color: #fff5ef !default;
...

 

在webpack.common.js中加上:

...
const styleConfig = require('./style.js');
...

module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /(node_modules|bower_components)/,
        use: [
          {
          loader: 'babel-loader'
          },{
            loader: 'preprocess-loader',
            options: {
              SIMPLY_HIRED: process.env.WHITE_LABEL,
              ppOptions: {
                type: ['jsx', 'js']
              }
            }
          }
        ]
      },
     ...
    {
        test: /\.s?css$/,
        use: [
          {
            loader: "style-loader"
          },
          {
            loader: "css-loader"
          }, {
            loader: "postcss-loader",
            options: {
              plugins: function() {
                return [
                  require('precss'),
                  require('autoprefixer')
                ]
              }
            }
          }, {
            loader: "sass-loader" // compiles Sass to CSS
          },{
            loader: "sass-resources-loader",
            options: {
              resources: styleConfig,
            }
          },
        ]
      },
    ]
 }

在env文件中加上:

SITE_NAME=the site name

# uncomment it if whitelabel to simple hired
# WHITE_LABEL=simplyhired
WHITE_LABEL=simplyhired

# one of SITE_DOMAIN and EMAIL should be defined
SITE_DOMAIN=interviewed.com
# EMAIL_FROM
# default: employer+ {organization.name} @ {SITE_DOMAIN}
# e.g. employer+indeed@interviewed.com
EMAIL_FROM=employer.simplyhired.com

在App/Common/WhiteLabeled目录下,新建你一下文件:

Index.js

import './Common.base.scss';
// @ifdef SIMPLY_HIRED
import './Common.simplyhired.scss';
// @endif

Common.base.scss

@import url("https://fonts.googleapis.com/css?family=#{$font-family-url}");

body {
  background: $bg-color;
  min-width: 1180px;
  color: #2e3033;

  #app {
    font-family: $font-family !important;
  }
}

.ant-spin-container:after {
  position: relative !important;
}
...

Common.simplyhired.scss

@import url("https://fonts.googleapis.com/css?family=#{$font-family-url}");

body {
  font-family: $font-family, "HelveticaNeue", "Arial", sans-serif;
}

.ant-tooltip,
.ant-dropdown,
.ant-select,
.ant-select-dropdown,
.ant-form,
.ant-modal,
.ant-checkbox-wrapper,
.ant-form-item,
.ant-input,
.ant-table,
.ant-tabs {
  font-family: $font-family, "Chinese Quote", -apple-system, BlinkMacSystemFont,
    "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
    "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji",
    "Segoe UI Emoji", "Segoe UI Symbol" !important;
}

.ant-layout {
  background: $bg-color !important;
}
...

在各个组件的源头导入App/Common/WhiteLabeled,比如:

import React from 'react';
import { Route } from 'react-router-dom';
import withTracker from 'App/Common/HigherComponents/GoogleAnalyticsRoute';
import 'App/Common/WhiteLabeled';


const App = () => (
  <div>
    <Route exact path="/account/sign-in" component={withTracker(LoginApp)} />
  />
);

export default App;

根据siteName属性的配置,启动项目就可以展示不同的环境主题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个web app有多主题,多环境 的相关文章

  • 在什么情况下,使用 HTTP/2 单独加载图像会比使用 HTTP/1.1 中的精灵一次加载所有图像慢?

    HTTP 2 使多路复用连接成为可能 从而消除了与服务器的多个连接的需要 通过单个连接 可以将许多单独的图像发送到客户端 这避免了将多个图像组合成一个并使用 CSS 将其分开的旧图像精灵模式 我很好奇精灵在 HTTP 2 世界中是否仍然会更
  • Radiobutton-带有纯 html/css 的按钮

    是否可以创建像这样的单选按钮JQuery http jqueryui com demos button radio那些 用纯html css thanks 试试这个小提琴 http jsfiddle net mcXm7 1 http jsf
  • Material-UI 中 Box 和 Grid 有什么区别?

    有什么区别Box https material ui com components box box and Grid https material ui com components grid grid在 Material UI 中 何时使
  • IE9 表格布局固定 colspan 不受尊重

    我发现这个主题 我的主题相关但不相同 在 IE9 中的 tds 上使用 cols 和 colspan 进行表格渲染 https stackoverflow com questions 14236408 table rendering wit
  • 内部有图像的 CSS 响应式圆圈

    蓝色div有固定的高度和响应宽度 里面应该有一个相同高度的圆形图像 这是我尝试过的 https jsfiddle net xnkkrhnt 1 https jsfiddle net xnkkrhnt 1 如何使完美的中心圆始终为蓝色 div
  • Bootstrap 3.0:全宽彩色背景,中心紧凑列

    我想要制作一个条纹商业主题 类似于 W3Schools 创建的主题 主题可以找到here http www w3schools com bootstrap bootstrap theme company asp 它的特点是水平部分 由不同的
  • Bootstrap 4.1 中悬停时的下拉菜单

    我有一个网站 我在其中创建了下拉菜单引导程序4 1 https getbootstrap com docs 4 1 dist css bootstrap min css 此时 下拉菜单正在点击 我用来创建下拉列表的 HTML 代码是 div
  • 防止页面跳转到iframe

    我正在尝试通过 iframe 将 wetransfer 集成到网站中 但是当页面加载时遇到问题 它会跳转到页面的一半 因此它专注于 iframe 而不是在页面顶部打开 据我所知 wetransfer 网站上有一个脚本告诉它跳转到该部分 而不
  • 在使用 jQuery 拖动时向元素添加 CSS 类

    是否可以在元素被拖动到特定区域时向其添加 CSS 类 并在元素被删除后替换该类 我并不是到处寻找这个功能 而是只在特定区域寻找这个功能 是的 这当然有可能 jQuery UI 提供了一些方便的选项和事件来执行此操作 对于初学者来说 可拖动元
  • 如何创建一个对角分割的页面,两半是可点击的链接

    我需要创建一个对角分割的登陆页面 像这样的东西 我需要页面的两个区域都是可单击的 并且在最好的情况下 所有内容都应该动态地适应用户的显示器 以便显示器始终分成两半 我该怎么做 我应该使用画布吗 欢迎任何建议 以及如果我使用画布可能的后备方案
  • jQuery Masonry 和 CSS3

    如何在保持砖石布局的同时将 CSS3 过渡与当前图像结合起来 这是我的html div img class bottom src images div
  • Webpack:链接加载器

    当我使用时一切正常ejs loader and html loader分别地 compiles to
  • 没有宽度/高度的 SVG 以自然尺寸渲染

    我有这个 SVG 但没有width or height属性 我有以下 HTML div class block img src https s3 eu vAmfIxVv kiwi svg div 使用以下CSS block display
  • HTML5 安卓开发

    我对制作 Android 应用程序很感兴趣 而我的主要爱好是 Web 开发 现在让我困惑的是 人们用 HTML5 CSS3 JavaScript 语言制作应用程序 这些应用程序是在 Android 手机上的网络浏览器上运行还是像 Andro
  • CSS 关键帧动画的随机“起点”

    我有一个带有垂直滚动背景图像的框列表 keyframes movie 0 background position 50 5 50 background position 50 95 0 background position 50 5 mo
  • 从 CSS 调用 javascript 函数

    我想知道是否有可能以任何方式 button width somePX height somePX button hover onmouseup func button 或类似的东西 我想这会有点酷吗 而不是为每个按钮编写 onmouseup
  • 图像上的文本和背景颜色叠加

    我正在尝试创建一个与图像大小完全匹配的纯色叠加层 并在该叠加层上显示文本 如果可能的话 我想仅使用 HTML 和 CSS 来完成此操作 图像可以是任何大小 并且将调整大小以适合其父容器并居中 像这样的东西 不起作用 HTML div cla
  • 如何将内部 div 与外部 div 的底部对齐?

    我需要将内部 div 与外部 div 的底部对齐 我的代码如下所示 div class myOuterDiv div class div1 floatLeft Variable content here div div class div2
  • 使用 CSS 网格布局跨越所有列/行的项目

    随着 CSS 网格布局模块很快在 Firefox 和 Chrome 中发布 我想我应该尝试了解如何使用它 我尝试用一 个项目创建一个简单的网格a跨越所有行的左侧 其他项目 b c d e等 跨越各个行的右侧 跨越行右侧的项目数量是可变的 因
  • HTML 和 CSS 的基本编码标准 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道它们是否是像 PSR 01 这样的 HTML 和 CSS 基本编码标准 我尝试谷歌搜索和搜索 但没有找到 我建议看看类似的东西

随机推荐

  • linux socket的阻塞和非阻塞设置方法

    非阻塞IO 和阻塞IO 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念 这里对于这两种socket 先做一下说明 基本概念 阻塞IO socket 的阻塞模式意味着必须要做完IO 操作 包括错误 才会 返回 非阻塞IO 非
  • 用c语言打印*图案

    打印出以下图案 include
  • 安卓语音播报封装工具类

    封装类 import android annotation SuppressLint import android content Context import android speech tts TextToSpeech import
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • os.path.isdir()函数的作用和用法-判断是否为目录

    Python编程语言判断是否是目录 在Python编程语言中可以使用os path isdir 函数判断某一路径是否为目录 其函数原型如下所示 os path isdir path 其参数含义如下 path 要进行判断的路径 以下实例判断E
  • mysql知识系列:数据库名称带减号- 创建修改删除时

    说明 create database a b 会提示报错 ERROR 1064 42000 You have an error in your SQL syntax check the manual that corresponds to
  • 使用navicat for mysql连接远程mysql

    我是使用navicat的windows端 连接centos下mysql服务器 其实配过远程连接grant all privileges on to root identified by password 并在服务器控制台打开3306端口就可
  • 服务器操作系统使用相关要求,服务器操作系统的安全要求

    服务器操作系统的安全要求 内容精选 换一换 本文介绍创建裸金属服务器的几种方式 按照向导指引创建裸金属服务器是常见的方式 您可以灵活选择配置项 确保满足业务的需求 详细操作请参见创建裸金属服务器 如果您想快速获取一台裸金属服务器 可以创建快
  • 基于vue的swiper动画轮播图

    以前做轮播都是参照 https www swiper com cn 去做 使用最多的是https github com surmon china vue awesome swiper 这个插件但是 因为介绍不够详细经常性遇到各种问题 直到几
  • [转] PyTorch 0.4新版本 升级指南 no_grad

    转自PyTorch 0 4新版本 升级指南 博主为ShellCollector PyTorch 0 4新版本 升级指南 PyTorch 终于从0 3 1升级到0 4 0了 首先引入眼帘的 是PyTorch官方对自己的描述的巨大变化 PyTo
  • K8s如何在不重新打版本号的情况 更新镜像

    1 重新部署的时候 打上版本号 是不会默认将镜像更新到最新 如果不打版本号 v3 0 11改为latest make docekr push会将镜像更新到最新 2 解决方法 手动将镜像拉到最新 1 用SecureCRT登录上k8s 找到部署
  • YouTube 的视频推荐算法

    转载 https www zhihu com question 20829671 answer 205421638 第一阶段 基于User Video图游历算法 2008年 1 在这个阶段 YouTube认为应该给用户推荐曾经观看过视频的同
  • C++ replace用法

    replace算法 replace函数包含于头文件 include中 泛型算法replace把队列中与给定值相等的所有值替换为另一个值 整个队列都被扫描 即此算法的各个版本都在 线性时间内执行 其复杂度为O n 即replace的执行要遍历
  • C#增删查改

    C 代码都是做后台数据处理的 它将浏览器与数据库互通形成一个动态数据的平台 而C 对于数据处理方式最多的就是查询 新增 修改 删除 以这四个方面为主做数据的处理 根据实际不同的使用 对这四个方法的使用难度也不一样 一 查询 查询方法使用是最
  • 50 亿观众的 “云上奥运”,顶级媒体背后的数智化力量

    东京 2020 奥运会即将闭幕 本届奥运会由于疫情限制 东京地区赛事以无观众的空场形式举行 在无法亲临现场的情况下 全球观众首次以 云上 方式观看奥运 云上奥运 该如何保证赛事的生动性和现场感 缩短观众与赛场之间的距离 随时随地捕捉精彩赛事
  • pydantic学习与使用-8.required-fields必填字段省略号( ...)

    前言 必填字段可以仅用注释来声明 也可以使用省略号 作为值 必填字段 必填字段 可以仅用注释来声明 以下name和age2个字段是必填字段 from pydantic import BaseModel class User BaseMode
  • 社区团购的运营模式是什么?

    社区团购是一种近年来兴起的新型电商模式 它通过社区的力量 以线上线下联动的方式将消费者聚集起来 以优惠的价格和更好的商品为社区居民提供服务 这种模式能够更好地满足社区居民的需求 并且可以有效地提高社区居民的生活质量 运营模式主要分为以下几个
  • 不懂23种设计模式?别灰心,这份核心笔记来帮你,你想知道的都在这里!

    设计模式是软件工程中各种常见问题的经典解决方案 设计模式不只是代码 而是组织代码的方式 假设一行行的代码是砖 设计模式就是蓝图 什么是设计模式 设计模式是解决问题的一种思想 和语言无关 在面向对象软件设计的工程中 针对特定的问题简洁优雅的一
  • Java实现五子棋小游戏(附思路讲解,全部代码,游戏截图)

    本文章是如何实现一个单机版双人五子棋小游戏 通过Swing技术进行可视操作 个人简介 个人主页 码云不秃头 本人是一名大三学生 马上就要变成考研狗啦 通过一学期对Java学习 经过老师的教学 实现单机版的双人五子棋小游戏 大家互相学习 也同
  • 一个web app有多主题,多环境

    在一个web app应用中 需要有多个运行环境 并且每个运行环境主题也是不一样 本项目解决方案 import http es6 ruanyifeng com docs module import ES6 import 可以动态加载 可以利用