跟我学Node.js(四)---Node.js的模块载入方式与机制


Posted in Javascript onJune 04, 2014

其它的如通过NPM安装的第三方模块(third-party modules)或本地模块(local modules),每个模块都会暴露一个公开的API。以便开发者可以导入。如

var mod = require('module_name')

此句执行后,Node内部会载入内置模块或通过NPM安装的模块。require函数会返回一个对象,该对象公开的API可能是函数,对象,或者属性如函数,数组,甚至任意类型的JS对象。

这里列下node模块的载入及缓存机制

1)载入内置模块(A Core Module)
2)载入文件模块(A File Module)
3)载入文件目录模块(A Folder Module)
4)载入node_modules里的模块
5)自动缓存已载入模块

一、载入内置模块

Node的内置模块被编译为二进制形式,引用时直接使用名字而非文件路径。当第三方的模块和内置模块同名时,内置模块将覆盖第三方同名模块。因此命名时需要注意不要和内置模块同名。如获取一个http模块

var http = require('http')

返回的http即是实现了HTTP功能Node的内置模块。

二、载入文件模块

绝对路径的

 
var myMod = require('/home/base/my_mod')

或相对路径的

 
var myMod = require('./my_mod')

注意,这里忽略了扩展名“.js”,以下是对等的

 
var myMod = require('./my_mod')
var myMod = require('./my_mod.js')

三、载入文件目录模块

可以直接require一个目录,假设有一个目录名为folder,如

 
var myMod = require('./folder')

此时,Node将搜索整个folder目录,Node会假设folder为一个包并试图找到包定义文件package.json。如果folder目录里没有包含package.json文件,Node会假设默认主文件为index.js,即会加载index.js。如果index.js也不存在,那么加载将失败。

假如目录结构如下

跟我学Node.js(四)---Node.js的模块载入方式与机制

package.json定义如下

{
    "name": "pack",
    "main": "modA.js"
}

此时 require('./folder') 将返回模块modA.js。如果package.json不存在,那么将返回模块index.js。如果index.js也不存在,那么将发生载入异常。

四、载入node_modules里的模块

如果模块名不是路径,也不是内置模块,Node将试图去当前目录的node_modules文件夹里搜索。如果当前目录的node_modules里没有找到,Node会从父目录的node_modules里搜索,这样递归下去直到根目录。

不必担心,npm命令可让我们很方便的去安装,卸载,更新node_modules目录。

五、自动缓存已载入模块

对于已加载的模块Node会缓存下来,而不必每次都重新搜索。下面是一个示例

modA.js

console.log('模块modA开始加载...')
exports = function() {
    console.log('Hi')
}
console.log('模块modA加载完毕')

init.js

 
var mod1 = require('./modA')
var mod2 = require('./modA')
console.log(mod1 === mod2)

命令行执行:

node init.js

输入如下

跟我学Node.js(四)---Node.js的模块载入方式与机制

可以看到虽然require了两次,但modA.js仍然只执行了一次。mod1和mod2是相同的,即两个引用都指向了同一个模块对象。

Javascript 相关文章推荐
javascript实现动态增加删除表格行(兼容IE/FF)
Apr 02 Javascript
用javascript做拖动布局的思路
May 31 Javascript
jquery 操作表格实现代码(多种操作打包)
Mar 20 Javascript
jquery动态添加元素事件失效问题解决方法
May 23 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
Jun 15 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
Jun 24 Javascript
Bootstrap入门教程一Hello Bootstrap初识
Mar 02 Javascript
Angularjs实现数组随机排序的方法
Oct 02 Javascript
小程序分享模块超级详解(推荐)
Apr 10 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
非常漂亮的js烟花效果
Mar 10 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 #Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 #Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 #Javascript
动态读取JSON解析键值对的方法
Jun 03 #Javascript
js、jquery图片动画、动态切换示例代码
Jun 03 #Javascript
jquery css 设置table的奇偶行背景色示例
Jun 03 #Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
Jun 03 #Javascript
You might like
php抓取页面与代码解析 推荐
2010/07/23 PHP
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
python list转dict示例分享
2014/01/28 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
Dockers美国官方网站:卡其裤、男士服装、鞋及配件
2016/11/22 全球购物
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
财政局长自荐信范文
2013/12/22 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
普通党员整改措施
2014/10/24 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
数据库连接池
2021/04/06 MySQL
MySQL创建表操作命令分享
2022/03/25 MySQL