nodeJS---模块与npm包管理工具
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程序包了;
- 首先在npmjs.org注册一个账号,如下:
 
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包管理工具中的各种功能。
- 可以通过如下所示的命令来卸载命令行提示窗口当前目录下安装的某个包:
 
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
nodeJS---模块与npm包管理工具的更多相关文章
- Node.js权威指南 (4) - 模块与npm包管理工具
		
4.1 核心模块与文件模块 / 574.2 从模块外部访问模块内的成员 / 58 4.2.1 使用exports对象 / 58 4.2.2 将模块定义为类 / 58 4.2.3 为模块类定义类变量或类 ...
 - NodeJS 中npm包管理工具
		
NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从 ...
 - Nodejs-内置核心模块&npm包管理工具
		
1.核心模块的意义 如果只是在服务器运行JavaScript代码,其实意义不大(浏览器就可以解决)因为无法实现功能(读写文件,访问网络) Node的用处在于本身还提供了一系列的功能模块,用于与操作系统 ...
 - NPM 包管理工具详解,使用教程
		
NPM 包管理工具 1.1 定义:什么是 NPM NPM 全称 Node Package Manager,它是 JavaScript 的包管理工具, 并且是 Node.js 平台的默认包管理工具.通过 ...
 - node.js中npm包管理工具
		
现在安装node.js,默认就会帮我们装上了npm包管理工具,npm主要用来下载,安装,管理第三方模块. 创建一个包描述文件: npm init [-y] 查看包的信息 npm info <pa ...
 - Node.js之包与npm包管理工具
		
Node.js之包与npm包管理工具 1.Node.js中的包 1.1在一个包中包含如下内容: package.json:对包进行描述 在bin子目录中存放二进制文件 在lib子目录中存放JavaSc ...
 - npm包管理工具在一般项目中的应用方法
		
最近自己在有时间,在通学一些知识点,记录一下,以便以后使用方面 当我们在做项目的时候,如果需要到包管理工具,那么我们一定会经历以下流程: 1.首先在官网下载node.js,然后默认安装到C盘 检查是否 ...
 - node.js开发 npm包管理工具
		
npm介绍 说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) 使用npm安装插件:命令提示符执行npm instal ...
 - npm 包管理工具
		
能注册后看简单的功能 订单加信息 下单之前的判断要配合海潮的迁移数据 运行自定义的脚本 在 package.json 的 scripts 里添加自定义的结点 ( 比如 CSOR-serve ) &qu ...
 
随机推荐
- 产生冠军(hdu2094)
			
产生冠军 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
 - Android - Navigation Drawer
			
http://www.jianshu.com/p/c8cbeb7ea43a 用Navigation Drawer 和 Navigation View 来实现左右侧滑 Activity里甚至什么都不用写 ...
 - 生成证书申请csr文件
			
一.执行命令 openssl req -nodes -newkey rsa:2048 -keyout liexiulive.key -out liexiulive.csr 二.根据提示输入基本信息 G ...
 - Windows平台如何部署scrapy
			
0.安装Anaconda 这个不教了,自己去Anaconda官网上下个安装包,装上就好. https://www.anaconda.com/distribution/ 1.使用Anaconda创建一个 ...
 - php命令行按模板生成应用的入口文件
			
接着这篇文章php命令行生成项目结构 继续改造: ghostwu@dev:~/php/php1/12$ tree . ├── app │ └── index.php ├── core │ ├─ ...
 - Atcoder:AGC004F Namori
			
传送门 先考虑树,树是一个二分图. 看到是二分图并且每次是对两边的同色的点反色可以想到转化:让奇数层的点为黑,偶数为白,变成每次可以交换两个点的颜色. 把黑看成 \(-1\),白看成 \(1\),那么 ...
 - JS中undefined和null的区别,以及出现原因
			
区别:null是一个表示无的对象,转换为数值为0: undefined表示一个无的原始值,转化为数值为NAN(与任何数字相加也为NAN) undefined出现原因:(口诀:一变量二函数一对象) 1. ...
 - Android Dragger2快速入门浅析
			
定Dagger2的基本介绍:dagger2是一个依赖注入框架,在编译期间自动生成代码,负责依赖对象的创建. 使用Dagger2的好处:为了进一步解耦和方便测试,我们会使用依赖注入的方式构建对象 (不使 ...
 - 7.0 FileProvide适配
			
7.0 Build.VERSION_CODES.N 24 为什么要适配 在7.0中 ,Uri.from(file),可能会触发FileUriExposedException 和动态权限一样,如果tar ...
 - [Java][读书笔记]多线程编程
			
前言:最近复习java,发现一本很好的资料,<Java2参考大全 (第五版)>  Herbert.Schildt.书比较老了,06年的,一些 ...