跟我学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 SHA-1:Secure Hash Algorithm
Dec 20 Javascript
爱恋千雪-US-AscII加密解密工具(网页加密)下载
Jun 06 Javascript
jquery 元素相对定位代码
Oct 15 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
详解Javascript 装载和执行
Nov 17 Javascript
在 Angular 中实现搜索关键字高亮示例
Mar 21 Javascript
详解在Vue中有条件地使用CSS类
Sep 30 Javascript
极简主义法编写JavaScript类
Nov 02 Javascript
小程序红包雨的实现示例
Feb 19 Javascript
基于Vue插入视频的2种方法小结
Apr 02 Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 Javascript
Vue 同步异步存值取值实现案例
Aug 05 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
跟老齐学Python之重回函数
2014/10/10 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
python小白学习包管理器pip安装
2020/06/09 Python
python中如何写类
2020/06/29 Python
python利用faker库批量生成测试数据
2020/10/15 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
.net软件工程师面试题
2015/03/31 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
求职个人评价范文
2014/04/09 职场文书
学习演讲稿范文
2014/05/10 职场文书
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB