跟我学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 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
JavaScript 三种创建对象的方法
Oct 16 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
Sep 04 Javascript
JS获取几种URL地址的方法小结
Feb 26 Javascript
js特殊字符过滤的示例代码
Mar 05 Javascript
JavaScript变量声明详解
Nov 27 Javascript
js验证框架实现代码分享
May 18 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
May 24 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
Oct 24 Javascript
jQuery布局组件EasyUI Layout使用方法详解
Feb 28 Javascript
jQuery常用选择器详解
Jul 17 jQuery
js实现单张图片平移切换效果
Oct 11 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/03/05 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
php+ajax实现的点击浏览量加1
2015/04/16 PHP
php邮件发送的两种方式
2020/04/28 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
深入理解vue中的$set
2017/06/01 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
webstorm添加*.vue文件支持
2018/05/08 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
跟老齐学Python之Python安装
2014/09/12 Python
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
python搜索算法原理及实例讲解
2020/11/18 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
教育技术职业规划范文
2014/03/04 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
农业项目投资意向书
2015/05/09 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
用python批量解压带密码的压缩包
2021/05/31 Python