什么是模块

模块是node应用程序的基本组成部分,文件和模块是一一对应的,就是说,一个node文件就是一个模块,这个文件可能是javascript代码、json或者是编译过的c++扩展等,如:

	var http = require('http');

其中http是node的一个核心模块,内部是c++实现的,外部是javascript封装起来的。我们通过require函数获取这个模块,然后才能使用其中的对象。

  • 创建模块

    在node中,一个文件就是一个模块,所以我们应该关注的问题是如何在其他的文件中获得这个模块。nodeJs提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。

    例子:

      //name.js
    var name; exports.setName = function(thyName){
    name = thyName;
    }; exports.sayHello = function(){
    console.log('Hello' + name);
    };
    //getname.js
    var myName = require('./hellonode');
    myName.setName('yehui');
    myName.sayHello();

运行getname结果为:hello yehui

  • 单次加载

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

      var hello1 = require('./hellonode');
    hello1.setName('byyehui'); var hello2 = require('./hellonode');
    hello2.setName('byyehui 2'); hello1.sayHello();
    //by yehui 2

这是因为hello1 和hello2 都指向同一个函数,后面的结果就覆盖了前面一个。

  • 覆盖exports

      function Hello(){
    var name; this.setName = function(thyname){
    name = thyname;
    }; this.sayHello = function(){
    console.log('hello' + name);
    };
    };
    exports.Hello = Hello;
    //调用
    var Hello = require('./singleObject').Hello;
    hello = new Hello();
    hello.setName('yehui');
    hello.sayHello();

这样的话,我们在其他文件里面就需要通过require('').Hello来获取Hello对象。

但是如果我们把

exports.Hello = Hello;
//换成
module.exports = Hello;

就可以直接用了

var Hello = require('./singleObject');
hello = new Hello();
hello.setName('yehui');
hello.sayHello();

在外部引用模板时,其接口对象就是要输出Hello对象本身,而不是原先的exports。

创建包

包是在模块基础上更深一步的抽象,他将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制,node根据common JS规范实现了包机制,开发了npm来解决包的发布和获取需求。

  • node.js的包是一个目录,其中包含一个JSON格式的包说明文件package.json。严格符合commonJS的包规范应该具备以下特征:
  1. package.json必须在包的顶层目录;
  2. 二进制文件应该在bin目录下;
  3. javascript代码应该在lib目录下;
  4. 文档应该在doc目录下
  5. 单元测试应该在test目录下。

但是node对包没那么严格,只需要package.json在顶层目录,并符合一些规则就行了。但是为了提高兼容性,还是严格一点较好。

  • 作为文件夹的模块

    模块和文件是一一对应的,文件不仅可以是javascript代码、二进制代码,还可以是一个文件夹。最简单的包就是一个作为文件夹的模块。如:我们先建一个nodelianxi的文件夹,在其中创建一个index.js:

      exports.hello = function(){
    console.log('hello .');
    };

然后在文件夹外面建立一个getpackage.js

	var nodelianxi = require('./nodelianxi');
nodelianxi.hello();
//hello .

在这里我们可以把文件夹封装成模块,即所谓的包。包通常是一些模块的集合,在模块的基础上提供了更高曾的抽象,相当于提供了一个固定接口的函数库。

  • package.json

    package.json文件大概:

      {
    "main" : "./lib/inter.js"
    }

node在调用包的时候,会首先检查包中package.json文件的main字段,将其作为包的接口模块,如果找不到package文件或main的话,会尝试寻找index.js或index.node作为包的接口。

  • Node.js包管理器

    即npm,是node官方提供的包管理工具,用于node包的发布、传播、依赖控制。npm提供了命令行工具,可以方便的下载、安装、升级、删除包,也可以维护包等。
  1. 获取一个包

    命令格式为:

     	npm [install/i] [package_name]

如果你想安装express,可以这样:

		$ npm install express
//或者
$ npm i express
  1. 本地模式和全局模式

    在使用npm包的时候,用两种模式:本地和全局

    全局语法格式:

     	npm [install/i] -g [package_name]
  2. 创建全局链接

    npm提供了一个npm link命令,他的功能是在本地包和全局包之间创建链接。我们知道使用全局模式安装的包不能直接通过require使用,但是这个命令打破了这个限制。

  3. 包的发布

    运行:

     	npm init

在发布前,你还可以创建一个账号以后好管理你的包,使用npm adduser 根据提示就输入用户名、密码等就可以。完成后,使用npm whoami检测你是否已经获得账号。接下来,在package.json目录下运行nmp publish,就可以发布了,打开浏览器访问:http://search.npmjs.org/就可以看到自己发布的包了。如果你想更新你的包,只需要修改version字段,然后重新使用npm publish 就行了,还可以通过 npm unpublish来取消发布。

调试

  • 单步调试
  1. 命令行调试

    执行:node debug xxxx.js,将启动调试工具。

  2. 远程调试

    在命令行中执行下面两个语句之一可以打开调试服务器:

     	node --debug[=port] script.js
    node --debug-brk[=port] script.js
  • 使用eclipse调试node

Node.js模块、包的学习笔记的更多相关文章

  1. 《Node.js核心技术教程》学习笔记

    <Node.js核心技术教程>TOC \o "1-3" \h \z \u 1.章模块化编程 2019.2.19 13:30' PAGEREF _101 \h 1 08D ...

  2. Node.js amqplib 连接 Rabbitmq 学习笔记

    var amqp = require('amqplib'); connect([url, [socketOptions]]) var amqp = require('amqplib/callback_ ...

  3. npm学习(六)之如何创建 Node.js 模块

    如何创建 Node.js 模块 Node.js 模块是一种可以发布到 npm 的包.当你创建一个新模块时,创建 package.json 文件是第一步. 你可以使用 npm init 命令创建 pac ...

  4. node.js 模块和包

    Node.js 的模块和包机制的实现参照了 CommonJS 的标准,但并未完全遵循.不过两者的区别并不大,一般来说你大可不必担心,只有当你试图制作一个除了支持 Node.js之外还要支持其他平台的模 ...

  5. Node.js模块

    每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...

  6. 【特别推荐】Node.js 入门教程和学习资源汇总

    这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  7. Node.js 入门教程和学习资源汇总

    这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  8. Node.js:包

    概要:本篇博客主要介绍了node.js中的包 包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的库函数或者Java/.Net的类库.它将某个独立的功能封装起来,用于发布.更新.依赖管 ...

  9. Node Js模块讲解

    Node JS模块 所谓的Node JS模块其实就是指Node JS package,即nodejs包. 一 什么是NodeJS模块? 在说这个问题之前,我们有必要提出一个概念,即模块规范. 现阶段J ...

随机推荐

  1. 洛谷 P3393 逃离僵尸岛

    洛谷 这道题目其实是最短路裸题. 首先看到题目,要求的到"被占点"距离不大于S的点,自然想到了以"被占点"为源点,求一遍最短路,处理出"危险点&quo ...

  2. Servlet 运行原理

    一:servlet定义 Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序. 二:简单servlet实例 //导入所需的包 import javax.servle ...

  3. comboBox绑定字典Dictionary 获取value中的值

    第一种 最简洁的方法 Dictionary<string, string> list = new Dictionary<string, string> { {"thi ...

  4. Java基础—多态

    1.什么是多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 现实中,比如我们按下 F1 键这个动作: 如果当前在 Flash 界面下弹出的就是 AS 3 的帮 ...

  5. 剑指offer 面试41题

    面试41题: 题目:数据流中的中位数 题:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值 ...

  6. Multi-thread & Multi-process

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”. 对于到底是使用多进程还是多线程, 要根据实际情况来判断,选择更适合的. 具体情况,可以参考下面: ...

  7. pyhon时间输出

    参考博客:http://www.cnblogs.com/xisheng/p/7634125.html http://www.cnpythoner.com/post/89.html 有些时候想要输出,但 ...

  8. PAT 天梯赛 L1-026. I Love GPLT 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-026 AC代码 #include <iostream> #include <cstdio&g ...

  9. Service degrade

    服务降级:主要是针对非正常情况下的应急服务措施;比如电商平台,在针对618.双11等高峰情形下采用部分服务不出现或者延时出现的情形. 为什么是非正常情况下呢,比如我要出差,如果经常出差的话,要带的衣服 ...

  10. 8位单片机可用的 mktime localtime函数

    8位单片机可用的 mktime  localtime函数及源码 最近在做一个8位单片机项目,其中用到了时间戳转换函数,这个在32位机上一个库函数就解决了问题,没想到在8位单片机中没有对应库(time. ...