跟我学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 相关文章推荐
JQueryEasyUI datagrid框架的进阶使用
Apr 08 Javascript
jquery如何通过name名称获取当前name的value值
Dec 20 Javascript
input禁止键盘及中文输入,但可以点击
Feb 13 Javascript
JavaScript编程的10个实用小技巧
Apr 18 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
Mar 31 Javascript
JavaScript实现格式化字符串函数String.format
Dec 16 Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 Javascript
node.js中EJS 模板快速入门教程
May 08 Javascript
jQuery Validate 校验多个相同name的方法
May 18 jQuery
JavaScript该如何学习 怎样轻松学习JavaScript
Jun 12 Javascript
mpvue 项目初始化及实现授权登录的实现方法
Jul 20 Javascript
基于element-ui封装表单金额输入框的方法示例
Jan 06 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递归算法的详细示例分析
2013/02/19 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
javascript 写类方式之七
2009/07/05 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
JS实现星星海特效
2019/12/24 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
使用Eclipse如何开发python脚本
2018/04/11 Python
Python退火算法在高次方程的应用
2018/07/26 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Python sublime安装及配置过程详解
2020/06/29 Python
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
元旦联欢会感言
2014/03/04 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
销售合作意向书范本
2015/05/08 职场文书
党支部鉴定意见
2015/06/02 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
Win11更新失败并提示0xc1900101
2022/04/19 数码科技