跟我学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验证表单大全
Nov 25 Javascript
基于jQuery的360图片展示实现代码
Jun 14 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
Bootstrap表单Form全面解析
Jun 13 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
Aug 08 Javascript
利用ES6语法重构React组件详解
Mar 02 Javascript
JavaScript验证知识整理
Mar 24 Javascript
基于JQuery的Ajax方法使用详解
Aug 16 jQuery
javascript中的隐式调用
Feb 10 Javascript
Vue 配合eiement动态路由,权限验证的方法
Sep 26 Javascript
webpack5 联邦模块介绍详解
Jul 08 Javascript
详解Typescript里的This的使用方法
Jan 08 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合并数组函数array_merge用法分析
2017/02/17 PHP
PHP goto语句用法实例
2019/08/06 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
python str字符串转uuid实例
2020/03/03 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
python 画图 图例自由定义方式
2020/04/17 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
巧克力蛋糕店创业计划书
2014/01/14 职场文书
环境科学专业求职信
2014/08/04 职场文书
辞职书格式样本
2015/02/26 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS