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的实现原理说一下?

5.1 解析步骤

  1. 将CSS解析成抽象语法树(AST树)
  2. 将AST树”传递”给任意数量的插件处理
  3. 将处理完毕的AST树重新转换成字符串

5.2 处理机制

Source string → Tokenizer → Parser → AST → Processor → Stringifier

5.2.1 Tokenizer

举个例子:

.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

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.谈一下你对前端工程化的理解?

参考博客:

05-12 06:16