NodeJs的包

来源:互联网 发布:测试耳朵听力软件 编辑:程序博客网 时间:2024/05/22 14:15

1.创建以及加载模块

1.创建模块

在Node.js中,创建一个模块非常简单,因为一个文件就是一个模块。

//module.jsvar name;exports.setName=function(thyName){    name=thyName;};exports.setHello=function(){    console.log('Hello '+name);};
//getmodule.js    var myModule=require('./module')    myModule.setName("BYVoid");    myModule.sayHello();

module.js通过exports对象把setName和sayHello作为模块的访问接口,在getmodule.js中通过require(‘./module’)加载这个模块,然后就可以访问module.js中exports对象的成员函数

单次加载

require不会重复加载模块
无论调用多少次require,获得的模块都是同一个

var hello1=require('./module');hello1.setName('BYVoid');var hello2=require('./module');hello2.setName('BYVoid 2');hello1.sayHello();

运行结果是Hello BYVoid2,因为hello1和hello2指向的是同一个实例。

覆盖exports

有时候我们希望把一个对象封装到模块中

//singleobject.jsfunction Hello(){    var name;    this.setName=function(thyName){        name=thyName;    };    this.setHello=function(){        console.log('Hello'+name);    };}exports.Hello=Hello;

我们需要在其他文件中require(‘./singleobject’.Hello)来获取Hello对象。
如果是module.exports=Hello;就可以直接获得这个对象。

//gethello.jsvar Hello=require('./hello');hello =new Hello();hello.setName('BYVoid');hello.sayHello();

唯一变化是使用module.exports=Hello代替了exports.Hello=Hello。在外部引用该模块时,其接口对象就是要输出Hello对象本身,而不是exports。

2.创建包

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

    CommonJs规范
  • package.json位于顶层目录下
  • 二进制文件在bin目录下
  • Js代码在lib目录下
  • 文档在doc目录下
  • 单元测试在test目录下

2.1作为文件夹的模块

模块与文件是一一对应的。文件不仅可以是Js代码或者二进制代码,还可以是一个文件夹。最简单的包就是一个作为文件夹的模块。

//somepackage/index.jsexports.hello=function () {    console.log('Hello');}
//getpackage.js    var someoackage=require('./somepackage');    someoackage.hello();

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

package.json

node.js在调用某个包的时候,会检查包中package.json文件的main字段,将其作为包的接口模块,如果package.json或main不存在,则以index.js或者index.node作为包的接口。

  • name
  • description
  • version
  • keywords
  • maintainers
  • contributors
  • bugs
  • licenses
  • repositories
  • dependencies
  • 如“dependencies”:{    "webkit":"1.2"    "ssl":{        "gnutls":["1.0","2.0"],        "openssl":"0.9.8"    }}

    本地模式和全局模式

    npm默认在http://npmjs.org搜索或者下载包,安装到当前目录的node_modules子目录下。

    本地模式下不会注册PATH环境变量,如安装supervisor是为了在命令行中直接使用它。npm本地模式仅仅是把包安装到node_modules下,其中bin目录没有包含在PATH环境变量中。全局安装下,package.json文件中bin字段包含的 文件会被链接到/usr/local/bin

    创建全局链接

    全局安装的包不能直接通过require使用,但是通过npm link命令可以打破这一限制。
    如我们npm install -g express 全局安装了express,这时候在工程的目录下运行命令:
    npm link express
    会发现./node_module/express->/usr/local/lib/node_modules/express