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

简介: 本文讲的是[译] 在 HTTP/2 的世界里管理 CSS 和 JS,我们已经听说 HTTP/2 很多年了。我们甚至写了一些关于它的博客。但我们的真正实践并不多。一直到现在。在一些最近的项目中,我把使用 HTTP/2 作为一个目标,并弄清楚如何更好地应用多路复用。
本文讲的是[译] 在 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日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
目录
相关文章
|
1月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
21天前
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
|
11天前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
12天前
|
前端开发 JavaScript
用HTML CSS JS打造企业级官网 —— 源码直接可用
必看!用HTML+CSS+JS打造企业级官网-源码直接可用,文章代码仅用于学习,禁止用于商业
54 1
|
17天前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
32 3
|
21天前
|
前端开发 JavaScript UED
如何使用 JavaScript 动态修改 CSS 变量的值?
【10月更文挑战第28天】使用JavaScript动态修改CSS变量的值可以为页面带来更丰富的交互效果和动态样式变化,根据不同的应用场景和需求,可以选择合适的方法来实现CSS变量的动态修改,从而提高页面的灵活性和用户体验。
|
27天前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
78 6
|
2月前
|
前端开发 JavaScript
HTML+JavaScript+CSS DIY 分隔条splitter
HTML+JavaScript+CSS DIY 分隔条splitter
|
2月前
|
JavaScript 前端开发
JavaScript HTML DOM - 改变CSS
JavaScript HTML DOM - 改变CSS
28 4
用CSS+JavaScript打造网页中的选项卡
用CSS+JavaScript打造网页中的选项卡
下一篇
无影云桌面