Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

build-plugin-fusion-css

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

build-plugin-fusion-css

用于修改fusion css-prefix & css-variable作用域

  • 1.0.5
  • latest
  • npm
  • Socket score

Version published
Weekly downloads
3
decreased by-66.67%
Maintainers
1
Weekly downloads
 
Created
Source

build-plugin-fusion-css

build-scripts 插件,用来修改 fusion-based 组件库的 css 的选择器类名前缀& css-variable 作用域。比如:.next-btn => .my-prefix-btn:root = .my-custom-scope

这样做的目的是,控制 fusion 样式的作用范围,让一个页面中可以同时存在多份不同版本的 fusion 样式或者不同主题,同时不会出现样式冲突。

如何使用

build.json 文件中引入 build-plugin-fusion-css

...
"plugins": [
  ...,
  ["build-plugin-fusion-css"]
]

自定义样式类名前缀

在源代码引入组件库样式时,比如混合云主题样式,通过在后面加上?fusionPrefix=.my-prefix 实现:

import '@alicloudfe/components/dist/hybridcloud-no-var.css?fusionPrefix=.custom-prefix-';

它的作用是对这个 css 文件中的 CSS 选择器进行转换,把 .next-btn 的类名修改成 .my-prefix-btn。从而限制 fusion 组件样式作用范围,避免多份 fusion 同时存在时出现样式冲突。

自动 fusion icon 字体隔离

上述用法会自动对 fusion icon 的字体做隔离,避免多份 fusion 出现 icon 冲突。

问题背景:过去,如果一个页面中同时存在多份不同版本的 fusion,并且这些 fusion 对有不同的 icon 定义。那么其中一份 fusion 的 icon 字体会被另一份覆盖,造成前者的 icon 错乱甚至不显示。问题根源是所有 icon 使用了相同的font-family名字NextIcon

如果按照上述方式使用本 loader,它会自动将输入中的这种样式:

@font-face {
  font-family: NextIcon;
  src: url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.eot");
  src: url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.eot?#iefix") format("embedded-opentype"),
    url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.woff2") format("woff2"),
    url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.woff") format("woff"), url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.ttf")
      format("truetype"),
    url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.svg#NextIcon") format("svg");
}

.next-icon {
  display: inline-block;
  font-family: NextIcon;
}

转换成这样:

@font-face {
  font-family: MyPrefixIcon;
  src: url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.eot");
  src: url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.eot?#iefix") format("embedded-opentype"),
    url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.woff2") format("woff2"),
    url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.woff") format("woff"), url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.ttf")
      format("truetype"),
    url("//at.alicdn.com/t/font_1899989_e0hzok75tkg.svg#NextIcon") format("svg");
}

.my-prefix-icon {
  display: inline-block;
  font-family: MyPrefixIcon;
}

因此,每份 fusion 使用的是各自指定的font-family名字,避免 icon 冲突。

限制 fusion reset 样式的影响范围

即使按照上面的方式替换了 fusion prefix,在 fusion 样式中的 reset 样式依然是全局性的,比如

body {
  margin: 0;
}
h1 {
  font-size: 2em;
  margin: 0.67em 0;
}

很多时候,全局 reset 样式不会造成什么问题,因此你可以忽略这一小节。

如果你希望限制这种 fusion reset 样式的影响范围,你可以在 import 的 query 中增加styleContainer,比如:

import "path/to/fusion.css?fusionPrefix=.my-prefix-&styleContainer=my-style-container";

会把上面例子的样式转化成

my-style-container {
  margin: 0;
}
my-style-container h1 {
  font-size: 2em;
  margin: 0.67em 0;
}

自定义 css-variale 作用域

如果想要更改主题变量,我们可以通过在 build-plugin-fusion-css 添加配置项来实现:

...
"plugins": [
  ...,
  ["build-plugin-fusion-css", {
    "oldSelector": ".theme-hybridcloud",
    "newSelector": ".custom-scope"
  }]
]

然后在源代码引入主题变量的时候后面加上 ?customVarScope 即可:

import '@alicloudfe/components/dist/hybridcloud-var.css?customVarScope';

它的作用是将这个 css 文件中的所有 oldSelector 选择器转换成 newSelector。从而限制该主题的 css-variable 作用范围,避免多份主题同时存在时出现样式冲突。

其中 oldSelector 默认值为 :root

示例

Teamix 业务组件样式隔离示例

Keywords

FAQs

Package last updated on 06 Dec 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc