模块系统

  Node根据CommonJS规范实现了一套自己的模块机制,可以使用require()导入一个模块,使用module.exports导出一个模块。

require使用

  在Node中我们可以使用require()导入一个模块,此时我们就会获得一个被导入模块的对象,我们就可以利用这个对象来完成一些操作,例如:

var fs = require("fs");
fs.readFile("content.txt",function(err,data){
    if(err){
        return console.log("读取文件错误!");
    }
    console.log(data.toString());
})

  我们通过require()将fs模块导入,此时我们就通过获得的fs模块的对象来实现对文件的操作。

  在Node中模块分为核心模块和文件模块,核心模块即被被编译成二进制代码的模块,是Node自带的一些模块。文件模块即我们自己编写的模块,无论哪种模块都可以通过require()函数来引入。

  require()的参数有四种不同的形式,分别为:

  核心模块:require("fs")

  相对文件路径:require("../xxx")

  绝对文件路径:require("/xxx")

  非核心模块的文件模块:require("xxx")

  加载模块的过程如下图所示:

require按照路径加载模块

  例如我们通过require("X")加载一个模块,首先会去文件模块缓存区中查找有没有该模块的缓存,如果缓存区中存在该模块,则直接返回。如果不存在该模块就会判断X的类型,如果是加载一个原生模块,就会按原生模块缓存区,原生模块这样的顺序去查找该模块,如果在原生模块缓存区中找到就会直接返回模块对象,如果在原生模块中找到就会在原生模块缓存区中加入该模块以方便下一次的使用,然后返回模块。

  如果X是一个路径类型首先把X当做文件按照X、X.js、X.json、X.node来查找该模块,找到之后加入到文件模块缓存区中然后返回该模块。如果没有找到,则把X当做是一个目录,在X里面按照index.js、index.json、index.node的顺序依次查找,如果目录中存在package.json则优先加载main属性对应的文件,在找到之后将模块加入到文件模块缓存区中然后返回该模块。

  我们在桌面上新建两个文件夹,分别为first和second,在first中新建first.js文件,first.js内容如下:

var name = "zt"
module.exports.show = function(){
    console.log(name);
}

  在sencond中新建main.js文件,main.js文件内容如下:

var first = require("../first");
first.show();

  在命令行中进入sencond文件node main.js执行,会报Error,不能找到first。我们按照上面的过程来排除错误,第一次加载文件缓存区中没有,也不是原生模块,此时就会按照路径的方式来加载first模块,首先把它当成一个文件,即在桌面中按照first、first.js、first.json、first.node的顺序来查找,都不存在,然后把first看错一个目录,然后在first文件内去查找,首先查看有没有package.json文件,存在就会加载main属性对应的文件,不存在就按照index.js、index.json、index.node的顺序来查找,仍然找不到最终就会报错。

  按照上面的流程我们可以通过三种方式来修改:

  1:在桌面上新建一个first.js,这时当按照文件来查找时就可以找到first.js,然后载入模块。

  2:在first文件夹中将first.js改名为index.js,这样在按照文件不能查找到,按照目录查找时就可以找到index.js,然后载入模块。

  3:在first文件夹中初始化一个package.json文件,main属性值为first.js,这样在按照目录查找时在目录中存在package.json文件就会加载main属性对应的文件。

require按照模块去查找

  例如在second的main.js中通过require("first")这种方式来加载first模块,使用这种方式来加载模块优先在当前文件夹(second文件夹)中查找node_modules文件夹,在node_modules文件夹中去查找first模块(在node_modules文件夹中也是按照路径的那个套路来查找),然后在sencond的父级下的node_modules文件下去查找first模块,按照这种方式一直查找下去,我们可以通过module.paths来查看查找的路径:

console.log(module.paths);

  在sencond文件夹中新建node_modules文件夹,然后把first文件夹放入到node_modules文件夹中,这样main.js中的require("first")就可以找到first模块了。

module.exports导出模块

  可以在一个文件中使用module.exports导出一个模块,这样在require()时就可以使用导出的属性或者方法。以上面的first.js为例我们在first.js中使用module.exports导出了show方法,这样我们在使用require()之后获取到的对象就可以使用show方法了。

  Node对module.exports的使用做了一些简化处理让我们在导出时可以使用exports:

module.exports = exports = {};

  module.exports和exports共用一个引用,这样就可以通过exports来收集属性:

var name = "zt"
exports.show = function(){
    console.log(name);
}

  通过module.exports = exports = {},这样在使用require()函数时获得的module.exports对象也就有了exports收集的属性。

  如果module.exports重新赋值module.exports和exports的引用关系也就断开了,而require()函数返回的是module.exports对象,也就不能得到exports收集的属性了,所以在使用时不要混用。

初学Node(三)模块系统的更多相关文章

  1. Node.JS模块系统

    1.什么是模块? 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js ...

  2. Node.js 模块系统

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...

  3. Node.js 教程 04 - 模块系统

    前言: Node.js的模块系统类似于C/C++的文件引用,可以声明对象,也可以定义类 创建对象. 大家这么理解,就简单了. 定义: 为了让Node.js的文件可以相互调用,Node.js提供了一个简 ...

  4. node模块系统常用命令

    node模块系统常用命令 命令 示例 备注 安装模块 npm install commander 最新版本 npm install commander@1.0.0 指定版本 npm install c ...

  5. 深入浅出node(2) 模块机制

    这部分主要总结深入浅出Node.js的第二章 一)CommonJs 1.1CommonJs模块定义 二)Node的模块实现 2.1模块分类 2.2 路径分析和文件定位 2.2.1 路径分析 2.2.2 ...

  6. nodejs的模块系统(实例分析exprots和module.exprots)

    前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...

  7. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  8. Node.js 模块

    稳定性: 5 - 锁定 Node 有简单的模块加载系统.在 Node 里,文件和模块是一一对应的.下面例子里,foo.js 加载同一个文件夹里的 circle.js 模块. foo.js 内容: va ...

  9. ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

随机推荐

  1. Linux 平台静默安装 Oracle客户端

    需求:Linux平台,安装完整版Oracle客户端 Tips:如果只是用到sqlldr,sqlplus功能,可以参考<Linux上oracle精简版客户端快速部署>快速部署精简版:如果需要 ...

  2. 系统吞吐量(TPS)、用户并发量、性能测试概念和公式

    分享一个概念: http://www.ha97.com/5095.html

  3. 基于jquery fly插件实现加入购物车抛物线动画效果,jquery.fly.js

    在购物网站中,加入购物车的功能是必须的功能,有的网站在用户点击加入购物车按钮时,就会出现该商品从点击出以抛物线的动画相似加入购物车,这个功能看起来非常炫,对用户体验也有一定的提高.下面介绍基于jque ...

  4. Go语言 数组

    介绍 Array 是值类型,Slice 和 Map 是引用类型.他们是有很大区别的,尤其是在参数传递的时候. 另外,Slice 和 Map 的变量 仅仅声明是不行的,必须还要分配空间(也就是初始化,i ...

  5. openssl evp 对称加密(AES_ecb,ccb)

    openssl evp 对称加密(AES_ecb,ccb) evp.h 封装了openssl常用密码学工具,以下主要说对称加密的接口 1. 如下使用 aes_256_ecb 模式的加密解密测试代码 u ...

  6. C语言程序设计第七次作业

    一.学习内容     本次课学习了函数的基本知识,需要大家对如下知识点进行总结:     1. 函数定义的基本格式,函数定义和函数原型(声明)的区别何在?     2. 函数的调用方式有哪几种     ...

  7. NewQuant正式在Github发布

    Github上的NewQuant https://github.com/xuruilong100/NewQuant NewQuant简介: NewQuant是一个小型开源C++库,可以解决数据分析.金 ...

  8. 如何禁止IE自动生成链接

    今天一位园友反馈,他用的是IE浏览器,在博客后台编辑器中输入下面的URL: http://www.windowsphone.com/zh-cn/store/app/博客园-uap/500f08f0-5 ...

  9. 1118ALTER TABLE tabname DISCARD TABLESPACE快速导入数据利用表空间

    -- 快速导入数据如果你有.ibd文件的一个干净的备份,你可以按如下操作从被起源的地方恢复它到MySQL安装中:相当快速 1. 发出这个ALTER TABLE语句: 2. ALTER TABLE tb ...

  10. MySQL也有潜规则 – Select 语句不加 Order By 如何排序?

    今天遇到一个问题,有一个 Select 语句没有加 "Order By",返回的数据是不确定的. 这种问题碰到不止几次了.追根寻底, Select 语句如果不加 "Ord ...