代码改变世界

nodeJS---模块与npm包管理工具

2015-04-22 20:33  龙恩0707  阅读(3877)  评论(2编辑  收藏  举报

nodeJS---模块与npm包管理工具

一:从模块外部访问另一个模块内的成员;

假如我现在还在D盘中的node文件夹内中的app.js代码改成如下:

var msg = 'hello';

var funName = function(){

      return 1;

}

exports.msg = msg;

exports.funName = funName;

使用exports对象将模块中的成员对外可以访问,之后我在同目录下新建app2.js,来调用app.js内的成员msg和funName函数,如下代码:

var foo = require('./app');

console.log(foo.msg);

console.log(foo.funName());

运行如下所示:

即可看出可以在模块A内调用模块B的成员,只需要使用exports对象即可。

那么现在假如模块是一个类的话(在javascript叫构造函数),比如现在app.js代码改成如下的:

function App(name,age){
    this.name = name;
    this.age = age;
}
App.prototype = {
    setName: function(name){
        this.name = name;
    },
    getName: function(){
        return this.name;
    }
}
exports.App = App;

还是使用exports.App导出类的话,就会报错,我们现在在app2.js调用如下:

var foo = require('./app');
var myFoo = new foo("longen",'28');
console.log(myFoo.getName());

就会报错,如下所示:

但是呢 如果我们在app.js内使用module.exports导出的话。就ok了,exports是module的一个属性。app.js代码改成如下:

function App(name,age){
    this.name = name;
    this.age = age;
}
App.prototype = {
    setName: function(name){
        this.name = name;
    },
    getName: function(){
        return this.name;
    }
}
module.exports = App;

接着运行app2.js代码如下所示:

可以执行了;

二:组织与管理模块

如何加载一个模块的基本知识点,这里先略,如果想要更详细的了解的话,可以看看朴灵写的深入浅出的nodejs,那边书的理论很详细;

  1. 模块对象的属性

 在模块文件内部,可以访问当前模块的如下所示的一些属性;

module.id: 属性值为当前模块的ID。在默认情况下,主模块的ID属性值为”.” 其他模块的ID属性值为该模块文件的绝对路径,在模块文件中可以修改当前模块的ID属性值。

如下app.js代码改成如下:

console.log(module.id);

module.id = "longen2";

console.log(module.id);

在app2.js中调用var foo = require('./app'); 然后执行如下:

可以看到module.id改为longen2;

Module.filename: 属性值为当前模块文件的文件名;现在我们把foo.js改成如下:console.log(module.filename);

app2.js不变,直接调用,运行如下:

module.loaded: 属性值为布尔值,当属性值为false时表示模块尚未加载完毕,属性值为true时表示模块加载完毕。下面是app.js改成如下:

console.log(module.loaded);

继续执行如下所示:

module.parent: 属性值为当前模块的父模块对象,即调用当前模块的模块对象,现在foo.js改为如下:

function App(name,age){
    this.name = name;
    this.age = age;
}
App.prototype = {
    setName: function(name){
        this.name = name;
    },
    getName: function(){
        return this.name;
    }
}
module.exports = App;
console.log(module.parent);

继续调用app2.js,打印如下:

module.children: 属性值为一个数组,其中存放了当前模块的所有子模块对象,即当前模块中已加载的所有模块对象。如上图所示

三:包与npm包管理工具。

在nodejs中,可以通过包来对一组具有相互依赖关系的模块进行统一管理。一个包其实就是一个目录,其中包含了用于对包进行描述的JSON格式的package.json文件,在一个包中,通常包含如下所示的内容:

1)   在包的根目录存放package.json文件。

2)   在bin子目录中存放二进制文件。

3)   在lib子目录中存放javascript文件。

4)   在doc子目录存放对包和包的使用方法进行说明的文档。

5)   在test子目录中存放一些对包进行单元测试的测试用例。

在一个package.json文件中,一个package.json文件中通常应该包含如下字段,下面分别对这些字段进行说明如下:

1)   name, 包名。包名是唯一的,由小写字母,数字和下划线组成,不能包含空格。

2)   preferglobal, 是否支持全局安装。字段值为true是支持全局安装,为false时不支持全局安装。

3)   description, 包说明。对包进行简要概述.

4)   vrsion, 版本号。

5)   author 作者信息数组。每个数组元素中可包含name(作者姓名)字段,email(作者e-mail),web(作者网址)字段。

6)   maintainers, 包维护者信息数组。每个数组元素中可包含name(包维护者的姓名)字段,email(包维护者Email)字段,web(包维护者的网址)字段。

7)   bugs, bug的提交地址,可以是网址或电子邮件。

8)   licenses. 许可证数组。每个元素要包含type(许可证名称)和url(链接到许可证文本的地址)字段。

9)   repository, 仓库托管地址数组。每个元素要包含type(仓库类型,如Git),url(仓库地址)和path(相对于仓库的路径,可选)字段。

10)keywords, 关键字数组,通常用于搜索。

11)dependencies, 本包所依赖的包。是一个关联的数组,有包名和版本号组成。

下面我们来看看如何在项目的根目录下创建一个package.json,当然我们可以手动创建package.json,我们也可以进入我们的项目的根目录后,使用命令窗口来创建,如下我现在还是使用我们node文件夹作为包目录。下面我们先进入node包内,然后执行 命令 npm init;

之后在我node目录下生成一个package.json,内容如下:

{
  "name": "bag",
  "version": "0.0.1",
  "description": "\"A simple demo\"",
  "main": "app.js",
  "scripts": {
    "test": "\"a demo\""
  },
  "repository": {
    "type": "git",
    "url": "https:github.com/tugenhua0707"
  },
  "keywords": [
    "[\"longen\"]"
  ],
  "author": "longen",
  "license": "BAT"
}

当然还有一些依赖包,我们需要的时候可以手动加进去。

现在我们先来看看如何发布包了;

一:我们在F盘目录下新建一个包名为publicbag,包名尽量不要取名和node或者javascript有关的名字,然后把app.js和package.json复制到该文件夹内,package中的包名改成 publicbag了;现在我们先进入包publicbag内 执行命令安装express依赖包,需要生成node_module目录;如下:

npm   install  express 

就在publicbag包内生存文件node_module文件了,如下:

我们也可以全局安装,如下:

npm install express –g

可以看到如上的路径,安装到npm的路径下了。

一:下面我们可以来看看如何使用npm打包发布nodejs程序包了;

  1. 首先在npmjs.org注册一个账号,如下:

https://www.npmjs.org/signup

     2. 通过npm adduser来注册新账号或登录老账号:

如下所示:

     3. 通过命令 npm publish . 发布包了,如下所示:

我们可以登录npm查看已经发布的包,如下:

可以看到publicbag是我们刚刚发布的包~。

二:如何下载我们刚刚发布的包?

下面我们还是进入F盘后,新建文件夹loadBag文件,然后进入命令行窗口后,进入loadBag文件内,使用命令 npm install publicbag 即可把publicbag包下载到loadBag文件内,如下所示:

然后在loadBag文件内生存包publicbag,如下所示:

当然我们也可以全局下载安装;npm install publicbag –g 如下:

就自动下载到我们npm安装包路径下了;

npm 包管理工具;

在node.js中,提供了一个npm包管理工具,该管理工具可用第三方网站上下载node.js包。我们可以在命令行中,通过不同的命令输入以执行npm包管理工具中的各种功能。

  1. 可以通过如下所示的命令来卸载命令行提示窗口当前目录下安装的某个包:

npm  uninstall <包名>

     2. 可以通过如下所示的命令来卸载Node.js的全局包的安装路径下的安装的某个包。

npm  uninstall  -g  <包名>

     3. 可以通过如下所示的命令来更新命令行提示窗口当前目录下安装的某个包。

npm  update <包名>

     4. 可以通过如下所示的命令来更新Node.js的全局包的安装路径下安装的某个包。

npm update –g <包名>

     5. 可以通过如下所示的命令来更新命令行提示窗口当前目录下安装的所有包。

npm update

     6. 可以通过如下所示的命令来更新Node.js的全局包的安装路径下安装所有包。

npm update -g