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文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
nodejs教程之异步I/O
Nov 21 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 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
用PHP连接Oracle数据库
2006/10/09 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
php实现文件预览功能
2017/05/23 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
广告显示判断
2006/08/31 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
python 编程之twisted详解及简单实例
2017/01/28 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
python适合做数据挖掘吗
2020/06/16 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
银行门卫岗位职责
2013/12/29 职场文书
品牌宣传方案
2014/03/21 职场文书
个人委托书范本
2014/04/02 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python