跟我学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 15 Javascript
jQuery移动和复制dom节点实用DOM操作案例
Dec 17 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
jquery仿搜索自动联想功能代码
May 23 Javascript
Node.js 学习笔记之简介、安装及配置
Mar 03 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
Dec 04 Javascript
原生JS中slice()方法和splice()区别
Mar 06 Javascript
详细讲解vue2+vuex+axios
May 27 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 Javascript
React如何实现浏览器打印部分内容详析
May 19 Javascript
JavaScript实现留言板案例
Mar 17 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
Protoss热键控制
2020/03/14 星际争霸
解析PHP 5.5 新特性
2013/07/02 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
11款基于Javascript的文件管理器
2009/10/25 Javascript
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
JavaScript模拟push
2016/03/06 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
Python实现的数据结构与算法之队列详解
2015/04/22 Python
python用for循环求和的方法总结
2019/07/08 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
python异常处理和日志处理方式
2019/12/24 Python
python模拟斗地主发牌
2020/04/22 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
感恩母亲节活动方案
2014/03/04 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
答谢词范文
2015/01/05 职场文书
本溪关门山导游词
2015/02/09 职场文书
护理专业自荐信范文
2015/03/06 职场文书
赢在执行观后感
2015/06/16 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript