跟我学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 输出内容到新窗口具体实现代码
May 31 Javascript
js Math 对象的方法
Sep 01 Javascript
基于JQuery的列表拖动排序实现代码
Oct 01 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
Aug 18 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
Mar 01 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
Apr 13 Javascript
JS生成随机打乱数组的方法示例
Dec 23 Javascript
深入了解javascript 数组的sort方法
Jun 01 Javascript
vue自动路由-单页面项目(非build时构建)
Apr 30 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
vue中使用mockjs配置和使用方式
Apr 06 Vue.js
使用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通过curl模拟登陆DZ论坛
2015/05/11 PHP
PHP概率计算函数汇总
2015/09/13 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
CI框架附属类用法分析
2018/12/26 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
python聊天程序实例代码分享
2013/11/18 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
Django后台admin的使用详解
2019/07/08 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
如何用python处理excel表格
2020/06/09 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
HTML5学习笔记之History API
2015/02/26 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
司机岗位职责
2013/11/15 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
vue特效之翻牌动画
2022/04/20 Vue.js