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的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
xml+php动态载入与分页
2006/10/09 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
详解如何在nuxt中添加proxyTable代理
2018/08/10 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
vue3实现v-model原理详解
2019/10/09 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
python实现360的字符显示界面
2014/02/21 Python
python先序遍历二叉树问题
2017/11/10 Python
python字符串string的内置方法实例详解
2018/05/14 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
centos7之Python3.74安装教程
2019/08/15 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
西部世纪面试题
2014/12/05 面试题
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
中学生爱国演讲稿
2013/12/31 职场文书
浪漫婚礼主持词
2014/03/14 职场文书
腾讯广告词
2014/03/19 职场文书
2014统计局民主生活会对照检查材料思想汇报
2014/10/02 职场文书
会计人员岗位职责
2015/02/03 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书