跟我学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中RegExp保留小数点后几位数的方法分享
Aug 13 Javascript
JS与C#编码解码
Dec 03 Javascript
js关于字符长度限制的问题示例探讨
Jan 24 Javascript
javascript实现随机生成DIV背景色
Jun 20 Javascript
jQuery DateTimePicker 日期和时间插件示例
Jan 22 Javascript
jQuery ajax调用webservice注意事项
Oct 08 jQuery
浅谈ajax请求不同页面的微信JSSDK问题
Feb 26 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
JavaScript设计模式之职责链模式应用示例
Aug 07 Javascript
详解Angular模板引用变量及其作用域
Nov 23 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
Dec 14 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
Apr 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 Squid中可缓存的动态网页设计
2008/09/17 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
Python线程详解
2015/06/24 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
python中安装django模块的方法
2020/03/12 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
linux面试题参考答案(10)
2016/10/26 面试题
教师党性分析材料
2014/02/04 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
运动会入场口号
2014/06/07 职场文书
捐助倡议书
2015/01/19 职场文书
检讨书格式
2015/01/23 职场文书
工作失职检讨书
2015/01/26 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
贷款工资证明范本
2015/06/12 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python