javascript的模块化编程

模块化的历史

  • 什么是模块化?

    模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性。(来自百度百科)

  • 模块化编程(觉得以下理解可以略过…)

    1.软件模块是一套一致而互相有紧密关连的软件组织。它分别包含了程序和数据结构两部份。
    2.现代软件开发往往利用模块作合成的单位。
    模块的接口表达了由该模块提供的功能和调用它时所需的元素。
    3.模块是可能分开地被编写的单位。这使他们可再用和允许广泛人员同时协作、编写及研究不同的模块。

  • 通俗说法

    就我个人理解来说,模块化编程就是通过抽象、封装以及逻辑分离,然后有效地把庞杂无序的功能有条不紊地分割到各个编程源文件里,这里的一个个文件就可以看成是一个个模块。(纯属个人的理解,不当之处欢迎斧正)

注:看到这里也许有人会认为,我就是这样干的啊!那么恭喜你,你已经具有模块化的思想。但是,js不像其他具有概念的编程语言那样天生俱备易于模块化的条件,js模块化的程度往往取决于个人水平

  • 为什么需要js模块化?

    js作为一门可以OO、PO以及Functional的动态语言,最大的不足可能就是文件的分离及组织结合了!

比如下面这张图,为了把功能有逻辑有条理地分离,引用时,竟丑陋…(而且还有注意文件引入的顺序):

除了客户端,还有服务端呢…所以js模块化编程是势在必行的,js模块化有以下几种CommonJS、AMD/CMD、UMD

模拟的模块化

  • 匿名函数+IIFE实现

    (function (){// 属性var width = 10;var height = 10;// 方法var squre = function (w,h){return w * h;}console.log('the squre is',squre(width,height));})();

这种形式实现的模块化,有个致名的弊端就是所有属性和方法都是私有的,外部不可访问,这明显是不符合常理的,模块应该是可以自由组合/分离的。

  • 全局参数传递

    var globalVariable = {};(function (globalVariable){// 私有属性var privateProp = 12;// 公有属性globalVariable.publicProp = 10;// 私有方法var privateFun = function (){};// 公有方法globalVariable.func = function (){};})(globalVariable);

通过传递全局对象到IIFE内部,给它添加私有属性/方法和公有属性/方法,据说jquery使用的就是这种实践。

  • 提供一个对象接口

    var module = (function (){// 定义属性和方法var prop1 = 'private property';var prop2 = 'public property';var method1 = function (){// code here..}var method2 = function (){// code here...}// 如果随对象返回的就是公有属性和方法,反之为私有return {publicProp:prop1,publicMehtod:method1}})();

AMD/CMD

  • AMD(客户端异步加载模块实践1)

业界以requireJS为最佳实践:

// module.js
//定义一个模块
//第一个参数,必须是数组,数组元素是该模块的依赖
define(['jquery'],function ($){// 假设依赖了jquery// code here...可以使用jquery的所有东西console.log('it\'s a module');
});
// 引入模块
// 第一个参数依然是数组,还有第二个可选参数callback函数
require(['./module'],function (){// code here...
});

另外,还可以使用require.config()设置模块的路径

require.config({paths:{jquery:['http://libs.baidu.com/jquery/2.0.3/jqueryhttp://'],module:['./module']}
});
// 上面分别设置了jquery的路径(外部资源),以及内部模块module,然后引入模块就可以更简略,如下:
require(['jquery','module']);

更多详细栗子,可以访问菜鸟教程

  • CMD(客户端异步加载模块实践2)

业界以seaJS为最佳实践:

// 所有模块都通过 define 来定义
define(function(require, exports, module) {// 通过 require 引入依赖var $ = require('jquery');var Spinning = require('./spinning');// 通过 exports 对外提供接口exports.doSomething = ...// 或者通过 module.exports 提供整个接口module.exports = ...});
// seajs 的简单配置
seajs.config({base: "../sea-modules/",alias: {"jquery": "jquery/jquery/1.10.1/jquery.js"}
})// 加载入口模块
seajs.use("../static/hello/src/main")
  • AMD与CMD的区别

1.定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。Sea.js 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 环境中。
2.遵循的规范不同。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。
3.推广理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。Sea.js 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。
4.对开发调试的支持有差异。Sea.js 非常关注代码的开发调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的明显支持。
5.插件机制不同。RequireJS 采取的是在源码中预留接口的形式,插件类型比较单一。Sea.js 采取的是通用事件机制,插件类型更丰富。

详细请查看知乎回答->传送门

CommonJS

服务端NodeJS使用的规范就是CommonJS,使用方法如下:

一个模块文件大概如下:

// module.js
function printStr(){console.log('it\'s a module');
}
//1.
export.method = printStr;
//2.
module.export.method = printStr;

引入模块:

var printStr = require('./module');//1.
method.printStr();//'it's a module'
//2.
method();//'it's a module'

说明:其中导出模块的方式有exportmodule.export,两者的区别是前者导出的方法是在export对象上,而后者直接导出方法本身。

UMD

通用模块规范,实现如下:

;(function  (name,definition) {// 检测上下文环境是否为AMD或CMDvar hasDefine = typeof define === 'function',// 检测上下文环境是否为NodehasExports = typeof module !== 'undefined' && module.exports;if(hasDefine){// AMD或者CMDdefine(definition)}else if(hasExports){// Nodemodule.exports = definition();}else{// 将模块的执行结果挂在window变量里this[name]  = definition();}})('hello',function() {var hello = function  () {};return hello;
});

Good New,Es6标准引入了模块

Es6引入了模块,使用importexport关键字来引入和导出模块

  • 简单栗子
// module.js
// 导出模块
export function fn(){// code here...
}
// 引入模块
import fn from './module';
fn();

:不过,现在Es6模块的支持性还不高,但是如果你已经迫不及待地想使用它,还是有方法滴,deng~利用Babel编译成Es5形式就可以愉快地使用了

参考文献

Es6标准入门——阮一峰 著->传送门
百度百科——模块化

更多原创文章请关注博主个人独立博客——zifengBlog

javascript的模块化编程相关推荐

  1. Javascript 的模块化编程及加载模块【转载+整理】

    http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 本文内容 引入 模块化 最初写法 对象写法 立即执行函数写法 放大模式 宽放 ...

  2. 全面理解ES6模块化编程

    今天我们来学习ES6的模块化系统,如何从模块中导出变量.函数.类,在其他模块中去使用. 在ES6的模块系统中,每个JS文件可以理解为一个模块,模块代码以严格模式执行,所以模块中的变量.函数不会添加全局 ...

  3. (转)Javascript模块化编程(一):模块的写法

    转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的 ...

  4. Javascript模块化编程(一):模块的写法

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...

  5. Javascript模块化编程:AMD规范

    一.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写 ...

  6. Javascript模块化编程require.js的用法

    JS模块化工具requirejs教程(一):初识requirejs http://www.runoob.com/w3cnote/requirejs-tutorial-1.html JS模块化工具req ...

  7. Web前端进阶之JavaScript模块化编程知识

    JavaScript是前端三要素之一,也是很多初学Web前端的人遭遇的第一条拦路虎.很多同学表示JavaScript涵盖的知识点太多太复杂.应用也是五花八门完全摸不着头脑.但只要我们一点一点由基础到进 ...

  8. JavaScript模块化编程知识分享!

    JavaScript是前端三要素之一,也是很多初学Web前端的人遭遇的第一条拦路虎.很多同学表示JavaScript涵盖的知识点太多太复杂.应用也是五花八门完全摸不着头脑.但只要我们一点一点由基础到进 ...

  9. 学习阮一峰Javascript模块化编程,requireJS使用

    使用背景NOW: 网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式. 项目需要一个团队分工协作.进度管理.单元 ...

  10. JavaScript 模块化编程(二):AMD规范

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...

最新文章

  1. java使用线程求素数和1000个0~0.9随机数_求素数(多线程练习题)
  2. SAP Retail for SAP (non-Retail) Experts
  3. 关于JS中的constructor与prototype
  4. 开机报警disk boot sector is to be modified
  5. shell的数组操作
  6. bzoj 4660 Crazy Rabbit——LIS解决“相交”限制的思想
  7. golang web服务器_使用Go制作自己的Web服务器:快速指南
  8. aix服务器设备型号,IBM产品系列和AIX系统版本
  9. 【前端 · 面试 】HTTP 总结(十一)—— HTTPS 概述
  10. 解决Windows下Redis出现“MISCONF Redis is configured to save RDB snapshots”的错误
  11. lcd1602c显示温度语言编程,单片机+lcd1602显示温度汇编语言程序-精确到0.0625度
  12. 如何批量调整图片大小?
  13. 【懒人神器,批量src】Serein,一个可以对无数个网站进行漏洞检测的软件
  14. 如何从哈斯图判断一个偏序集是不是格?
  15. 【数据分享】2022年11月华东地区POI数据分享(上海、江苏、浙江、安徽)
  16. 大于23的男生女生都该看.看完你会变一个人【转】
  17. Android 网络属性详解
  18. 图像融合之泊松融合,原理讲解及C++代码实现(特别适合新手)
  19. windows10新增本地账户
  20. css ime-mode控制输入全角和半角

热门文章

  1. 语义分割之pspnet
  2. MAVEN本地仓库安装及配置
  3. windows系统注册dll文件
  4. 关于电子通信的一些概念
  5. keil5写c语言的步骤,keil5使用C51的详细步骤讲述
  6. 贵阳清镇计算机培训,贵阳清镇电工培训中心
  7. 业务人员不知道如何提出 BI 需求,老板不重视 BI 项目怎么办?
  8. js 获取mac地址和IP地址
  9. Kubernetes tutorial - K8S 官方入门教程 中文翻译
  10. c语言16进制与字符串互转,C语言版的16进制与字符串互转函数