模块系统

  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. 10、Node.js模块系统

    ##################################################################################介绍Node.js模块系统为了让No ...

  2. Node.JS模块系统

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

  3. Node.js 模块系统

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

  4. node基础—模块系统

    模块的概念 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块加载系统. 在 Node.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),换言之,一个 Node ...

  5. 27.Node.js模块系统

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模 ...

  6. Node.js 模块系统入门

    在编程领域中,模块是自包含的功能单元,可以跨项目共享和重用.它们使开发人员的生活更加轻松,因为我们可以使用它来增加应用程序的功能,而不必亲自编写这些功能.它还让我们可以组织和解耦代码,从而使应用程序更 ...

  7. Node.js的模块系统

    编写稍大一点的程序时一般都会将代码模块化.Node.js提供了一个简单的模块系统.模块既可能是一个文件,也可能是包含一个或多个文件的目录. 模块的创建  如果模块是个文件,一般将代码合理拆分到不同的J ...

  8. Node.js:模块系统

    ylbtech-Node.js:模块系统 1.返回顶部 1. Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的 ...

  9. Node.js:模块系统、函数

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

随机推荐

  1. Oracle数据库入门——初级系列教程

  2. 判断JavaScript对象为null或者属性为空

    http://blog.csdn.net/yiluoak_47/article/details/7766760 首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typ ...

  3. 在linux安装mysql,并设置远程访问

    1.查看系统有没有安装mysql. vpm -qa mysql 发现有删除:rpm -e mysql(rpm -e --nodeps mysql) 2.下载数据库 mysql-standard-5.0 ...

  4. 批量修改Project视图中Prefab的名字

    简要代码如下: using UnityEditor; using UnityEngine; using System.IO; using System.Collections; using Syste ...

  5. 《HelloGitHub月刊》第02期

    <HelloGithub>第02期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...

  6. Android学习笔记之横向二级菜单实现

    PS:元旦来一发. 学习内容: 1.Android二级横向菜单的实现过程.效果如上图...   这种横向的二级菜单在很多的app都有所应用.效果看起来还是非常的美观的.也算是项目需要,自己也就学了一下 ...

  7. php + Redis 写的类似于新浪微博的feed系统

    最近接了一个feed系统的外包,类似于微博那种!客户端是ios和android,服务器用的php,数据库用的是redis.分享下服务器和数据库部分的功能!希望对大家有帮助. 关于redis的介绍,大家 ...

  8. Java魔法堂:JUnit4使用详解

    目录                                                                                              1. 开 ...

  9. iOS实现图像素描效果

    使用GPUImageSketchFilter对象实现图像素描效果 NSString *const kGPUImageSketchFragmentShaderString = SHADER_STRING ...

  10. Github教程(3)

    Pull Request Pull Request 是自己修改源代码后,请求对方仓库采纳该修改时采取的一种行为. 场景1: 用户A在fork完用户B的项目时,A修改了代码并提交了一个Pull Requ ...