热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js模块化编程

Javascript的模块化编程Javascript在设计之初并没有提供一种原生的,语言级别的模块化方式来组织代码,比如Java语言通过package和import来管理和使用模块

Javascript的模块化编程

Javascript在设计之初并没有提供一种原生的,语言级别的模块化方式来组织代码,比如Java语言通过package和import来管理和使用模块。ECMAScript 6引入了class和import的概念来支持模块化,但是浏览器全面支持这个标准还需要很长时间。

应用程序的模块化指的就是通过一些高度解耦的,存放在不同地方的功能模块构成。近年来随着Javascript应用的复杂化,大型化,Javascript代码需要更为有序的组织,在Javascript社区出现了很多种模块化的实现方式,最主要的两个规范是CommomJS和AMD,本文会重点阐述这两个规范。

1. CommonJS

CommonJS是以在浏览器之外构建Javascript系统而产生的项目,致力于Javascript模块的标准化工作。主要特点是同步加载Javascript模块,运行在服务器端。Node.js 就是CommonJS规范的一个实现。

CommonJS对于模块的定义非常简单,分为模块定义(exports),模块引用(require),模块标示三部分。
通过全局变量 exports 返回当前模块希望提供给其他模块的对象:

技术分享
 1 // 定义行为
 2 function foobar(){
 3         this.foo = function(){
 4                 console.log(‘Hello foo‘);
 5         }
 6 
 7         this.bar = function(){
 8                 console.log(‘Hello bar‘);
 9         }
10 }
11 // 把 foobar 暴露给其它模块
12 exports.foobar = foobar;
技术分享

通过全局函数 require 来导入其他模块的输出:

1 //使用文件与模块文件在同一目录
2 var foobar = require(‘./foobar‘).foobar,
3 test = new foobar();
4 test.bar(); // ‘Hello bar‘

模块标示其实就是传递给require方法的参数,用来指定加载文件路径,可以没有后缀名.js,例如上面例子中的 “./foobar”。

CommonJS模块的代码都运行在模块作用域,不会污染全局作用域,模块可以多次加载,但是结果会被缓存。CommonJS主要是为服务器端Javascript运行库设计的,模块是同步加载的,这使得难以在浏览器中运行CommonJS代码。Node.js上面有一些项目例如Browserify,将CommonJS带进了浏览器,Browserify将依赖到的单独的js文件打包成一个单独的js文件,统一加载到浏览器端。
 

2. AMD

AMD(异步模块定义)是为浏览器环境设计的,采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

模块通过 define 函数定义在闭包中,格式如下:

1 define(id?: String /*可选*/,
2        dependencies?: String /*可选*/,
3        factory: Function|Object /*用来初始化模块或对象的函数*/);

id 是模块的名字,它是可选的参数。dependencies 指定了所要依赖的模块列表,它是一个数组,也是可选的参数,每个依赖的模块的输出将作为参数一次传入 factory 中。factory 是最后一个参数,它包裹了模块的具体实现,它是一个函数或者对象。如果是函数,那么它的返回值就是模块的输出接口或值。

定义一个名为 myModule 的模块,它依赖 foo, bar 模块:

技术分享
 1 define(‘myModule‘,
 2     // 依赖
 3     [‘foo‘, ‘bar‘],
 4     // 依赖(foo 和 bar)被映射为函数的参数
 5     function ( foo, bar ) {
 6         // 返回一个定义了模块导出接口的值
 7         // 在这里创建模块
 8         var myModule = {
 9             doSomething:function(){
10             }
11         }
12         return myModule;
13 });
技术分享

定义一个独立模块,不需要依赖任何其他模块:

define(function () {
    return {
        doSomething: function() {}
    };
});

通过 require 调用模块:

1 require([‘foo‘, ‘bar‘], function ( foo, bar ) {
2         foo.doSomething();
3 });

在模块定义内部也可以使用require来加载其他模块:

技术分享
 1 define(function ( require ) {
 2     var isReady = false, foobar;
 3 
 4     require([‘foo‘, ‘bar‘], function (foo, bar) {
 5         isReady = true;
 6         foobar = foo() + bar();
 7     });
 8 
 9     return {
10         isReady: isReady,
11         foobar: foobar
12     };
13 });
技术分享

上面的例子中 foo 和 bar没有加载完成之前,isReady属性为 false。

目前主要有两个Javascript库实现了AMD规范:require.js和curl.js。RequireJS由James Burke创建,他也是AMD规范的创始人。

3. 结语

CommonJS 则采用了服务器优先的策略,使用同步方式加载模块,而且试图涵盖更多更宽泛的东西,例如文件IO,Promise等等。而AMD 采取了一种浏览器优先的方式来开发,使用异步方式加载模块。它支持对象、函数、构造器、字符串、JSON 以及其它许多类型的模块,运行在浏览器本地环境之中。

由于当前版本的Javascript没有提供原生的模块化支持,社区的开发者进行了很多模块化的探索,使得Javascript工程化成为了可能,CommonJS和AMD就是最主要的两个规范。

 
分类: Javascript

js模块化编程


推荐阅读
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 3DSMAX制作超现实的体育馆模型
    这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 在项目冲刺的最后一天,团队专注于软件用户界面的细节优化,包括调整控件布局和字体设置,以确保界面的简洁性和用户友好性。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 探讨如何在映射文件中处理重复的属性字段,以避免数据操作时出现错误。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
author-avatar
相依相伴一起慢慢变老
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有