javascript模块化编程 从入门到实战

DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>javascript模块化编程title>
head>
<body>
    <p>p>
网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑。

Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。

但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块"(module)了。(正在制定中的ECMAScript标准第六版,将正式支持"类"和"模块",但还需要很长时间才能投入实用。)

Javascript社区做了很多努力,在现有的运行环境中,实现"模块"的效果。本文总结了当前"Javascript模块化编程"的最佳实践,说明如何投入实用。虽然这不是初级教程,但是只要稍稍了解Javascript的基本语法,就能看懂。

模块就是实现特定功能的一组方法。


只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块。


<script> /** * 第一部分介绍Javascript模块的基本写法 * */ //一、原始写法 "污染"了全局变量 function m1(){} function m2(){} //二、对象写法 这样的写法会暴露所有模块成员,内部状态可以被外部改写。 var module = new Object({ _count : 0, m1:function(){}, m2:function m2(){} }); module.m1(); module._count = 5; //三、立即执行函数写法 外部代码无法读取内部的_count变量。 var module1 = (function(){ var _count = 0; var m1 = function () {} var m2 = function () { console.log("我是module1上的m2,很高兴认识你!") } return { m1:m1, m2:m2 } })(); // module1.m2() //module1就是Javascript模块的基本写法。下面,再对这种写法进行加工。 // 四、放大模式 (对原始模块功能的扩展) // 如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块 var module2 = (function(mod){ mod.m3 = function(){ console.log("我是module2上的m3,很高兴认识你!") } return mod; })(module1); console.log(module2) // 五、宽放大模式(Loose augmentation) // 在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"。 var module3 = (function(mod){ //... return mod; })(window.module2||{}); // 六、输入全局变量 // 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。 // 为了在模块内部调用全局变量,必须显式地将其他变量输入模块。 var jQuery = {}; var module4 = (function(mod){ //... })(jQuery,module3) // 这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显 /** * 第二部分介绍如何规范地使用模块。 * */ //七、模块的规范 // 目前,通行的Javascript模块规范共有两种:CommonJS和AMD。我主要介绍AMD,但是要先从CommonJS讲起。 // node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。 //八、CommonJS (同步) // 假定的一个math.js模块,加载方式如下 // var math = require('math'); // 调用 // math.add(2,3); //5 // 九、浏览器环境 AMD(异步) //浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。这就是AMD规范诞生的背景。 // AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。 // AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数: // require([module], callback); // 第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样: /** * require([module1,module2,...],function(module1,module2,...){ module1.add(2,3); }); */ // 目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。 /** * 第三部分介绍require.js,进一步讲解AMD的用法,以及如何将模块化编程投入实战。 * */ // 一、为什么要用require.js? // 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。 /** *

你可能感兴趣的:(javascript模块化编程 从入门到实战)