关于类库的模块化实现

相信很多人都有过自己写个类库的想法,对于一个类库,如何模块化是首先需要考虑的问题,目前js有多种模块化的规范,常见的有CMD,AMD以及ES6自身实现的模块化方案,前两种是社区早期指定的规范,最后一种则是w3c的规范,那么如何让我们自己编写的代码能兼容到这么多种规范呢,或者说,知名的类库都是怎么实现的呢,接下来我们分析一下underscore.js中的实现

    if (typeof exports !== 'undefined') {
        //cmd模块
        if (typeof module !== 'undefined' && module.exports) {
            exports = module.exports = _;
        }
        //ex6模块
        exports._ = _;
    } else {
        //传统导出,将_放置到根变量上
        root._ = _;
    }
//AMD模块
if (typeof define === 'function' && define.amd) {
        define('underscore', [], function () {
            return _;
        });
    }
可以看到,上述代码的实现其实很好理解,只要识别到不同规范所支持的关键字,并按照对应的规范将其导出即可,例如CMD跟es6模块都支持exports关键字,但es6模块不支持module关键字,此处可区分CMD跟es6,AMD模块则用define关键字来做区分,之后根据不同的规范将根变量导出即可,当然,各种类库都会做最原始的导出,将变量导出到root上,此处underscore的实现为root._=_,浏览器端root为window,而服务器端则一般为gobal

猜你喜欢

转载自blog.csdn.net/xiaomingelv/article/details/80386233
今日推荐