[译] 在 HTTP/2 的世界里管理 CSS 和 JS

本文讲的是[译] 在 HTTP/2 的世界里管理 CSS 和 JS,


使用了 HTTP/2,在网站中传输 CSS 和 JS 将变得完全不同,本文是结合我实践的一份指南。

我们已经听说 HTTP/2 很多年了。我们甚至写了一些关于它的博客。但我们的真正实践并不多。一直到现在。在一些最近的项目中,我把使用 HTTP/2 作为一个目标,并弄清楚如何更好地应用多路复用。本文并不会主要去讲你为什么应该使用 HTTP/2,而是要讨论我是如何管理 CSS 和 JS 的从而解释这一范式转变。

拆分 CSS

这是我们多年来作为最佳实践的反例。但为了汲取多路复用的好处,最好的方式还是把你的 CSS 拆分成更小的文件,这样在每一页只加载必要的CSS。应该像这个例子这样:

<html>
<head>
    <!--每一页都是用的全局样式, header/footer/etc -->
    <link href="stylesheets/global/index.css" rel="stylesheet">
</head>
<body>

    <link href="stylesheets/modules/text-block/index.css" rel="stylesheet">
    <div class="text-block">
        ...
    </div>

    <link href="stylesheets/modules/two-column-block/index.css" rel="stylesheet">
    <div class="two-column-block">
        ...
    </div>

    <link href="stylesheets/modules/image-promos-block/index.css" rel="stylesheet">
    <div class="image-promos-block">
        ...
    </div>

</body>
</html>

没错,<link> 标签放在了 <body> 内部,但不必惊慌,这完全合规。因此对于每一个小的标签块,都可以拥有一个独立的只包含相应 CSS 的样式。假如你正在使用模块化风格构建你的页面,这很容易设置。

管理 SCSS 文件

经过一些实践,这是我整理的 SCSS 文件结构:



CONFIG 文件夹

我使用这个文件夹设置一堆变量:



这里的入口文件是 _index.scss,它引入了所有其他 SCSS 文件,所以我可以访问到一些变量和 mixins。它是这样的:

@import "variables";
@import "../functions/*";

FUNCTIONS 文件夹

顾名思义,它包含了一些常见的 mixins 和函数,每一个 mixin 或函数都对应一个文件。



GLOBAL 文件夹

这个文件夹包含我每一页都使用的 CSS。特别适合放一些类似网站的 header、footer、reset、字体和其他通用样式之类的东西。



index.scss 看起来是这样的:

@import "../config/index";
@import "_fonts.scss";
@import "_reset.scss";
@import "_base.scss";
@import "_utility.scss";
@import "_skip-link.scss";
@import "_header.scss";
@import "_content.scss";
@import "_footer.scss";
@import "components/*";

最后一行引入了所有 components 的子目录,这是将额外全局样式模块化的捷径。

MODULES 文件夹

这是我们 HTTP/2 体系中最重要的文件夹。当我拆分样式到对应的模块,这个文件夹会包含非常非常多的文件。所以我从拆分每一个模块到子目录开始:



每个模块中的 index.scss 是这样的:

// 导入所有的全局变量和 mixin
@import "../../config/index";

// 导入这个模块文件夹中的所有部分
@import "_*.scss";

这样我可以访问到变量和 mixin,然后我可以把模块的 CSS 拆分为许多部分,它们组合成一个单独的 CSS 模块文件。

PAGES 文件夹

实质上这个文件夹和 modules 文件夹一样,但我为了页面特定的内容使用它”。这种更模块化的方式在我们最近做的东西里绝对罕见,但是它很好地把页面的特殊样式拆分出来了。

适配 Blendid

最近所有的项目我们都是用 Blendid 来构建的 。为了实现上文描述的 SCSS 配置,我需要添加 node-sass-glob-importer。一旦装好它,我只需把它添加到 Blendid 的 task-config.js中。

var globImporter = require('node-sass-glob-importer');

module.exports = {
    stylesheets: {
        ...
        sass: {
            importer: globImporter()
        },
          ...
}

duang,这样就完成了管理 SCSS 的 HTTP/2 配置。

彩蛋:Craft 宏

很长一段时间以来,我们在 Viget 都主张使用 Craft,我就写了一个宏来减少这种引入样式的方式:

{%- macro css(stylesheet) -%}
    <link rel="stylesheet" href="/stylesheets{{ stylesheet }}/index.css" media="not print">
{%- endmacro -%}

当我想要引入一个模块的 CSS 文件,我只需这样:

{{ macros.css('/modules/image-block') }}

如果我需要在整个网站上放置样式表引用,这就更简单了。

管理 JS

就像 CSS 一样,我想要把 JS 拆分为模块,这样每一页只加载必要的 JS。一样的,使用Blendid 配置,为了一切正常运转我只需要做一点点微调。

我使用的是 import(),而非 Webpack 的require(),。因此现在的 modules/index.js 文件需要看起来是这样的:

const moduleElements = document.querySelectorAll('[data-module]');

for (var i = 0; i < moduleElements.length; i++) {
    const el = moduleElements[i];
    const name = el.getAttribute('data-module');

    import(`./${name}`).then(Module => {
        new Module.default(el);
    });
}

正如 Webpack 文档中所说:”这个特性内部依赖 Promise。如果你在旧版本浏览器使用import(),记得使用一个 polyfill 来兼容 Promise,比如 es6-promise 或者 promise-polyfill“。

因此我把 es6-promise polyfill 加入到我的入口文件 app.js 中,使其自动兼容。

require('es6-promise/auto');

是的,然后你就可以在 Blendid 开箱即用的模式触发模块生成对应特定的 JS。

<div data-module="carousel">

这很完美吗?

还不,但至少可以引领你开始以合理的方式管理 HTTP/2 资源。随着我们对如何拆分代码来更好地使用 HTTP/2 的思考,我真切地希望这个配置将会越来越完善。





原文发布时间为:2017年9月15日


本文来自合作伙伴掘金,了解相关信息可以关注掘金网站。

时间: 2024-11-05 06:05:26

[译] 在 HTTP/2 的世界里管理 CSS 和 JS的相关文章

CSS开发框架技术OOCSS编写和管理CSS的方法

文章简介:今天最流行的CSS开发框架技术当属OOCSS,尽管还有其他类似的技术存在,如BEM.这些方法试图对CSS采用面向对象的编程原则.尽管样式语言和面向对象的软件设计原则在概念之间存在一定的问题,这些微妙的东西对于一个欠缺经验的开发人员来说可能不会立即显现出来.最令人不 公认的拥有一个编写和管理CSS的方法比什么都要更好.尽管如此,一些开发人员的实践是不利于语义化质量和长期的可维护性.我们要讨论一些被提倡的"CSS框架方法"的问题和作为Web开发人员,我们如何可以更好的解决这些问题

javascript-网站设计中页面css和js问题

问题描述 网站设计中页面css和js问题 最近在写网站,以前写过几个管理网站对外观没什么要求,最近写的这个各种酷炫的要求,所以想请大神帮忙推荐几本学习css和js 的书或者网站,好友大神们写网站的css和js是下载还是自己写呀,要是下载去哪下载比较好呀,写大神 解决方案 锋利的JQuery 解决方案二: js高级程序设计.css多看看模板代码 解决方案三: 其实 你需要学习 js css3 以及html5 解决方案四: 可以参考网上的 但还是自己要懂才行 去看看jquery和js标签库巴 解决方

清除css、js缓存的问题

问题描述 清除css.js缓存的问题 为了解决缓存问题,引进hash,请问以下两种方式效果有不同吗,哪种更好 1 加参数后缀 style.css?85d5fbce27dd2d50e2e2 2 改文件名 style_85d5fbce27dd2d50e2e2.css 解决方案 第一个好点吧,第二个还要多一个步骤修改文件名. 不过有些时候还得看服务端配置,要是有些服务器端是居于文件名进行缓存可能无法更新缓存内容 解决方案二: 如果改完,清楚缓存后页面还没变化 有一个办法: ?ver=0.1">

Minify优化网站:合并多个CSS或者js文件

文章简介:用Minify优化网站性能 合并多个CSS或者js文件. Minify 是用PHP5开发的应用,通过遵循一些Yahoo的优化规则来提高网站的性能.它会合并多个CSS或者JavaScript文件,移除一些不必要的空格和注释,进行gzip压缩,并且会设置浏览器的缓存头.Minify 在设计上和Yahoo的 Combo Handler Service非常像,不过Minify可以合并任何你想要合并的JavaScript和CSS文件. 一般情况下,网站速度的瓶颈都在前端,而最关键的就是资源的加载

简单介绍CSS结合JS的运用

css|js 利用CSS配合Javascript的可以做很多更酷的动态页面效果,在本教程的最后给大家简单介绍一下CSS配合JS的应用.首先,我们要搞清楚事件和动作的概念.在客户端脚本中,JavaScript 通过对事件进行响应来获得与用户的交互.例如,当用户单击一个按钮或者在某段文字上移动鼠标时,就触发了一个单击事件或鼠标移动事件,通过对这些事件的响应,可以完成特定的功能(例如,单击按钮弹出对话框,鼠标移动到文本上后文本变色等). 下面介绍几种常见的事件(还用更多事件,请查阅相关资料): onC

关于选用DOCTYPE及DOCTYPE对页面css及js的影响

css|js|页面 什么是DOCTYPE    DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本.其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来.     要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分:除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效. XHTML

使用Minify合并css和js减少http请求

一个页面可能包含很多的css和js文件,如果能够合并这些文件,能够大大减少网站的http请求,减少日志的产生和用户体验的提高. Minify就是一个能够合并css或js为一个文件的工具,不但可以合并,而且可以压缩.下面介绍一下使用方式: 首先下载Minify 下载地址:https://code.google.com/p/minify/downloads/list 解压后,将里面的min文件夹解压到网站根目录 然后访问http://域名/min 用我的站点做个样例:http://www.yihuo

CSS初级教程-CSS结合JS的运用

利用CSS配合JavaScript的可以做很多更酷的动态页面效果,在本教程的最后给大家简单介绍一下CSS配合JS的应用.首先,要搞清楚事件和动作的概念.在客户端脚本中,JavaScript 通过对事件进行响应来获得与用户的交互.例如,当用户单击一个按钮或者在某段文字上移动鼠标时,就触发了一个单击事件或鼠标移动事件,通过对这些事件的响应,可以完成特定的功能(例如,单击按钮弹出对话框,鼠标移动到文本上后文本变色等). 下面介绍几种常见的事件: onClick:鼠标单击事件.(是指鼠标按下,然后松开时

php ci框架中加载css和js文件失败的解决方法

 在将html页面整合到ci框架里面的时候,加载css和js失败,下面对这个问题进行分析及解决 在将html页面整合到ci框架里面的时候,加载css和js失败,弄了半天发现ci框架是入口的框架,对框架中文件的所有请求都需要经过index.php处理完成,当加载外部的css和js文件的时候要使用base_url()函数处理外部的链接.    比如:    在config配置文件中的base_url为:" localhost:8080/项目名称/ "    在控制器中访问applicati