跟我学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常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
Dec 25 Javascript
jQuery Ajax请求状态管理器打包
May 03 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 Javascript
用jQuery实现圆点图片轮播效果
Mar 19 Javascript
AngularJS 应用模块化的使用
Apr 04 Javascript
React如何避免重渲染
Apr 10 Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
Dec 05 Javascript
JavaScript中构造函数与原型链之间的关系详解
Feb 25 Javascript
ES6 Object方法扩展的应用实例分析
Jun 25 Javascript
vue-week-picker实现支持按周切换的日历
Jun 26 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 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设计模式 Prototype (原型模式)代码
2011/06/26 PHP
php发送post请求的三种方法
2014/02/11 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
php Session无效分析资料整理
2016/11/29 PHP
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
python的迭代器与生成器实例详解
2014/07/16 Python
python多任务及返回值的处理方法
2019/01/22 Python
pygame实现非图片按钮效果
2019/10/29 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
女大学生个人求职信
2013/12/09 职场文书
音乐教学案例
2014/01/30 职场文书
运动会报道稿300字
2014/10/02 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
解析Java中的static关键字
2021/06/14 Java/Android