【前端知识体系-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 中三要素的是 ...
随机推荐
- 这可能就是你苦苦寻找免费、高颜值、功能强大的 Markdown 编辑器(共5款)
本文作者 | HelloGitHub-小猪蹄 Markdown 是一个轻量级的标记语言,语法简单.容易上手,它深受程序员.博客主等人群的钟爱.随着越来越多的博客系统支持 Markdown,它也开始越来 ...
- 使用git如何规范地向主线提交代码
使用git向主干分支合并代码通常采用两种方式:第一种是merge,第二种是利用BeyondCompare等工具进行比对,将差异合并到主干: 通过merge合并代码出现冲突时,并不清楚谁的修改和谁的修改 ...
- 玩转OneNET物联网平台之HTTP服务③ —— OneNet智能灯 HTTP版本
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- python 读取文件夹中的文件内容
看thinking in java的时候发现有个题的答案不确定结果, 于是下载答案看下,结果是 这个样子的,这样要怎么才能找到相对应的答案?于是我就着手写了一个快速遍历的脚本(我这里只是单纯的找了出来 ...
- Android开发高手课NOTE
最近学习了极客时间的<Android开发高手课>很有收获,记录总结一下. 欢迎学习老师的专栏:Android开发高手课 内存优化 卡顿的原因 频繁 GC 造成卡顿.物理内存不足时系统会触发 ...
- Unity修改脚本后调试
修改脚本后调试有时候需要运行,为了提高效率可以设置编辑器中执行,同时也可以开启有效性检查(即更改面板变量即可刷新代码) [ExecuteInEditMode] public class XXXX: M ...
- Android dos操作
adb shell 开Androidls 列表cd +目录名 打开目 ...
- windows一键还原,阴影卷创建报错,shadowcopy error - User Imposed Limit
windows 系统自带的还原备份功能,底层使用 shadowcopy(阴影卷)技术. 该技术采用了 copy on write 的方式, 当每次有新 IO 时,老的数据会被拷贝出来,然后再写新的 I ...
- vue+uwsgi+nginx部署luffty项目
在部署项目之前本人已经将前端代码和后端代码发布在了一个网站上,大家可自行下载,当然如果有Xftp工具也可以直接从本地导入. django代码 https://files.cnblogs.com/fil ...
- 基于Mustache实现sql拼接
目录 一.前言 二.Mustache语法 三.Mustache拼接sql 一.前言 Mustache语法是一种模板语法,它可以帮我们拼接我们想要的东西.入职新公司,而项目里的sql语句就是用Musta ...