modules
模块的简介
Module 是Node.js中最重要的一个部分也是进行深度开发前的必修课。掌握Module才能真正理解NodeJS的精髓,你会发现从思路上会有极大的扩展。 学会写module就相当于学会了在C#内写类和开发类库一般。
一切从require开始
在nodejs中最常使用的就是 require("模块名") 函数了。require就相当于我们在C#中使用的using关键字,模块相当于某一命名空间下的类库。我们可以通过显式引入或隐式引入两种方式使用require, 先看看这两种方式的区别
var express=require("express"); var router=require("./routers/index");
明显地显式引入只需要模块的名称即可,这要求模块文件处于当前运行目录下的node_modules子目录下且模块需要具有package.json的描述文件。而显式引入则可以存在于项目的任何位置,只需要加入引入路径就可以使用。
显式引入适就于重用度高的模块代码,如果是开源代码的话可直接发布到npm上通过npm命令行在其它的项目中安装引入。如果只存于本地,也可以将其copy至node_modules/[模块名]的目录下,然后加入一个package.json的文件
{ "name": "[模块名]", "description": "模块的描述", "main": "./[模块的js文件名].js" },
这样就可以在实现模块的隐式调用。package.json这个文件大有文章,也是发布至npm上的一个重要的描述文件,对于项目发布会有很大的用处,这里是package.json文件详细说明,如有需要的朋友可以进去详细地了解(英文)。
而对于重用度不高的代码就可以通过相对路径的对文件进入引入,这里值得说明一点的就是路径符号的转义:
"./" -> 指的是当前文件的所在位置
"../" -> 当前文件的父目录
"/" -> 项目根路径
如果当前模板为执行模块,可通过 __dirname 获得当前项目的执行路径的绝对路径。
如何入手
模块的的制编写其实非常简单,新建一个.js文件,在最后通过module.exports导出一个对象实例,或者是一个类型。
例子1:导出实例
var mymodule= { save:function(){ console.log("Save function call"); }, setOption:function() { .... } } module.exports=mymdoule;
调用:
var _m=require("./mymodule"); var _m.save();
这种导出方式直接就是导出mymodule这个实例对象。
例子2:导出类型
var myModule= function() { } myModule.prototype={ save:function() { console.log("Save function call");}, setOption:function() { .... }
} module.exports=myMdoule;
调用:
var m=require("./mymodule"); var _m=new m(); _m.save();
通过类型引出的方式可以更好地控制对象的作用域,应采用闭包的方式将变量尽可能地封闭在模块自身的作用域内这样不会引起模块间引用的变量污染问题。
在Browser端运行模块
在很多情况下我们会碰到服务端的业务逻辑处理与客户端的处理是一样的,过往由于客户端运行的是javascript而服务端运行的是其它的服务端语言,那么也不得不将业务逻辑重写一次。而nodejs则改变了这一切,我们可以将服务代码加上一点判断就可以将其放罢到浏览器端运行。
如:我当前有一个时间格式化的方法,需要支持客户端的运行与服务端运行一至只需要在module.exports 上加上一小段判断:
var timeUtilty={ format:function(val) { return "Date time format " } } if (typeof(window)===undefined) module.exports=timeUtilty;
这样当我们在开发能支持 application offline功能的模块时就省事多了,只需要有一套代码就能在两个端同时处理了, 赞一个!
推荐阅读
NodeJS旅程 : module 不可忽略的重点