当前位置: 首页 > news >正文

模块化JavaScript设计模式(一)

在可扩展JavaScript的世界里,假设我们说一个应用程序是模块化(modular)的,那么通常意味着它是由一系列存储于模块中的高度解耦,不同的功能片段组成。在可能的情况下,通过一处依赖性,松耦合能够使应用程序的可维护性更加简单。 假设有效地实现了这点,就非常easy地了解一部分怎样影响还有一个部分。


异步模块定义(AMD)的总体目标是提供模块化的JavaScript解决方式,以便开发人员使用。诞生于使用XHR+eval的Dojo开发经验,这样的格式的支持者希望可以避免未来的不论什么解决方式受到过去解决方式缺点的影响。 AMD模块格式本身就是对定义模块的建议,其模块和依赖都将可以进行异步载入。

AMD最開始是CommonJS重模块格式的草案规范,但因为没有达到广泛的一致,这样的格式的进一步发展就转移到了amdjs社区(https://github.com/amdjs)。


一、模块入门

关于AMD有两个关键概念是值得我们注意的,他们是用于模块定义的define方法和用于处理依赖载入的require方法。试用一下方法,define用于定义已命名或未命名模块:

define(
    module_id /*可选*/,
    [dependencies] /*可选*/,
    definition function /*function for instantiating the module or object实例化模块或对象的函数*/
)


module_id是一个可选參数,它通常仅仅在非AMD 连接工具被使用时才须要。当遗漏这个參数时,我们称这个模块未匿名的(anonymous)。

当使用这个匿名模块时,模块身份的概念是DRY,以便更easy避免文件名称和代码反复。由于代码变得更轻便了,不须要改动代码本身或改变其模块ID,就能够将它非常easy地移动到其它位置。


Developers能够只通过使用AMD优化器在多个环境中执行同样的代码,AMD优化器在CommonJS环境(譬如r.js https://github.com/jrburke/r.js/)下工作。

       define ("myModule",  //定义一个module
            ['foo', 'bar'],
            function (foo, bar) { //模块定义函数,依赖foo  bar 作为參数映射到函数上
                //这里创建你的模块
                var myModule = {
                    dostuff: function () {
                        console.log('yay, stuff');
                    }
                };
                return myModule;
            }
       );
       //第二种定义方式
       define('myModule', ['math', 'graph'], function (math, graph) {
            return {
                plot: function(x, y) {
                    return graph.drawPie(math.randomGrid(x, y));
                }
            }
       });

require通经常使用于载入顶级JavaScript文件或模块的代码。

//foo bar是两个外部模块,两个模块载入以后输出作为回调函数的參数传入
require(['foo', 'bar'], function (foo, bar) {
    //
    foo.doSomething();
})

动态载入依赖

define(function (require) {
    var isReady = false, foobar;
    require(['foo', 'bar'], function (foo, bar) {
        isReady = true;
        foobar = foo() + bar();
    });
    return {
        isReady: isReady,
        foobar: foobar
    }
})


了解 AMD: 插件

//使用AMD能够载入随意格式的内容
//这样的方式能够用于模板依赖,以便在页面载入的时候进行做换肤方面的工作
define(['./templates', 'text!./template.md', 'css!./template.css'], function (templates, template) {
    console.log(templates);
});


尽管在上面的演示样例重包括css!用于载入css依赖,但这样的方法会有一些警告。党css全然被载入时,它不一定全然生效。取决于怎样处理创建过程,它也可能使用css作为一个依赖文件而被包括在优化的文件里,因此,在将css作为载入依赖使用的情况下,一定要慎重。



该演示样例能够简单看作是requirejs(['app/myModule'], function () {}),表明载入器的顶级全局对象被使用。这里演示了怎样使用不同的AMD载入器载入顶级模块nahor,通过使用define()函数,假设塔接受了一个本地模块參数,那么全部require([])的演示样例都适用于curl.js 和 RequireJS这两种类型的载入器。

转载于:https://www.cnblogs.com/bhlsheji/p/4230950.html

相关文章:

  • 码出高效JAVA开发手册(这个应该人手一份)
  • Web前端实践经验总结
  • GitHub(hexo)博客页面访问量错误以及中文乱码解决
  • POJ 3270 置换群问题
  • Amazon Aurora是如何设计原生云关系型数据库的?
  • mysql DEPENDENT SUBQUERY(转载)
  • 技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列
  • C#属性和字段
  • 记录一次自己对nginx+fastcgi(fpm)+mysql压力测试结果
  • 02 Redis关闭服务报错---(error) ERR Errors trying to SHUTDOWN. Check logs.
  • 近况
  • 微软亚洲研究院等提出CNN训练新方法RePr,准确率显著提升
  • 平时遇到一些问题的汇总收集(mvc)
  • 重要知识点:如何降低DNS***的风险
  • [转载]来个强悍的的吧 教你在Mac下隐藏文件,别做坏事哟
  • Angular 4.x 动态创建组件
  • Iterator 和 for...of 循环
  • leetcode46 Permutation 排列组合
  • Redis字符串类型内部编码剖析
  • vue学习系列(二)vue-cli
  • 好的网址,关于.net 4.0 ,vs 2010
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端学习笔记之观察者模式
  • 深度学习中的信息论知识详解
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 转载:[译] 内容加速黑科技趣谈
  • 《码出高效》学习笔记与书中错误记录
  • Linux权限管理(week1_day5)--技术流ken
  • 阿里云ACE认证之理解CDN技术
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)nginx 配置(nginx.conf)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (学习日记)2024.01.19
  • (转) ns2/nam与nam实现相关的文件
  • .Net Core 中间件验签
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 验证控件和javaScript的冲突问题
  • .Net多线程总结
  • .NET序列化 serializable,反序列化
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /var/spool/postfix/maildrop 下有大量文件
  • @ConfigurationProperties注解对数据的自动封装
  • []sim300 GPRS数据收发程序
  • [30期] 我的学习方法
  • [BZOJ 3282] Tree 【LCT】
  • [BZOJ3757] 苹果树
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C#]C# OpenVINO部署yolov8图像分类模型