跟我学Node.js(四)---Node.js的模块载入方式与机制

 更新时间:2014年06月04日 10:17:37   作者:  
Node.js中模块可以通过文件路径或名字获取模块的引用。模块的引用会映射到一个js文件路径,除非它是一个Node内置模块。Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始的时候就预加载了。

其它的如通过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也不存在,那么加载将失败。

假如目录结构如下

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

输入如下

可以看到虽然require了两次,但modA.js仍然只执行了一次。mod1和mod2是相同的,即两个引用都指向了同一个模块对象。

相关文章

  • 前端大屏适配的三种解决方案总结

    前端大屏适配的三种解决方案总结

    在日常前端开发中,大屏项目是每个前端开发者必备技能,但是目前设备尺寸大小和分辨率都不相同,所以大屏适配成了一个头疼的问题,所以下面这篇文章主要给大家介绍了关于前端大屏适配的三种解决方案,需要的朋友可以参考下
    2024-03-03
  • js中的push和join方法使用介绍

    js中的push和join方法使用介绍

    push和join方法想必大家并不陌生吧,在本文将为大家详细介绍下js中的push和join方法的使用,感兴趣的朋友可以参考下
    2013-10-10
  • uniapp 如何设置 tabbar 的 midButton 按钮

    uniapp 如何设置 tabbar 的 midButton 按钮

    在UniApp开发中,设置TabBar的midButton按钮可以增加用户交互的便利性,本文介绍了在App.vue中监听事件的方法,并提供了官方文档链接作为参考,通过这种方式可以实现TabBar中的特殊按钮功能,提升应用的用户体验
    2024-10-10
  • javascript小数精度丢失的完美解决方法

    javascript小数精度丢失的完美解决方法

    下面小编就为大家带来一篇javascript小数精度丢失的完美解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • 在JS中解析HTML字符串示例代码

    在JS中解析HTML字符串示例代码

    这篇文章主要介绍了在JS中如何解析HTML字符串,需要的朋友可以参考下
    2014-04-04
  • 微信小程序自定义modal弹窗组件的方法详解

    微信小程序自定义modal弹窗组件的方法详解

    这篇文章主要给大家介绍了关于微信小程序自定义modal弹窗组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • js实现日期显示的一些操作(实例讲解)

    js实现日期显示的一些操作(实例讲解)

    下面小编就为大家带来一篇js实现日期显示的一些操作(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • JS进阶之从多线程到Event Loop全面梳理

    JS进阶之从多线程到Event Loop全面梳理

    JS是通过事件队列(Event Loop)的方式来实现异步回调的,但对很多初学JS的人来说,根本搞不清楚单线程的JS为什么拥有异步的能力,所以本文将从进程、线程的角度来解释这个问题
    2023-05-05
  • ionic中列表项增加和删除的实现方法

    ionic中列表项增加和删除的实现方法

    在项目中遇到表单似的页面,需要进行增加一行和减少一行的操作,基于ionic怎么实现呢?下面小编给大家分享ionic中列表项增加和删除的实现方法,一起看看吧
    2017-01-01
  • PDF.js前端开发使用代码示例及实用技巧

    PDF.js前端开发使用代码示例及实用技巧

    pdf.js是一款Nozilla开发的、用于网页上显示pdf文档的Javascript库,提供pdf文件的在线阅读,这篇文章主要给大家介绍了关于PDF.js前端开发使用实用技巧的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04

最新评论