nodejs之node-modules理解

参考: http://www.cnblogs.com/dolphinX/p/3485260.html

关于NPM:

npm 是 nodejs 的包管理和分发工具。它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单。

Node.js 和 npm 对使用 Angular 和其他平台进行现代网络开发是至关重要的。 Node 驱动客户端开发和构建工具。 npm 包管理器本身是 node 应用,用于安装 JavaScript 库。

1.什么是模块(modules)?

在node.js中模块与文件是一一对应的,也就是说一个node.js文件就是一个模块,文件内容可能是我们封装好的一些JavaScript方法、JSON数据、编译过的C/C++拓展等,在 关于node.js的误会 提到过node.js的架构。 其中http、fs、net等都是node.js提供的核心模块,使用C/C++实现,外部用JavaScript封装。

怎么使外部访问这个module,我们知道客户端的JavaScript使用script标签引入JavaScript文件就可以访问其内容了,但这样带了的弊端很多,最大的就是作用域相同,产生冲突问题,以至于前端大师们想出了立即执行函数等方式,利用闭包解决。node.js使用exports和require对象来解决对外提供接口和引用模块的问题。

test.js

复制代码
var Student=function(){
    var name='';

     this.setName=function(n){
        name=n;
    }; 

    this.printName=function(){
        console.log(name)    ;
    };
};

module.exports=Student;
复制代码

 这样我们的require语句就可以优雅一些了

var Student=require('./test');

 

很神奇的样子,不是说好的exports是模块公开的接口嘛,那么module.exports是什么东西?

module.exports与exports

事实的情况是酱紫的,其实module.exports才是模块公开的接口,每个模块都会自动创建一个module对象,对象有一个modules的属性,初始值是个空对象{},module的公开接口就是这个属性——module.exports。既然如此那和exports对象有毛线关系啊!为什么我们也可以通过exports对象来公开接口呢?

为了方便,模块中会有一个exports对象,和module.exports指向同一个变量,所以我们修改exports对象的时候也会修改module.exports对象,这样我们就明白网上盛传的module.exports对象不为空的时候exports对象就自动忽略是怎么回事儿了,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。


require搜索module方式

node.js中模块有两种类型:核心模块和文件模块,核心模块直接使用名称获取,比如最长用的http模块

var http=require('http');

 

在上面例子中我们使用了相对路径 './test'来获取自定义文件模块,那么node.js有几种搜索加载模块方式呢?

  1. 核心模块优先级最高,直接使用名字加载,在有命名冲突的时候首先加载核心模块
  2. 文件模块只能按照路径加载(可以省略默认的.js拓展名,不是的话需要显示声明书写)
    1. 绝对路径
    2. 相对路径

2.客户端加载node_modules里面的模块
在index.html 这样引用

你可能感兴趣的:(nodejs之node-modules理解)