前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在HTTP/2中管理CSS和JS

在HTTP/2中管理CSS和JS

作者头像
疯狂的技术宅
发布于 2019-03-28 02:18:05
发布于 2019-03-28 02:18:05
3.5K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行

在HTTP/2的时代里,在你的网站里发布CSS和JS跟以前大不相同了,以下是我实践的一份建议。

我们听说HTTP/2已经很多年了,我们也写过一些相关的博客。但是我们并没有怎么使用它。直到现在,在一些最近的项目里,我把使用HTTP/2设定为一个目标,并且想出怎样最好的使用多路复用特性。这篇文章并不是来说明你为什么需要使用HTTP/2,而是讨论我是怎么在这种规范的转变中管理CSS和JS的。

拆分CSS

这是我们多年以来的最佳实践的反例。但是为了利用多路复用特性,最好把你的CSS拆分到更小的文件里,这样在每个页面中只加载需要的CSS。像下面这个例子这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
<head>
  <!-- 每个页面都使用的全局CSS, 头部/底部/其他 -->
  <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>

是的,这些都是在标签内部. 但是,不要紧张,在规范中并没说不让这样用。对于每个小的标签块,你的样式可以拆分为只包含对应的CSS。假设你正在使用最近很流行的模块化搭建你的页面,这很容易设置。

管理你的SCSS文件

经过一些试验,这是我最后整理的SCSS文件目录结构:

config 文件夹

我用这个文件夹来设置所用的变量。

这里最主要的文件是_index.scss,它用来输入到其他SCSS文件,这样我可以获取到变量或者mixins。里面是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@import "variables";
@import "../functions/*";
functions 文件夹

这个文件夹自身就完美的解释了它的含义;它包含了自定义的mixinsfunctions(方法),每个文件代表了一个mixins或者function(方法)

global 文件夹

这个文件夹是我在每个页面都有用到的CSS。适用于网站的头部,底部,重置,字体,和其他通用样式。

index.scss如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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/*";

最后一行是输入到整个组件目录的子文件夹里,在模块化中避免额外的全局样式是个捷径。

modules 文件夹

在我们的HTTP/2设置中这是最重要的文件夹。当我拆分样式到对应的模块,这个文件夹会包含非常非常多的文件。所以一个子文件夹就是一个模块:

然后,每个模块的index.scss就像下面这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Pull in all global variables and mixins
@import "../../config/index";

// Pull in all partials in this module's folder
@import "_*.scss";

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

pages 文件夹

事实上这个文件夹跟modules文件夹基本一样,但我用来放页面的特殊样式。这种更细化的模块化在我们这些天做的东西里绝对罕见,但是它很好的把页面的特殊样式拆分出来了。

调整 Blendid

我们这些天做的大多数项目都是用Blendid来构建的。为了获取上述SCSS配置,我需要添加node-sass-glob-importer package。当我安装完成后,我只需要把它添加到Blendid的task-config.js文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var globImporter = require('node-sass-glob-importer');

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

biu的一下,我就搞好了HTTP/2的SCSS配置。

福利: Craft 宏(可以理解为模板的意思)

我们在Viget(作者公司)很长一段时间都主张使用Craft,我就写了一个宏模板来减少这种方式下引入样式的重复性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{%- macro css(stylesheet) -%}
  <link rel="stylesheet" href="/stylesheets{{ stylesheet }}/index.css" media="not print">
{%- endmacro -%}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`{{ macros.css('/modules/image-block') }}`

这让我在处理站点中的样式关系更简单点。

管理 JS

嗯,就像我处理CSS一样,我希望把JS拆分成模块,这样每个页面只需要加载其所需的JS。接着,使用Blendid 配置,我只需要做一点微调就可以正常工作了。

相对于使用Webpack的require(),我需要使用import()modules/index.js文件就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(),记得用类似 es6-promise 或者 promise-polyfill 来兼容Promise。”

我安装了es6-promise,并引入到我的app.js文件中,实现自动兼容。

So I can easily drop in the es6-promise polyfill into my main app.js file and have it polyfill automatically:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`require('es6-promise/auto');`

是的,你就可以使用在Blendid中提及的方式来生成JS模块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`<div data-module="carousel">`

完美吗?

不,但至少让你知道一种标准的方法来管理你的HTTP/2资源。随着我们思考如何更好的利用HTTP/2来分离代码,我非常期待这份方案会越来越完善。


往期精选文章

ES6中一些超级好用的内置方法

浅谈web自适应

使用Three.js制作酷炫无比的无穷隧道特效

一个治愈JavaScript疲劳的学习计划

全栈工程师技能大全

WEB前端性能优化常见方法

一小时内搭建一个全栈Web应用框架

干货:CSS 专业技巧

四步实现React页面过渡动画效果

让你分分钟理解 JavaScript 闭包



小手一抖,资料全有。长按二维码关注京程一灯,阅读更多技术文章和业界动态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京程一灯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈 Css 规范
BEM(Block-Element-Modifier)是一种 CSS 模块化方法,旨在简化 CSS 编写并提高代码的可读性和可维护性,它将 HTML 元素划分为三个部分: 块(block)、元素(element) 和 修饰符(modifier)。
唐志远
2024/03/31
1110
浅谈 Css 规范
翻译 | 关键CSS和Webpack: 减少阻塞渲染的CSS的自动化解决方案
摘要总结:本文介绍了一种用于Web应用程序的基于关键CSS和Webpack的代码拆分和优化方法。该方法通过将关键CSS与Webpack生成的非关键CSS进行拆分,在提高页面加载速度的同时,保留对关键CSS的访问权限,适用于对性能要求较高的Web应用程序,同时具有较好的可维护性。
iKcamp
2018/01/04
2K0
翻译 | 关键CSS和Webpack: 减少阻塞渲染的CSS的自动化解决方案
CSS Modules入门教程
或者可以这么说,CSS Modules为我们解决了什么痛点。针对以往我写网页样式的经验,具体来说可以归纳为以下几点:
糊糊糊糊糊了
2018/09/28
2.6K0
CSS Modules入门教程
使用 webpack 4 和 Babel 7 构建 React 应用及如何引入 Material Design
在过去的一年和一些人中,我一直在与 Creative Tim 合作。 我一直在使用 create-react-app 来开发一些不错的产品。 有很多客户询问如何在 Webpack 上迁移我们的产品模板。
前端小智@大迁世界
2019/03/15
9.4K0
使用 webpack 4 和 Babel 7 构建 React 应用及如何引入 Material Design
Vue项目使用CSS变量实现主题化
主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件。现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了。最近,使用CSS变量在Vue项目中做了一个主题化实践,下面来看看整个过程。
用户6167509
2019/11/24
1.2K0
webpack工程化及其配置指北(1)
现在前端脚手架工具已经非常智能化了。早年刚入行我曾经自己在项目里配过webpack,上午面向百度配置的内容,下午就重复不出来了。后来查了一个下午,才去看package.json,发现下午webpack从我上午用的2.x升级到4.x了。语法有了大变样。如果你面向百度百度编程,webpack部分是一定要带版本号的。
一粒小麦
2019/08/22
6000
【Webpack】319- Webpack4 入门手册(共 18 章)(上)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/20
1.8K0
【Webpack】319- Webpack4 入门手册(共 18 章)(上)
最新前端Vue代码风格指南大全
参照项目命名规则,有复数结构时,要采用复数命名法。例:docs、assets、components、directives、mixins、utils、views。
江一铭
2022/06/16
3.7K0
最新前端Vue代码风格指南大全
一篇史上最全面的 Vue 代码风格指南,建议收藏
参照项目命名规则,有复数结构时,要采用复数命名法。例:docs、assets、components、directives、mixins、utils、views。
前端达人
2021/08/10
2K0
nodejs+express+jade给我baby做个小相册
去年年底迎来了my little star。从此人生多了一个最重要的牵挂。生了宝宝全家人都太忙了。最近宝宝稍微大点了,终于有空可以研究下技术了。这是14年第一帖。废话不多了。开始吧 1.安装NTVS
MJ.Zhou
2018/01/04
1.5K0
nodejs+express+jade给我baby做个小相册
vue引入各类ui库 原
本身集成并没有vue的部分,我们采用的方式是把ui-css部分拿来使用,js效果自己用jquery写到methods里
晓歌
2018/12/20
6.2K0
vue引入各类ui库
                                                                            原
Next.js的创建与使用
NextJs是React的服务器渲染框架,区别于官方SSRNext最大的特点是可以渲染出Ajax异步请求渲染出来的结果,本网站目前使用的前端框架就是NextJs
用户6256742
2022/07/06
4K0
Next.js的创建与使用
webpack原理与实战
webpack是一个js打包工具,不一个完整的前端构建工具。它的流行得益于模块化和单页应用的流行。webpack提供扩展机制,在庞大的社区支持下各种场景基本它都可找到解决方案。本文的目的是教会你用webpack解决实战中常见的问题。
IMWeb前端团队
2019/12/03
6640
Rails 7 中引入 Bootstrap 5
在 Rails 6 中有两种不同的工具可以用来管理前端的 CSS、JavaScript 以及 images 等资源,分别是 “Sprockets” 和 “Webpacker”,“Sprockets” 除了 Rails 应用外很少使用,但是 “Webpacker” 不仅在 Rails 中,在其他应用框架中也被广泛的使用。
RiemannHypothesis
2023/02/20
3.1K0
Rails 7 中引入 Bootstrap 5
Webpack实战-管理多个单页应用
本文主要讲解了如何利用Webpack构建一个单页应用程序,并通过代码示例讲解了如何配置Webpack和构建单页应用程序。同时,还介绍了如何使用AutoWebPlugin插件简化Webpack配置,以及利用插件生成单页应用程序的代码。
IMWeb前端团队
2018/01/08
1.9K0
Webpack实战-管理多个单页应用
将博客主题替换成 Clean Blog
在此之前,我们先为前端资源创建对应目录,在根目录下创建 resources 目录,然后在该目录下新建 js、sass 子目录,分别用于存放编译前的脚本、样式文件。
学院君
2020/09/11
7430
前端换肤的N种方案,请收下
原文链接:https://juejin.im/post/5e92ad7a518825736c5b91cd
ConardLi
2020/06/29
2.2K0
前端换肤的N种方案,请收下
用 vite 2 平滑升级 vue 2 + webpack 项目实战
之前的 webpack 命令加前缀(如:"webpack:build"),继续可用
PHP开发工程师
2022/03/10
1.6K0
用 vite 2 平滑升级 vue 2 + webpack 项目实战
Django来敲门~第一部分【8.网页中的css/js/image处理】
通常情况下,网页开发时,页面中的样式是通过外部css样式进行处理的,外部的css文件加载在Django中,需要进行简单的处理
大牧莫邪
2018/08/27
5450
node.js + mongodb 原
想写博客很长时间了,因为一直身患懒癌,所以一直拖到了现在。markdown的语法也是刚刚学,试验一下效果 好了不说了,直接上干货了。 ------------------------------------------------------------------------------------------------
笔阁
2018/09/04
2K0
node.js + mongodb 
                                                                            原
相关推荐
浅谈 Css 规范
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文