Node.js学习--基础知识(4)--模块与包

V8--解决了运行快速的问题
javascript在服务器端的应用

事件驱动

CommonJs的规范化

概念:模块(Module)和包(Package)是Node.js最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分、分装,然后组合起来。模块正是为了实现这种方式而诞生的。在浏览器JavaScript中,脚本模块的拆分和组合通常使用HTML的script标签来实现,Node.js提供了require函数来调用其他模块,而且模块都是基于文本,机制非常简单,模块和包的区别是透明的,因此经常不作区分。

一、模块

1. 什么是模块

模块和文件是一一对应的,一个Node.js文件就是一个模块,这个文件可能是JavaScript代码、JSON或者编译过的C/C++扩展。

var http=require('http');

其中http是Node.js的一个核心模板,通过require函数获取这个模块,然后使用其中的对象。

Node里有三种定义模块的方式:

相对路径定义方式(以 ./或者../开头)、绝对路径定义方式(以 /开头)和顶级目录的定义方式(以模块名开头)。

2.创建及加载模块

(1)创建模块

Node.js提供了exports和require两个方法,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即获得模块的exports对象。

module.js(module.js和getModule.js的实现)

var name;
exports.setName=function(thyName){
     name=thyName;
};
exports.sayHello=function(){
     console.log("Hello "+name);
};

get.Module.js

var module=require('./module');
module.setName('Public+');
module.sayHello();</span>

(2)单次加载

上面的例子有点类似创建一个对象,但实际上和对象又有本质的区别,因为reqiure不会重复加载模块,也就是说无论调用多少次require,获取的模块都是同一个。

get.Module2.js

var hello1=require('./module');
hello1.setName('Tom1');

var hello2=require('./module');
hello2.setName('Tom2');

hello1.sayHello();

输出结果:Tom2因为require不会重复加载同一个模块,前者被后者覆盖了,所以最终结果由后者决定。

(3)覆盖--exports

有时我们只是想把一个对象封装到模块中,例如

定义模块singleobeject.js

function hello(){
      var name;
      this.setName=function(thyName){
      name =thyName;
      }
      this.sayHello=function(){
           console.log('Hello'+name);
      }
}
module.exports=hello;     #exports暴露出来的方法

引入模块使用getSingleObject.js

var  hello=require('./singleobeject');
var he=new hello();
he.setName('Tom1');
he.sayHello();
var he2=new hello();
he2.setName('Tom2');
he2.sayHello();

输出结果:hello Tom2

(繁琐的方法:exports hello=hello;

引入时需要:require('./singleobject').hello;

简易的导出方法:module.exports=hello;)

exports本身仅仅是一个普通的空对象,即{},它是专门用来声明接口的。

二.创建包

1.包的概念

包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的函数库或者java的类库,它将某个独立的功能封装起来,用于发布、更新、依赖管理的版本控制。开发npm来解决包的发布和获取需求。

2.如何创建一个包

CommonJS规定的包应该具备以下特征:

packet.json必须在包的顶层目录下

二进制文件应该是bin目录下

javaScript代码应该在lib目录下

文档应该是doc目录下

单元测试应该是test目录下

Node.js对包要求并没有那么严格,只要顶层目录下有packet.json,并符合基本规范即可

(1)作为文件夹的模块

最简单的包,就是一个作为文件夹的模块

创建一个文件夹somepackage,里面有一个index.js(如果没有JSON,默认搜索inde.js文件),里面提供一个sayHello()

var somepackage=require('./somepackage');
somepackage.sayHello();

我们使用这种方法可以把文件夹封装成一个模块,即所谓的包,包通常是一些模块的集合。在模块的基础上提供了更高层的抽象,相当于提供了一些固定接口的函数库,通过定制package.json,我们可以创建更复杂、更完善、更符合规范的包用于发布。

(2)package.json

前面的例子,在somepackage文件夹下,我们创建了一个package.json文件的main字段,将其作为包的接口模块,如果package.json或main字段不存在,会尝试寻找index.js文件或者index.code作为包的接口

package.json的规范属性:

name:包的名称,必须是唯一

description:包的简要说明

version:符合语义化版本识别规范的版本字符串

keywords:关键字数据,通常用于搜索

maintains:维护者数组,每个元素要包含name,emian,web可选字段

contributors:贡献者数组,格式与maintainers相同,包的作者应该是贡献者数据的第一个元素

bugs:提交bug的地址,可以是网址或者电子邮件地址

licenses:许可证数组,每个元素要包含type、url和path字段

dependencies:包的依赖,一个关联数组,有包名称和版本号组成





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值