1.如何解决CSS的模块化问题?

  1. 使用Less,Sass等CSS预处理器
  2. 使用PostCSS插件(postcss-import/precss)
  3. 使用webpack处理CSS(css-loader + style-loader)

2.PostCSS是什么?

  1. PostCSS是一个平台,具体要取决于这个平台上面的插件可以做什么
  2. 常用的插件如下
        //  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是什么?如何使用?

  1. 解决类名冲突的问题
  2. 使用PostCSS或者Webpack等构建工具进行编译
  3. 在HTML模板中使用编译过程产生的类名(对象.类名的方式来获取)

4.为什么使用JS来引用,加载CSS?

  1. JS作为入口,管理资源具有天然优势(HTML,CSS本身是无法管理模块和资源的)
  2. 将组件的结果、样式、行为封装到一起,增强组件内聚(减少代码耦合)
  3. 可以做更多的处理(webpack,使用CSS Modules 解决了命名的冲突问题)

5. PostCSS的实现原理说一下?

[!NOTE]

PostCSS是一个通过JS插件转换样式表的工具,它本身并不是一门新的CSS语言,而是一个平台或者是生态心态,提供插件扩展服务即JS API,开发者可以根据这些接口,定制开发插件,

目前比较流行的插件工具如:Autoprefixer 、Stylelint 、CSSnano。

5.1 解析步骤

  1. 将CSS解析成抽象语法树(AST树)
  2. 将AST树”传递”给任意数量的插件处理
  3. 将处理完毕的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工程化方案的更多相关文章

  1. 【前端知识体系-JS相关】对移动端和Hybrid开发的理解?

    1.hybrid是什么,为何使用hybrid呢? 概念: hybrid就是前端和客户端的混合开发 需要前端开发人员和客户端开发人员配合完成 某些环节也可能会涉及到server端 大前端:网页.APP. ...

  2. 【前端知识体系-JS相关】组件化和React

    1. 说一下使用jQuery和使用框架的区别? 数据和视图的分离,(jQuery数据和视图混在一起,代码耦合)-------开放封闭原则 以数据驱动视图(只关注数据变化,DOM操作被封装) 2.说一下 ...

  3. 【前端知识体系-HTML相关】HTML基础知识强化总结

    1.如何理解HTML? HTML类似于一份word"文档" 描述文档的"结构" 有区块和大纲 2.对WEB标准的理解? Web标准是由一系列标准组合而成.一个网 ...

  4. 【前端知识体系-NodeJS相关】对NodeJS模块机制的理解

    1. CommonJS模块规范 1.1 模块引用 var math = require('math'); 1.2 模块定义 [!NOTE] 上下文提供exports对象用于导出当前模块的方法和变量,并 ...

  5. 【前端知识体系-JS相关】ES6专题系列总结

    1.如何搭建ES6的webpack开发环境? 安装Node环境 node -v // 10.14.1 安装NPM环境 npm -v // 6.4.1 安装babel npm install @babe ...

  6. 【前端知识体系-JS相关】JS基础知识总结

    1 变量类型和计算 1.1 值类型和引用类型的区别? 值类型:每个变量都会存储各自的值.不会相互影响 引用类型:不同变量的指针执行了同一个对象(数组,对象,函数) 1.2 typeof可以及检测的数据 ...

  7. 【前端知识体系-JS相关】10分钟搞定JavaScript正则表达式高频考点

    1.正则表达式基础 1.1 创建正则表达式 1.1.1 使用一个正则表达式字面量 const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi; 1.1.2 调用RegExp对象的构 ...

  8. 前端知识体系-NodeJS相关】NodeJS基础知识全面总结

    NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...

  9. 【前端知识体系-JS相关】深入理解JavaScript异步和单线程

    1. 为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Jav ...

  10. 【前端知识体系-JS相关】深入理解MVVM和VUE

    1. v-bind和v-model的区别? v-bind用来绑定数据和属性以及表达式,缩写为':' v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用 2. Vue 中三要素的是 ...

随机推荐

  1. python模块-time、datetime

    简单示例: 常用函数封装: # -*- coding: utf-8 -*- # @Time : 2019/8/6 14:37 # @Author : wangmengmeng import datet ...

  2. 后缀数组(SA)

    学习了LRJ神犇的代码.orz. 首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂. 然后对着下面的程序调试(假装你已经会了算法思想) 弄个一个礼拜一下午就能学会了. 该算法 ...

  3. 拒绝黑盒应用-Spring Boot 应用可视化监控

    图文简介 逻辑关系 效果演示 快速开始 1.Spring Boot 应用暴露监控指标[版本 1.5.7.RELEASE] 首先,添加依赖如下依赖: <dependency> <gro ...

  4. Sublime Text 常用快捷键(Mac环境)

    Shift + Cmd + P 显示命令面板 Cmd + P 快速查找目录和文件,跳转到任意地方 Cmd + P 输入 @ ,可以查找文件中的函数 Cmd + P 输入 # ,可以查找文件中的字符 C ...

  5. 通过反射来手写简单的ORM SQlserver

    不说废话,直接上干货,如发现问题,欢迎大家指出,谢谢! //------------------------------------MySQlServerORM [简单 CURD] using Sys ...

  6. OptimalSolution(5)--数组和矩阵问题(2)2

    一.找到无序数组中最小的k个数 二.在数组中找到出现次数大于N/K的数 三.最长的可整合子数组的长度 四.不重复打印排序数组中相加和为给定值的所有二元组和三元组 五.未排序正数数组中累加和为给定值的最 ...

  7. django-URL之include函数(五)

    三种格式:(1)incude(module,namespace=None) from django.urls import path,include from book import urls url ...

  8. 一个普通类就能干趴你的springboot,你信吗?

    先声明本人并不是标题党,如果看了本篇文章并且认为没有得到任何收获,请您随便留言骂我,本人绝不还口,已经对springboot了如指掌大大神,求放过! 不BB了,直接上代码,请各位在自己的springb ...

  9. WebSocket原理及技术简介

    摘要: WebSocket用于在Web浏览器和服务器之间进行任意的双向数据传输的一种技术.WebSocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程.其目的是在We ...

  10. 程序员这十个java题你都会吗?

    前言 不论你是职场新人还是步入职场N年的职场新人大哥大~当然这个N<3~,我能担保你答不对这十个题~不要问我为什么这么自信~,这些个题还是"有水平"的javase的基础题,传 ...