Node Js采用模块方式来管理和组织代码,NodeJs的所有的功能都存在每个模块中
一、什么是模块?
简单说,一个具有特定功能的文件就是一个模块,模块之间可能存在一定的依赖关系,使用模块可以很好的把这些依赖关系整合起来。
二、为什么要使用模块
2.1 解决命名冲突
2.2 提高代码的复用性
2.3 避免依赖管理
2.4 可以实现代码的异步加载,提高页面的加载性能,避免网页失去响应
2.5 有利于团队分工
三、模块规范
目前有三种流行的模块规范:AMD,CMD,Common.js
先简单介绍下:
3.1,AMD:(Asynchronous Module Definition=异步模块定义),这种规范是异步的加载模块,requirejs应用了这一规范,适合客户端浏览器环境。主要解决js文件依赖问题还有js加载时浏览器会停止页面渲染,加载文件越多页面失去响应时间更长;
模块引用方式:
js代码:
define(id?,dependencies?,factory)
创建模块标识为 alpha 的模块,依赖于 require, export,和标识为 beta 的模块
define("alpha", [ "require", "exports", "beta" ], function( require, exports, beta ){ export.verb = function(){ return beta.verb(); // or: return require("beta").verb(); } });
类似与 CommonJS 方式定义
define(function(){ var exports = {}; exports.say = function(){ alert('hello'); }; return exports; });
3.2,CMD:(Common Module Definition), 是seajs推崇的规范,国内大牛玉伯之作。
主要控制JS文件加载时机,当我们需要的时候再加载
define( factory );
define( id?, deps?, factory );
factory 为函数的时候,表示模块的构造方法,执行构造方法便可以得到模块向外提供的接口。
define( function(require, exports, module) { // 模块代码 });
3.3,Common.Js:采用的是同步加载文件方式,只适用于服务端(NodeJs平台)
demo:model.js
var name = "Array" function printName(){ console.log(name); } function printFullName(firstName){ console.log(firstName + name) } module.exports = { printName: printName, printFullName: printFullName } var nameModule = require("./model.js") nameModule.printName() // "Array" nameModule.printFullName("Bob") // "Bob Array"
运行:
注:
-
一个单独的文件就是一个模块,每个模块都是一个单独的作用域,在模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性
-
模块输出:模块只有一个出口,module.exports对象,我们需要把模块输出的内容放入该对象
-
加载模块:加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象,如果请求的模块不能返回,那么"require"必须抛出一个错误
四、模块特点
4.1 独立性。模块的功能代码都是写在一个函数里,模块与模块互不影响
4.2 模块中使用的var 定义变量都是局部变量
4.3 模块有一个模块对象,包含moduleId(模块名),esports(导出对象)
4.4 如果模块中需要暴露方法或属性给外部使用,那么就执行往exports对象上面添加。
4.5 使用一个模块用require(“moduleId”),该方法返回的是模块对象的exports对象。
五,自定义模块
从模块的定义我们知道,一个JS文件就是一个模块,所以定义一个模块,我们只要新建一个JS文件就好
a.js文件
function tellMe(){ console.log(“this is a.js”); }
在a.js文件中我们简单定义了个方法,根据模块的独立性(内部的变量和函数只能在该模块使用)我们只能在当前模块中使用,所以我们可以使用模块内的exports对象(导出对象)输出模块中功能供外部使用。
function sayHi(){ console.log(“hi”); } //非常重要,导出模块功能(供外部使用) exports.tellMe = tellMe;
模块定义完毕,下面就是要使用了,我们在b.js文件中使用a.js模块
b.js
var aa=require("./a.js");//引入模块 aa.tellMe();//使用模块中的功能
注:在文件里面引入模块的话,相对路径必须添加 . / ,不可以省略 . / ,否则会报错 ;可以省略后缀名
运行