跟我学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 相关文章推荐
MSN消息提示类
Sep 05 Javascript
javascript 写类方式之六
Jul 05 Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 Javascript
js显示动态时间的方法详解
Aug 20 Javascript
判断数组的最佳方法(推荐)
Oct 11 Javascript
微信小程序 下拉菜单简单实例
Apr 13 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
Apr 28 Javascript
vue实现学生录入系统之添加删除功能
Jul 11 Javascript
如何用RxJS实现Redux Form
Dec 29 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
使用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
自己做矿石收音机
2021/03/02 无线电
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
python模块restful使用方法实例
2013/12/10 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Pandas之缺失数据的实现
2021/01/06 Python
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
个人股份合作协议书
2014/10/24 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书