Node.js中的模块化

天天一篇文章来记录记录本身的成长吧。大二,该静心了。加油~node

好了,废话很少说,今天说说nodejs中的模块化.(注:此文为本身对书nodejs实战的总结)json

 

nodejs一个重要的特性就是模块化,模块就是node.js对经常使用功能进行分组的方式。并且,node无需真正辨别模块究竟是咱们本身编写的仍是从外部仓库中获取的。这样咱们只须要一个额外的json文档和一两行代码,咱们就能引用别人的代码或者别人引用咱们的代码,是否是很酷~。ide

 

好,下面咱们来编写一个简单的模块:模块化

exports.hello_world = function(){
    console.log("Hello World");
}

咱们用mymodule.js文件来保存这段代码,exports对象是一个特殊的对象,在每一个咱们建立的文件中由Node的文件系统建立,当咱们引用这个模块时,会做为require函数的值返回。它被封装在每一个模块的module对象中,用来暴露函数,变量或类。使用模块的方法也很简单,代码以下:函数

 

var mm = require('./mymodule');
mm.hello_world();

这样咱们能够经过exports对象来暴露任何咱们想要暴露的函数和类。当咱们频繁的从模块中返回对象时,咱们会有两种使用的核心模式:单元测试

第一种就是咱们的工厂模式,看下面一段代码:测试

function Hello(lang){
    this.language  = lang;
    this.greet() = function(){
        switch(this.language){
            case "en" :return "Hello1";break;
            case "de" :return "Hello2";break;
            case "jp" :return "Hello3";break;
            default:return "No speaka that language";break;
        }
    }
}


//如今咱们用工厂模式来返回咱们Hello类的实例
exports.create_Hello = function(lang){
    return new Hello(lang);
}
View Code

这种模式的有点事模块能够经过exports对象来暴露其余的函数和类。ui

第二种模式就是构造函数模式,即直接模式,如今咱们函数不变,用构造函数代码就应是这样:this

module.exports = Hello;

注意咱们在使用的时候就应该把代码变一下:spa

var hello = require("./mymodule");
var lang = "en";
var obj = new hello(lang);
obj.greet();

但记住在这里咱们真正惟一暴露的是一个类的构造函数。这和咱们面向对象的思想很接近,可是有个缺点就是咱们不能让模块暴露更多的东西。因此咱们常常会用的是咱们的工厂模式。

关于exports和module.exports的区别你们来看这个网址:https://cnodejs.org/topic/52308842101e574521c16e06.

 

咱们知道了想要在一个文件中引入模块咱们只需使用require函数便可,注意咱们引入的模块对于引入他们的模块时私有的。若是a.js加载http模块,那么b.js是没法加载这个模块的,除非b也引入了http模块。

下面看看Node.js是怎样来查找模块的,其实规则很简单:

1.当请求的是内置模块(如http和fs)时,node会直接使用这些模块

2.当请求的模块一路径符(如./  ../  /)开始时,node会找到指定的目录而且加载他,若是没有在模块名中指定.js扩展名,那么node会首先查找基于同名文件夹的模块,若是没有找到,那么他会添加扩展名.js .json和.node,并尝试一次加载这些模块(带node扩展名的模块会被编译成附加模块)

3.若是没有路径符,node会在当前文件夹的node_modules/子文件夹下查找模块。若是找到,则加载该模块,不然,node会以本身的方式在当前位置的路径树下寻找mode_modules/文件夹,若是还失败,那么他会在一些默认的地址下进行搜寻,如/usr/lib和/usr/local/lib文件夹.

4.若是还没找到就抛出错误.

 

之前咱们在引用文件时很容易进入引用文件死循环,可是在node中却不会这样。好比我在a.js中引入b.js,在b.js中引入a.js,在main.js中引入a.js,这个在node 中的执行顺序是先加载main.js,而后运行 引入a.js,再引入b.js,而后node会检测到循环并返回一个指向a.js的对象,可是不会再执行此代码。

 

咱们知道node.js的每一个文件都是一个含有module和exports对象的模块,这个模块也能够很复杂:包含一个目录用来保存模块的内容和一个包含包信息的文件。若是咱们想要编写一系列的支持文件,并将模块的功能拆散到多个js文件中,甚至包含单元测试,那么咱们能够这么来写:

1.建立一个文件夹来存放模块的内容

2.添加一个名为package.json的文件到文件夹中。文件至少包含当前模块的名字和一个主要的JS文件(用来一开始加载该模块)

3.若是Node没有找到package.json文件或者没有指定主JS文件,那他就会查找index.js(或者是编译后的附加模块index.node)

 

固然模块的内容不止这么一点点,剩下的之后再补充吧。

相关文章
相关标签/搜索