zoukankan      html  css  js  c++  java
  • Requirejs原理分析-70行实现简Requirejs

    模块化介绍

    模块化:对功能点的封装和集成

    分类:

    AMD:

    主要是前置依赖,在调用之前把所有的依赖加载完成

    主要是是requirejs

    在window上面添加了全局方法 define/require

    CMD 

    主要是就近依赖,调用的时候可以加载

    主要seajs

    window主要定义了 define 方法,在函数内部传入了 exports/require 来实现依赖

    Commanjs

    同步加载,执行阶段完成,主要用于 node

    在 global 上面定了 exports/requrie/module 对象

    ES6

    主要在编译阶段执行

    全局有 export/import

    实现一个简易的 requirejs

     const loadScript = (url, ck) => {
                const node = document.createElement('script');
                node.type = 'text/javascript';
                node.charset = 'utf-8';
                node.async = true;
                document.querySelector('head').appendChild(node)
                node.src = url;
                node.onload = () => {}
            }
            let moduleName = 'entry'
            let depName = 'entry'
            window.define = function (depends, func) {
                new Module(depName, depends, func)
            }
            const modules = {}
            class Module {
                constructor(name, depends, func) {
                    this.func = func
                    this.name = name
                    this.depends = depends
                    this.deps = []
                    this.parent = moduleName
                    modules[depName] = this
                    if (depends.length < 1) {
                        const res = func()
                        const module = modules[moduleName]
                        module.resolve(this.name, res)
                    } else {
                        let item = depends.shift()
                        depName = item
                        moduleName = this.name
                        loadScript(item, () => {
                        })
                    }
                }
    
                resolve(name, module) {
                    this.deps.push(module)
                    if (this.depends.length > 0) {
                        let item = this.depends.shift()
                        depName = item
                        moduleName = this.name
                        loadScript(item, () => {
                        })
                    } else {
                        const res = this.func.apply(null, this.deps)
    
                        if (this.name === this.parent) return
                        const module = modules[this.parent]
                        module.resolve(this.name, res)
                    }
                }
            }
            window.require = function (depends = [], func) {
                const module = new Module(moduleName, depends, func)
            }
            require(['./test.js', './test4.js'], (t1, t2) => {
                console.log('end' + t1 + t2)
            })
    

      

           代码主要实现了各个js的依赖加载,并未加工处理路径/名称/缓存等

      仅供学习使用。。!

  • 相关阅读:
    .vsdx 在线查看 省的安装 visio 2013了
    桌面整理工具 rolan
    第一节、ES6的开发环境搭建
    $("[lay-id='"+this.id+"']")
    mathAge.call(btn) 函数call 改变函数内 this #js
    viewer && ImageFlow 图片滚动组件 图片点击放大 可以滚轮放大缩小 viewer
    ie11 突然不能加载外部css 很神奇 头部改为 <!DOCTYPE> <html>
    CODE[VS] 1219 骑士游历
    CODE[VS] 1169 传纸条
    CODE[VS] 1010 过河卒
  • 原文地址:https://www.cnblogs.com/jiebba/p/13724396.html
Copyright © 2011-2022 走看看