zoukankan      html  css  js  c++  java
  • 【前端知识体系-CSS相关】CSS工程化方案

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

    参考博客:

  • 相关阅读:
    openerp domain 規則
    openerp创建动态视图-fields_view_get
    postgres时间转换函数
    UG NX9.0.0 for linux安装
    OpenERP 源码变更后数据库升级
    在Ubuntu 12 服务器上源码安装 OpenERP 8.0
    OpenERP7.0中非admin帐号新增其它用户问题
    有关WINDOWS XP登录密码的几种方法
    OpenERP对象字段定义的详解
    Openerp workflow 工作流批注模块
  • 原文地址:https://www.cnblogs.com/fecommunity/p/11901411.html
Copyright © 2011-2022 走看看