• 前端模块化规范详解


    ### 一、js模块化

    ```
    命名空间
    commonJS
    AMD/CMD/UMD
    ES6 module
    ```

    ### 二、命名空间


    库名.类别名.方法名

    ```js
    var NameSpace = {}

    NameSpace.type = NameSpace.type || {}

    NameSpace.type.method = function () {

    }
    ```

    ### 三、commonJS规范

    一个文件为一个模块,通过module.export暴露块接口,通过require引入模块,同步执行

    [commonJS 文档](http://wiki.commonjs.org/wiki/Modules/1.1.1)

    示例:

    ```js
    const Router = require('./router/route')

    export = module.exports = createApplication;
    ```

    ### 四、AMD规范

    ```js

    Async Module Definition

    使用define定义模块

    使用require加载模块

    RequireJS

    依赖前置,提前执行
    ```

    [AMD规范文档](https://github.com/amdjs/amdjs-api/wiki/AMD)

    示例:

    ```js
    define(
    // 模块名字
    "alpha",
    // 模块输出
    ["require", "exports", "beta"],
    // 模块输出
    function (require, exports, beta) {
    exports.verb = function () {
    return beta.verb();
    return require("beta").verb();
    }
    }
    )

    define(
    ["a", "b", "c"],
    function (a, b, c) {
    // 等于在最前面声明并初始化了要用到的模块
    if (false) {
    // 即使没用到模块b,但b还是提前执行了
    b.foo();
    }
    }
    )
    ```


    ### 五、CMD

    ```js
    Common module definition

    一个文件为一个模块

    使用define来定义一个模块

    使用require来加载一个模块

    SeaJS

    尽可能懒加载
    ```

    示例:

    ```js
    // 所有模块都通过define定义
    define(function (require, exports, module) {
    // 通过require引入模块
    var $ = require('jquery');
    var Spining = require('./spinning');

    // 通过exports对外提供接口
    exports.doSomething =

    // 或者通过module.exports 提供整个接口
    module.exports =
    })
    ```

    ### 六、UMD

    ```
    Universal Module definition

    通用解决方法

    三个步骤:

    1.判断是否支持AMD

    2.判断是否支持CommonJS

    3.如果都没有,使用全局变量
    ```

    示例:

    ```js
    (function (root, factory) {
    if (typeof define === 'function' && define.amd) {
    define([], factory);
    } else if (typeof exports == 'object') {
    module.exports = factory();
    } else {
    root.returnExports = factory()
    }
    }(this, function () {
    return {}
    }))
    ```

    ### 七、ESM

    ```js
    esmascript module

    一个文件一个模块

    export / import
    ```

    示例:

    ```js
    // 加载模块的变量或方法
    import theDefault, {named1, named2} from 'src/mylib'
    import theDefault from 'src/mylib'
    import {named1, named2} from 'src/mylib'

    // 引入模块进来并且将named1命名为Named1
    import {named1 as myNamed1} from 'src/mylib'

    // 加载模块里全部的变量和方法
    import * as mylib from 'src/mylib';

    // 只加载,不做任何处理
    import 'src/mylib'

    // 定义一个模块,暴露的接口
    export var name1 = "Bob";
    export let name2 = "Bob";
    export let NAME3 = "Bob";

    export function myFunc() {}
    export class MyClass {}

    // 可以选择暴露
    const USERNAME = "Bob";
    function myFunc() {}

    export {USERNAME, myFunc};
    export {USERNAME as NAME, myFunc as Fn};

    // 引入其他文件的变量或方法,再暴露出去
    export * from "src/other_module";
    export {foo, bar} from 'src/other_module';
    export {foo as myFoo, bar} from 'src/other_module';

    export {foo as myFoo, bar} from 'src/other_module'
    ```

    ### 八、webpack支持

    ```js
    AMD(require)

    ES Modules 推荐

    CommonJS
    ```

    ### 九、CSS模块化

    ```
    OOCSS
    SMACSS
    Atomic CSS
    MCSS
    AMCSS
    BEM
    CSS modules
    ```

    Atomic CSS 每个类都是独立的

    MCSS 多层级的css

    AMCSS 针对属性来写css

    BEM:Block,Element,Modifier


    ```html
    <!-- BEM -->
    <button class="button">
    Default Button
    </button>

    <button class="button button--state-success">
    Success Button
    </button>

    <button class="button button--state-danger">
    Danger Button
    </button>
    ```

  • 相关阅读:
    51Nod 1352 集合计数(扩展欧几里德)
    莫比乌斯函数
    Codefroces 919D Substring(拓扑排序+DP)
    Codeforces 918C The Monster(括号匹配+思维)
    平面分割类问题总结
    01字典树(待更新)
    进程同步和互斥??
    进程间的八种通信方式----共享内存是最快的 IPC 方式??
    super() 函数??
    HTTP协议详解??
  • 原文地址:https://www.cnblogs.com/jinly/p/9487382.html
Copyright © 2020-2023  润新知