【JS】手动实现插件内部模块化共享

实现逻辑:

1. 外层IIFE,防止全局污染。携带root对象, factory函数,
2. 执行factory函数,携带模块库(modules),{key: values}键值对
3. 定义内部模块库,公用加载函数__webpack_require__,注册后绑定当前模块、公用加载函数,下次调用直接返回模块
4. 初始化全局属性、对外抛出构建对象
5. 通用模块注册(挂载到全局)

Tips: 内附流程图,配合食用更佳哦~


;(function webpackUniversalModuleDefinition(root, factory) {
    // Webpack通用模块定义
    if (typeof exports === 'object' && typeof module === 'object')
        module.exports = factory();
    else if (typeof define === 'function' && define.amd)
        define([], factory);
    else if (typeof exports === 'object')
        exports["Mock"] = factory();
    else
        root["Mock"] = factory();
})(this, function factory() {
    return (function (modules) {
        var installedModules = {}; 
        // 公用加载函数 
        // 模块注册后绑定module、__webpack_require__
        function __webpack_require__(moduleId) {

            if(installedModules[moduleId])
                return installedModules[moduleId].exports;

            var module = installedModules[moduleId] = {
                exports: {},
                id: moduleId,
                loaded: false
            };
            // 携带当前库、加载函数
            modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
            module.loaded = true;
            
            return module.exports;
        }
        
        return __webpack_require__('init'); // 初始化构建
    })({
        // 初始化插件、对外抛出
        init: function (module, exports, __webpack_require__) {
            var utils = __webpack_require__('utils');
            var Mock = {
                _toString: utils.toString,
            }
            module.exports = Mock
        }
        , utils: function (module, exports, __webpack_require__) {
            module.exports = {
                toString: __webpack_require__('handle')
            }
        }
        , handle: function (module, exports, __webpack_require__) {
            module.exports = function (target) {
                return target.toString()
            }
        }
    })
});

console.log(Mock._toString(["1", "2", "3"]));

简单实现,以讲述模块化的一些核心理念,如有不足之处,多多担待,给点宝贵意见更好啦0.0

流程图
内部模块化共享-流程图



 

发布了18 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41597258/article/details/101701350