css - 如何优化引导程序以避免渲染未使用的 css 代码
问题描述
我们正在开发 vue.js 中的 MVP,我们决定使用 bootstrap 以一致的方式对元素进行样式设置。
现在我们开始将皮肤/主题添加到我们的单页应用程序中,我们发现页面上呈现的 css 存在问题。
我们通过使用更高特异性的 css 选择器成功地覆盖了样式,但我们希望通过删除未使用的“基本”引导 css 代码来优化浏览器中呈现的输出代码。
问题:
我们如何设置我们的环境以使引导 sass 代码输出干净且非冗余的 css 代码?
细节:
- Bootstrap 加载自己的
_buttons.scss
文件 - 在引导程序之后,我们正在加载我们自己的“主题”
_buttons.scss
文件,并且我们设法让我们的 css 具有更高的特异性。 - 我们运行 sass 代码编译器(在 node-sass 上)
- 输出 css 包含引导样式和我们自己的按钮主题样式。(例如,请参见以下屏幕截图)
如您所见,我们自己的按钮样式已按预期应用,但我们仍然继承了引导程序的原始样式。
我们希望只在浏览器中呈现我们的风格。
更新:
我正在处理的 UI 使用了一些直接来自引导程序的类,显然还有一些特定于我们自己的应用程序的类。
有时需要这些类来覆盖引导程序默认样式。
我们不仅需要覆盖颜色(可以通过 自定义_variables.scss
),还需要覆盖其他一些 css 属性。
我们发现自己在为在浏览器中呈现的重复 css 代码而苦苦挣扎,其中应用了我们自己的样式以及默认的引导程序生成的样式,因为它的特异性很低,所以永远不会被应用。
我想知道是否有一种方法可以避免编译不需要在浏览器中呈现的 sass 代码,同时避免在./node_modules/
.
解决方案
以下是覆盖 Bootstrap (4.x) 默认值的方法。
检查源
首先,查看bootstrap.scss内部,您可以在其中看到框架是如何构建的,一个组件一个组件。如果您愿意,可以注释掉不需要的可选组件,以缩小 Boostrap。但现在不要这样做。
接下来,查看_variables.scss内部。浏览此文件,应该清楚所有可自定义的 Bootstrap 样式都在此处定义,包括颜色。因此,您可以让您的自定义颜色不仅适用于按钮,而且适用于整个框架。同样,您现在可以在此处开始更改所需的变量……但不要这样做,因为有最佳实践。
创建自定义文件
与其编辑原始源代码,不如创建一个名为myproject.scss的新源文件,该文件位于 Bootstrap 源文件夹之外的某个位置。通过将所有更改分开,我们可以轻松地进行任何未来的 Bootstrap 升级。
添加变量覆盖
现在您可以开始复制要更改的变量。请注意,_variables.scss中的变量具有!default
标志,这意味着它们可以在其他地方被覆盖。例如,如果您想要不同的辅助颜色,您会发现它定义为$secondary
,因此将其添加到myproject.scss并使用新值:
$secondary: #dd5679;
根据需要添加尽可能多的变量覆盖。
导入引导
之后,将 Bootstrap 导入文件。要么采取bootstrap.scss批发:
@import "relative/path/to/bootstrap/bootstrap";
或者复制粘贴bootstrap.scss的内容,更新路径名,并注释掉不需要的组件:
@import "relative/path/to/bootstrap/functions";
@import "relative/path/to/bootstrap/variables";
@import "relative/path/to/bootstrap/mixins";
...
// @import "relative/path/to/bootstrap/popover";
// @import "relative/path/to/bootstrap/carousel";
@import "relative/path/to/bootstrap/utilities";
@import "relative/path/to/bootstrap/print";
前 3 个导入,“functions”、“variables”和“mixins”是核心而不是可选组件;不要排除他们。
添加项目样式
之后,添加您自己的样式。如果数量很大,请将它们组织到它们自己的部分文件中,例如_mybuttons.scss(部分文件的开头名称带有下划线),然后导入它们。
@import "mybuttons";
您的自定义 Bootstrap 源文件现已准备就绪。
编译成 CSS
生成的myproject.css文件是您要加载的文件,而不是原始的 Bootstrap CSS 文件。
推荐阅读
- android - 如何初始化 Context 以获取已安装应用程序的名称?
- python-3.x - 为什么在物理计算中使用增量时间会产生比预期慢的代码?
- php - 为什么http post请求在guzzle中不起作用但在curl中工作正常
- android - Android 扩展中的实验性功能适用于生产版本
- java - 是否可以将 java 原始和引用对象类型转换为与用户定义对象相同的字节数组?
- redis - 如果我更改了 redis conf 文件中的 IP 和端口,则无法连接 Redis 客户端
- react-native - react-native 上传图片 react-native-fetch-blob
- mysql - phpmyadmin 与 azure 中国
- kdb - 如何在 kdb 中使用类型“c”和“C”
- python - 在 Pandas Dataframe 中访问感兴趣的行之前和之后的行