什么是模块

模块是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. 理解CSS3属性transition

    一.说明 1.1 定义和用法 transition 属性是一个简写属性,用于设置四个过渡属性: transition-property:规定设置过渡效果的CSS属性的名称. transition-du ...

  2. javascript实例:点亮灯泡

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. ShutIt:一个基于 Python 的 shell 自动化框架

    ShutIt是一个易于使用的基于shell的自动化框架.它对基于python的expect库(pexpect)进行了包装.你可以把它看作是“没有痛点的expect”.它可以通过pip进行安装. Hel ...

  4. Slyce,这家硅谷创业公司的来头你知道吗

    Slyce,也许你没听过,一家硅谷创业公司,旨在帮助运动员和其他社会名流组织.优化社交媒体,过滤粉丝的声音,让明星更好的在社交媒体上和他们互动.但是如果如果说库里,那你应该就知道了,拿到了上届NBA总 ...

  5. ACM解题之(ZOJ 2212) Argus

    题目来源: 点击打开题目 题目翻译: 数据流是实时的,连续的,有序的项目序列.一些例子包括传感器数据,互联网流量,金融代码,在线拍卖以及诸如网络使用日志和电话记录之类的交易日志.同样,对流进行的查询在 ...

  6. 剑指offer 面试12题

    面试12题: 题目:矩阵中的路径 题:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格 ...

  7. Python之模块和包(Day21)

    一.Python模块 Python模块(module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句. 模块让你能够有逻辑的组织你的Python代码段 把相关的代 ...

  8. This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in问题

    点击 Help > Install New Software. 在 Work with 的输入区域里, 输入: https://dl-ssl.google.com/android/eclipse ...

  9. RabbitMQ队列/Redis缓存

    一.RabbitMQ队列 RabbitMQ安装(Centos7安装):1.安装依赖:yum install socat (不安装会报错)2.下载rpm包:wget http://www.rabbitm ...

  10. oc字符串+数组+字典操作题目

    1. 判断中间目录是否存在 (10分) 比如 传入字符串 @"/home/qianfeng/oc.txt" 和 @"qianfeng" 返回:YES 传入字符串 ...