使用Aurelia-CLI进行CSS管理:每个视图都会加载另一个要在站点范围内强制执行的CSS文件,从而导致冲突

Sco*_*ark 7 javascript aurelia aurelia-binding aurelia-cli aurelia-bundling

我有一个包含6个视图(html)的项目.每个视图都有一个对应的视图模型(.js)和一个仅适用于该视图的样式表(.css)

aurelia-cli可以很好地通过我的文件递归递归并将所有.js和.css文件捆绑到几个文件中,以便在减少页面加载时间和大小的同时引用它们.因此,如果我有一个带welcome.html,welcome.js和welcome.css的欢迎文件夹,我可以使用以下内容加载welcome.html的CSS,<require from="./welcome.css"></require><head></head>在页面加载时将CSS注入到标记中.

问题是当我导航到下一个视图时,来自welcome.html/welcome.css的CSS规则仍然在<head>网页的标记内,因此仍然被强制执行.在我的应用程序中访问了所有6个视图后,我现在在<style>标记中有6个标记<head>,所有六个页面中的所有规则都在我去的每个页面上强制执行,直到刷新页面为止没有卸载.毋庸置疑,在访问了几页后,整个网站变得混乱垃圾.

所以我的问题是

  1. 为什么这是一个功能
  2. 我错过了最佳实践吗?
  3. 有没有办法在访问时为页面加载css,在导航时卸载它,并在其中加载新页面css?

如果我有一个10页的应用程序,其中包含全局样式表,bootstrap,动画css和字体真棒,那么在一天结束时,我会将14个冲突的样式永久注入到html中,其余的应用程序将被注入.

有什么建议?

Mar*_*agi 3

在面对类似的情况并进行了长时间的实验后,我得出了一个简单的结论:我不喜欢这种“到处注入 CSS 文件”的方法。请允许我稍微吐槽一下。:)

它有什么好处呢?

  • 我们已经创建了一个组合的全局样式表,其中包含常用的东西(bootstrap、font-awesome 等)。据推测,它位于 的头部部分index.html。当然,因为我们希望在应用程序自行加载之前有一个漂亮的启动屏幕。即使在官方的骨架导航应用程序中
  • 另一个要避免的原因<require>是它的异步特性,这让我们很少(或没有)控制CSS 加载顺序。它非常适合 JS 模块/自定义元素,但不适用于多个 CSS 文件。
  • 最后,<require>每个视图中都放置了这些其他标签,只是为了使我们已经“简单”的情况变得更加“直接”。

那么,以明确的顺序将应用程序样式表的其余部分打包到这个已经存在的全局样式表中不是更容易吗?

我的建议

Aurelia-cli 有一个很棒的功能,称为生成器。您可以根据需要扩展其功能。考虑到这一点,您可以为自定义 CSS 预处理/后处理创建新任务,并将它们插入到构建过程中。

  • 您可以完全控制整个过程。
  • 将创建 1 个缩小文件。它将包含预期 CSS 加载顺序的所有内容。
  • 一个小型应用程序的 CSS 文件大小约为 10-30KB,对吧?它不会伤害。:)

几天前我创建了一个小项目,它也解决了这个问题:aurelia-custom-sculpture。工作演示在这里

  1. 在构建过程中,它会base.css根据全局 deps 和app.css自定义 CSS 文件创建一个。这是出于调试目的。
  2. 这两个文件合并成styles.min.css,在 中部署和引用index.html
  3. 如果您需要创建一个真正的自执行应用程序,无需外部文件,您仍然可以嵌入这 1 个组合样式表。