跟我学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 相关文章推荐
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
Feb 07 Javascript
JQuery 动态扩展对象之另类视角
May 25 Javascript
javascript 词法作用域和闭包分析说明
Aug 12 Javascript
基于JQuery 选择器使用说明介绍
Apr 18 Javascript
web css实现整站样式互相切换
Oct 29 Javascript
微信小程序入门教程
Nov 18 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
May 09 jQuery
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
Mar 01 Javascript
JavaScript 处理树数据结构的方法示例
Jun 16 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 Javascript
js用正则表达式筛选年月日的实例方法
Jan 04 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
Jan 20 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与javascript实现变量交互的示例代码
2013/07/23 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
python实现取余操作的简单实例
2020/08/16 Python
python更新数据库中某个字段的数据(方法详解)
2020/11/18 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
管理心得体会
2013/12/28 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
2014年营销工作总结
2014/11/22 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
运动会通讯稿50字
2015/07/20 职场文书
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server