【前端知识体系-CSS相关】CSS工程化方案
1.如何解决CSS的模块化问题?
- 使用Less,Sass等CSS预处理器
- 使用PostCSS插件(postcss-import/precss)
- 使用webpack处理CSS(css-loader + style-loader)
2.PostCSS是什么?
- PostCSS是一个平台,具体要取决于这个平台上面的插件可以做什么
- 常用的插件如下
// 1. 可以添加属性前缀,适应所有的浏览器
const autoprefixer = require('autoprefixer');
// 2. 将所有的import 导入进来的模块全部合并为一个文件
const atImport = require('postcss-import');
// 3. 实现代码的压缩优化
const cssnano = require('postcss-cssnano');
// 4. cssnext提前使用CSS的高级语法
const cssnext = require('postcss-cssnext');
// 5. precss 类似于sass的语法处理
const precss = require('precss')
3.import实现模块的合并(模块分开,提前合并)
4.CSS语法检查,兼容性检查
5.压缩文件
3.CSS modules是什么?如何使用?
- 解决类名冲突的问题
- 使用PostCSS或者Webpack等构建工具进行编译
- 在HTML模板中使用编译过程产生的类名(对象.类名的方式来获取)
4.为什么使用JS来引用,加载CSS?
- JS作为入口,管理资源具有天然优势(HTML,CSS本身是无法管理模块和资源的)
- 将组件的结果、样式、行为封装到一起,增强组件内聚(减少代码耦合)
- 可以做更多的处理(webpack,使用CSS Modules 解决了命名的冲突问题)
5. PostCSS的实现原理说一下?
[!NOTE]
PostCSS是一个通过JS插件转换样式表的工具,它本身并不是一门新的CSS语言,而是一个平台或者是生态心态,提供插件扩展服务即JS API,开发者可以根据这些接口,定制开发插件,
目前比较流行的插件工具如:Autoprefixer 、Stylelint 、CSSnano。
5.1 解析步骤
- 将CSS解析成抽象语法树(AST树)
- 将AST树”传递”给任意数量的插件处理
- 将处理完毕的AST树重新转换成字符串
5.2 处理机制
Source string → Tokenizer → Parser → AST → Processor → Stringifier
5.2.1 Tokenizer
[!NOTE]
将源css字符串进行分词
举个例子:
.className { color: #FFF; }
通过Tokenizer后结果如下:
[
["word", ".className", 1, 1, 1, 10]
["space", " "]
["{", "{", 1, 12]
["space", " "]
["word", "color", 1, 14, 1, 18]
[":", ":", 1, 19]
["space", " "]
["word", "#FFF" , 1, 21, 1, 23]
[";", ";", 1, 24]
["space", " "]
["}", "}", 1, 26]
]
以word类型为例,参数如下:
const token = [
// token 的类型,如word、space、comment
'word',
// 匹配到的词名称
'.className',
// 代表该词开始位置的row以及column,但像 type为`space`的属性没有该值
1, 1,
// 代表该词结束位置的row以及column,
1, 10
]
5.2.2 Parser
[!NOTE]
经过Tokenizer之后,需要Parser将结果初始化为AST
this.root = {
type: 'root',
source: { input: {css: ".className { color: #FFF; }", hasBOM: false, id: "<input css 1>"},
start: { line: 1, column: 1 } ,
end: { line: 1, column: 27 }
},
raws:{after: "", semicolon: false}
nodes // 子元素
}
5.2.3 Processor
经过AST之后,PostCSS提供了大量JS API给插件用
5.2.4 Stringifier
插件处理后,比如加浏览器前缀,会被重新Stringifier.stringify为一般CSS。
6.谈一下你对前端工程化的理解?
参考博客:
【前端知识体系-CSS相关】CSS工程化方案的更多相关文章
- 【前端知识体系-JS相关】对移动端和Hybrid开发的理解?
1.hybrid是什么,为何使用hybrid呢? 概念: hybrid就是前端和客户端的混合开发 需要前端开发人员和客户端开发人员配合完成 某些环节也可能会涉及到server端 大前端:网页.APP. ...
- 【前端知识体系-JS相关】组件化和React
1. 说一下使用jQuery和使用框架的区别? 数据和视图的分离,(jQuery数据和视图混在一起,代码耦合)-------开放封闭原则 以数据驱动视图(只关注数据变化,DOM操作被封装) 2.说一下 ...
- 【前端知识体系-HTML相关】HTML基础知识强化总结
1.如何理解HTML? HTML类似于一份word"文档" 描述文档的"结构" 有区块和大纲 2.对WEB标准的理解? Web标准是由一系列标准组合而成.一个网 ...
- 【前端知识体系-NodeJS相关】对NodeJS模块机制的理解
1. CommonJS模块规范 1.1 模块引用 var math = require('math'); 1.2 模块定义 [!NOTE] 上下文提供exports对象用于导出当前模块的方法和变量,并 ...
- 【前端知识体系-JS相关】ES6专题系列总结
1.如何搭建ES6的webpack开发环境? 安装Node环境 node -v // 10.14.1 安装NPM环境 npm -v // 6.4.1 安装babel npm install @babe ...
- 【前端知识体系-JS相关】JS基础知识总结
1 变量类型和计算 1.1 值类型和引用类型的区别? 值类型:每个变量都会存储各自的值.不会相互影响 引用类型:不同变量的指针执行了同一个对象(数组,对象,函数) 1.2 typeof可以及检测的数据 ...
- 【前端知识体系-JS相关】10分钟搞定JavaScript正则表达式高频考点
1.正则表达式基础 1.1 创建正则表达式 1.1.1 使用一个正则表达式字面量 const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi; 1.1.2 调用RegExp对象的构 ...
- 前端知识体系-NodeJS相关】NodeJS基础知识全面总结
NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...
- 【前端知识体系-JS相关】深入理解JavaScript异步和单线程
1. 为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Jav ...
- 【前端知识体系-JS相关】深入理解MVVM和VUE
1. v-bind和v-model的区别? v-bind用来绑定数据和属性以及表达式,缩写为':' v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用 2. Vue 中三要素的是 ...
随机推荐
- 安装docker 在centos中
http://www.imooc.com/article/16448 http://blog.csdn.net/jeffleo/article/details/70904368
- NOIP2018货币系统
题目大意 给出一组数,求出其中共有多少数不能被其他数表示 解题思路 法一:可爱的动态规划 这个思路还是比较好想的(也比较好写?) 有依赖关系的背包,思路这道题是差不多的 填满型01背包 (关于代码) ...
- 史上最骚最全最详细的IO流教程,没有之一!
目录 1.告白IO流的四点明确 2.File类 1.1 File概述 1.2 构造方法 1.3 常用方法 1.3.1 获取功能的方法 1.3.2 绝对路径和相对路径 1.3.3判断功能的方法 1.3. ...
- C++ 11标准
C++11,也称为C++0x.为目前C++编程语言的最新正式标准(ISO/IEC 14882:2011).它将取代第二版标准ISO/IEC 14882:2003(第一版ISO/IEC 14882:19 ...
- 不离开Emacs完成简单程序的编辑编译运行(windows或Linux)
(1)打开Emacs (2)建立一个新的程序文件. 执行 C-x C-f, 然后在屏幕的底部出现minibuffer,光标提示你输入文件名称, 文件名称要带上后缀名,如hello.cpp.回车,然后开 ...
- django-VIews之HttpResponse(一)
HttpResponse(content,conent_type=None,status=None,charset=None,*args,**kwargst) content:返回给视图的内容 con ...
- Bran的内核开发教程(bkerndev)-07 中断描述符表(IDT)
中断描述符表(IDT) 中断描述符表(IDT)用于告诉处理器调用哪个中断服务程序(ISR)来处理异常或汇编中的"int"指令.每当设备完成请求并需要服务事, 中断请求也会调用I ...
- Flask+WebSocket实现群聊与单聊功能
在开始我们的程序代码之前,先来了解一下相关的基础知识: 1.什么是websocket? (1)WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket ...
- 来玩一局CS吗?UE4射击游戏的独立服务器构建
前言 根据UE4官方文档的介绍,UE4引擎在架构时就已经考虑到了多人游戏的情景,多人游戏基于客户端-服务器模式(CS模式).也就是说,会有一个服务器担当游戏状态的主控者,而连接的客户端将保持近似的 ...
- NOI1995 石子合并 [Luogu P1880]
一道区间dp的模板题,这里主要记一下dp时环形数据的处理. 简略版:方法一:枚举分开的位置,将圈化为链,因此要做n次. 方法二:将链重复两次,即做一个2n-1长度的链,其中第i(i<=n)堆石子 ...