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 不可忽略的重点的更多相关文章

  1. NodeJs 的Module.export 和 export

    NodeJs  的Module.export 和 export 是一样的. 但是Module.export ={....} 可以起效,.export ={....} 是失效的. 这里的export  ...

  2. nodejs 中module.exports 和 exports 区别详细介绍

    你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例 ...

  3. ES6的export与Nodejs的module.exports

    原文:https://www.cnblogs.com/lxg0/p/7774094.html module.exports与exports,export与export default之间的关系和区别 ...

  4. 理解nodejs的module模块儿

    module 在 Node.js 模块系统中,每个文件都视为独立的模块,node在运行某个模块儿时会生成一个module对象 Module { id: '.', exports: 2, parent: ...

  5. nodejs request module里的json参数的一个坑

    今天工作的时候遇到一个坑,在客户端用nodejs给服务器发送HTTP请求,服务器老是报错:In the context of Data Services an unknown internal ser ...

  6. 理解nodejs的module

    module 在 Node.js 模块系统中,每个文件都视为独立的模块,node在运行某个模块儿时会生成一个module对象 Module { id: '.', exports: 2, parent: ...

  7. NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename

    转载于: http://blog.csdn.net/bugknightyyp/article/details/17999473 module.filename:开发期间,该行代码所在的文件. __fi ...

  8. NodeJS旅程 : express - nodejs MVC 中的王牌

    express 正如ASP.NET MVC 在作为.net平台下最佳的 Mvc框架的地位一样,express在 node.js 环境也有着相同的重要性.在百度上 "nodejs expres ...

  9. nodejs addon/module

    https://github.com/nodejs/node-addon-examples https://github.com/nodejs/node-gyp http://skitr.com/20 ...

随机推荐

  1. 实现一个协程版mysql连接池

    实现一个协程版的mysql连接池,该连接池支持自动创建最小连接数,自动检测mysql健康:基于swoole的chanel. 最近事情忙,心态也有点不积极.技术倒是没有落下,只是越来越不想写博客了.想到 ...

  2. [翻译] 提升树算法的介绍(Introduction to Boosted Trees)

    [翻译] 提升树算法的介绍(Introduction to Boosted Trees) 1. 有监督学习的要素 XGBoost 适用于有监督学习问题.在此类问题中,我们使用多特征的训练数据集 \(x ...

  3. JAVA基础|从Class.forName初始化数据库到SPI破坏双亲委托机制

    代码托管在:https://github.com/fabe2ry/classloaderDemo 初始化数据库 如果你写过操作数据库的程序的话,可能会注意,有的代码会在程序的开头,有Class.for ...

  4. 小程序push数组,渲染不出来解决办法

    1.在data中,定义一个空数组: zhou_time:[] 2.声明: var zhou_time = this.data.zhou_time; 3.PUSH赋值: zhou_time.push({ ...

  5. 转 10 个 Nginx 的安全提示

    Nginx是当今最流行的Web服务器之一.它为世界上7%的web流量提供服务而且正在以惊人的速度增长.它是个让人惊奇的服务器,我愿意部署它. 下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你 ...

  6. Unicode,GBK,GB2312,UTF-8概念基础(转载)

    第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础本部分采用重用,转载一篇文章来完成这部分的目标.来源:holen'blog   对字符编码与Unicode,IS ...

  7. kubernetes备份和恢复

    kubernetes备份和恢复   备份etcd数据 首先由于ETCD有三个备份,并且会同步,所以您只需要在一台master机器上执行ETCD备份即可. 另外在运行下列命令前,确保当前机器的kube- ...

  8. Python第三方模块--requests简单使用

    1.requests简介 requests是什么?python语言编写的,基于urllib的第三方模块 与urllib有什么关系?urllib是python的内置模块,比urllib更加简洁和方便使用 ...

  9. python不要使用可变对象作为参数的默认值

    幽灵乘客例子: . 如上:如果为空时,bus2和bus3引用的是相同的一个list,就会造成粗错误 实际工作中,如果不想改变某个参数值,那么通过以上这种赋值也会改变 解决方式self.passenge ...

  10. 微信小程序 bindcontroltap 绑定 没生效

    微信 bindcontroltap 绑定 没生效 多次查看官方文档,代码没有问题, 解决: windows下  显示设置中 缩放必须是100%,