跟我学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 相关文章推荐
用js实现随机返回数组的一个元素
Aug 13 Javascript
javascript 去字符串空格终极版(支持utf8)
Nov 14 Javascript
ExtJS Window 最小化的一种方法
Nov 18 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
JS倒计时代码汇总
Nov 25 Javascript
最新最热最实用的15个jQuery插件汇总
Jul 05 Javascript
浅谈JavaScript 数据属性和访问器属性
Sep 01 Javascript
Bootstrap Table使用心得总结
Nov 29 Javascript
javascript按钮禁用和启用的效果实例代码
Oct 29 Javascript
在angularJs中进行数据遍历的2种方法
Oct 08 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
Apr 23 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面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
python之wxPython应用实例
2014/09/28 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
安装python依赖包psycopg2来调用postgresql的操作
2021/01/01 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
《三袋麦子》教学反思
2014/03/02 职场文书
老公保证书范文
2014/04/29 职场文书
化工操作工岗位职责
2014/04/29 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
《月球之谜》教学反思
2016/02/20 职场文书