Node.js模块、包的学习笔记
什么是模块
模块是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的包规范应该具备以下特征:
- package.json必须在包的顶层目录;
- 二进制文件应该在bin目录下;
- javascript代码应该在lib目录下;
- 文档应该在doc目录下
- 单元测试应该在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提供了命令行工具,可以方便的下载、安装、升级、删除包,也可以维护包等。
获取一个包
命令格式为:npm [install/i] [package_name]
如果你想安装express,可以这样:
$ npm install express
//或者
$ npm i express
本地模式和全局模式
在使用npm包的时候,用两种模式:本地和全局
全局语法格式:npm [install/i] -g [package_name]
创建全局链接
npm提供了一个npm link命令,他的功能是在本地包和全局包之间创建链接。我们知道使用全局模式安装的包不能直接通过require使用,但是这个命令打破了这个限制。包的发布
运行:npm init
在发布前,你还可以创建一个账号以后好管理你的包,使用npm adduser 根据提示就输入用户名、密码等就可以。完成后,使用npm whoami检测你是否已经获得账号。接下来,在package.json目录下运行nmp publish,就可以发布了,打开浏览器访问:http://search.npmjs.org/就可以看到自己发布的包了。如果你想更新你的包,只需要修改version字段,然后重新使用npm publish 就行了,还可以通过 npm unpublish来取消发布。
调试
- 单步调试
命令行调试
执行:node debug xxxx.js,将启动调试工具。远程调试
在命令行中执行下面两个语句之一可以打开调试服务器:node --debug[=port] script.js
node --debug-brk[=port] script.js
- 使用eclipse调试node
略
Node.js模块、包的学习笔记的更多相关文章
- 《Node.js核心技术教程》学习笔记
<Node.js核心技术教程>TOC \o "1-3" \h \z \u 1.章模块化编程 2019.2.19 13:30' PAGEREF _101 \h 1 08D ...
- Node.js amqplib 连接 Rabbitmq 学习笔记
var amqp = require('amqplib'); connect([url, [socketOptions]]) var amqp = require('amqplib/callback_ ...
- npm学习(六)之如何创建 Node.js 模块
如何创建 Node.js 模块 Node.js 模块是一种可以发布到 npm 的包.当你创建一个新模块时,创建 package.json 文件是第一步. 你可以使用 npm init 命令创建 pac ...
- node.js 模块和包
Node.js 的模块和包机制的实现参照了 CommonJS 的标准,但并未完全遵循.不过两者的区别并不大,一般来说你大可不必担心,只有当你试图制作一个除了支持 Node.js之外还要支持其他平台的模 ...
- Node.js模块
每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...
- 【特别推荐】Node.js 入门教程和学习资源汇总
这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- Node.js 入门教程和学习资源汇总
这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- Node.js:包
概要:本篇博客主要介绍了node.js中的包 包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的库函数或者Java/.Net的类库.它将某个独立的功能封装起来,用于发布.更新.依赖管 ...
- Node Js模块讲解
Node JS模块 所谓的Node JS模块其实就是指Node JS package,即nodejs包. 一 什么是NodeJS模块? 在说这个问题之前,我们有必要提出一个概念,即模块规范. 现阶段J ...
随机推荐
- springboot集成h2
h2数据库是常用的开源数据库,与HSQLDB类似,十分适合作为嵌入式数据库使用,其他的数据库大部分都需要安装独立的客户端和服务器端 h2的优势: (1)h2采用纯java编写,因此不受平台的限制 (2 ...
- RedHat安装yum+配置国内yum源
新安装了redhat6.5安装后,登录系统,使用yum update 更新系统.提示: This system is not registered to Red Hat Subscription ...
- sharepoint 2010自定义访问日志列表设置移动终端否和客户端访问系统等计算列的公式
上个月本人开发和上线了一个在SharePoint 2010上基于HTML5的移动OA网站,后端服务采用自定义的基于AgilePoint工作流引擎的Sharepoint Web服务,前端主要采用Jque ...
- SpringMVC:学习笔记(9)——文件下载
SpringMVC—文件下载 说明 两个案例 1.为登录用户提供下载服务. 2.阻止仅通过输入网址即可获取下载. 文件下载概览 为了将文件发送给浏览器,我们需要在控制器中完成以下操作: 对请求处理方法 ...
- openstack ha 部署
一.控制节点架构如下图: 二.初始化环境: 1.配置IP地址: 1.节点1:ip addr add dev eth0 192.168.142.110/24 echo 'ip addr add dev ...
- Loadrunder脚本篇——Run-time Settings之Preferences
打开Preferences设置对话框,这里提供了对运行时的参数选择设置 Enable Image and Text Check 开启图片和文本检查.允许用户在回放期间通过web_find(文本检测)或 ...
- python 课堂笔记-if语句
# Author:zyl _username = 'zyl' _password = 'zyl123' username = input("username:") password ...
- 每天一个Linux命令(43)at命令
at命令用于在指定时间执行命令.at允许使用一套相当复杂的指定时间的方法.可以用相对时间法指定,也可以用绝对时间法指定. (1)用法: 用法: at [选项参数] [时间 ...
- Linux常用指令——周琛
ps ax | grep java 查看进程命令里带“java”字样的进程信息,第一列是进程号 kill -9 1234 强制杀死1234号进程 cd /xxx/xxx 进入/xxx/xxx目录 cd ...
- Android系统源代码的下载与编译
http://www.jianshu.com/p/aeaceda41798 目录 1.简介 2.官方同步源代码 3.镜像同步源代码 4.已有源代码更新 5.编译源代码 5.1编译Android 4.1 ...