Nodejs极简入门教程(一):模块机制


Posted in NodeJs onOctober 25, 2014

JavaScript 规范(ECMAScript)没有定义一套完善的能适用于大多数程序的标准库。CommonJS 提供了一套 JavaScript 标准库规范。Node 实现了 CommonJS 规范。

模块基础

在 Node 中,模块和文件是一一对应的。我们定义一个模块:

// circle.js

var PI = Math.PI;

 

// 导出函数 area

exports.area = function(r) {

    return PI * r * r;

}

 

// 导出函数 circumference

exports.circumference = function(r) {

    return 2 * PI * r;

};

这里将需要导出的函数加入到 exports 对象。模块的局部变量外部无法访问(例如,上例中的 PI 变量)。调用 require 载入模块 circle.js:
var circle = require('./circle.js');

console.log('The area of a circle of radius 4 is '

           + circle.area(4));

附带提及一下的是,模块中,存在一个 module 对象,表示模块本身,exports 则为 module 的属性。

模块的加载

Node 会对加载过的模块进行缓冲,避免再次加载的开销:

// test.js

console.log("I'm here");

多次加载模块 test.js

// 仅仅输出一次 "I'm here"

require('./test');

require('./test');

当加载文件没有后缀时,Node 会尝试添加后缀并加载:

1..js(JavaScript 源文件)
2..node(C/C++ 扩展模块)
3..json(JSON 文件)

模块主要有几类:

1.核心模块。核心模块已经被编译到了 Node 中,我们在其源码中的 lib 目录可以找到这些核心模块。常见的核心模块:net、http、fs 模块等

2.文件模块。文件模块通过一个相对或者绝对路径加载,例如我们上面看到的 circle.js

3.自定义模块。自定义模块位于 node_modules 目录中,我们通过 npm 安装的各种模块就放置在 node_modules 目录中

核心模块总是优先被加载,假如有一个自定义模块 http,那么加载时仍然会加载核心模块 http 而非自定义模块 http。在加载自定义模块时,首先查找当前目录下的 node_modules 目录,而后查找父目录下的 node_modules 目录,以此类推,直到根目录。

require 加载的模块不是一个文件,而是一个目录时,这样的目录被叫做包(package)。包中存在一个名为 package.json 的文件(包描述文件),例如:

{ "name" : "some-library",

  "main" : "./lib/some-library.js" }

其中 main 指出需要被加载的模块。如果包中不存在 package.json 或者 package.json 中未指定 main 模块,那么 Node 将会尝试加载 index.js、index.node、index.json。

在加载 JavaScript 模块时,被加载的模块被包裹在一个函数中:

function(module, exports, __filename, __dirname, ...) {

    JavaScript module

}

每个 JavaScript 模块访问到的 module、exports、__filename、__dirname 等实际上是通过函数参数传递进来的。由于这种包裹,才使得模块的局部变量外部无法访问。但有时候也会出现让人难以理解的问题,例如:

test1.js

exports = {

    name: 'Name5566',

}

test2.js

module.exports = {

    name: 'Name5566',

}

加载这两个模块:

var test1 = require('./test1.js');

console.log(test1.name); // undefined

var test2 = require('./test2.js');

console.log(test2.name); // Name5566

exports 作为参数传递给模块,我们通过 exports.x 自然可以给 exports 对象添加属性(或方法),但直接给 exports 赋值(例如,exports = x)仅仅是改变了形参而非实参的值,因此:

1.为 exports 添加属性时,使用 exports
2.为 exports 赋值时,使用 module.exports

按 CommonJS 的规范,一个完整的包应该包含有:

1.package.json 包描述文件
2.bin 二进制文件目录
3.lib JavaScript 代码目录
4.doc 文档目录
5.test 测试代码目录

NPM 是一个 Node 的一个包管理工具。常见用法:

查看命令的文档:

npm help install

查看命令 install 的文档。

安装一个包:

npm install redis

安装 redis 这个包。install 命令会将包安装在当前目录下的 node_modules 目录中。

移除一个包:

npm remove redis

移除 redis 这个包。remove 命令会将当前目录下的包移除掉。
NodeJs 相关文章推荐
nodejs教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
nodejs中使用monk访问mongodb
Jul 06 NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 NodeJs
nodejs 的 session 简单使用
Jun 06 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 #NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 #NodeJs
Nodejs Post请求报socket hang up错误的解决办法
Sep 25 #NodeJs
You might like
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
ThinkPHP控制器详解
2015/07/27 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
python实现动态数组的示例代码
2019/07/15 Python
python多线程同步之文件读写控制
2021/02/25 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
上班早退检讨书
2014/01/09 职场文书
培训演讲稿范文
2014/01/12 职场文书
致200米运动员广播稿
2014/02/06 职场文书
函授毕业个人自我评价
2014/02/20 职场文书