跟我学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 相关文章推荐
asp批量修改记录的代码
Jun 25 Javascript
基于javascript实现样式清新图片轮播特效
Mar 30 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
Aug 03 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 Javascript
JS仿京东移动端手指拨动切换轮播图效果
Apr 10 Javascript
浅谈Vue.js
Mar 02 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 Javascript
基于react组件之间的参数传递(详解)
Sep 05 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
Jan 11 Javascript
Vuex提升学习篇
Jan 11 Javascript
vue cli升级webapck4总结
Apr 04 Javascript
10种JavaScript最常见的错误(小结)
Jun 21 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
php检测图片木马多进制编程实践
2013/04/11 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
语义化 H1 标签
2008/01/14 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
如何解决安装python3.6.1失败
2020/07/01 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
考试退步检讨书
2014/01/15 职场文书
年度考核自我评价
2014/01/25 职场文书
中考冲刺决心书
2014/03/11 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
股东合作协议书范本
2014/04/14 职场文书
说明书怎么写
2014/05/06 职场文书
学校安全生产承诺书
2014/05/23 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书