美文网首页
NodeJS——模块

NodeJS——模块

作者: Eylen | 来源:发表于2018-03-06 21:18 被阅读0次

    Node模块:方便代码的组织(传统来说按照逻辑相关性)和重用一个文件或一个目录即一个模块,不让你有机会再不经意间污染全局变量。


    污染全局变量 :

    在 php 中,你的程序可能出现以下的情况

    
    function hello($name) {
    
        return print($name);
    
    }
    
    include('text.php');
    
    

    如果在text.php也定义了一个hello函数,就会报错。

    同理,倘若你想要使用某一个没有命名空间的第三方API,这个库中可能会有一个跟你程序中同名的类,无论是修改自己或第三方的类名,都不是一件容易的事情。


    创建模块

    模块可能是一个文件或是一个目录。如果模块是一个目录,那么node通常会在这个目录下找一个index.js的文件作为模块的入口。

    Node模块允许你从被引入文件中选择要暴露给文件的函数和变量。

    1. 如果返回的函数或变量不止一个,用exports对象的属性来指明。

    2. 如果只返回一个函数或变量,可以设定module.exports属性

    exports 与module.exports的区别

    每一个node.js执行文件,都会自动创建一个module对象,同时,这个module对象会自动创建一个exports属性并初始化为{}。即:
    module.exports = {};
    exports 与 module.exports 都指向了同一个内存空间,而require()返回的是module.exports而不是exports()。

    1. 当你想要返回不止一个的函数或变量时,用exports对象的属性来指明。
    exports.a = function(){};
    exports.b = 1;
    
    1. 当你只只返回一个函数或变量,可以设定module.exports属性
    module.exports.a = function(){};
    

    再看:
    test1.js

    var x = require('test2.js');
    console.log(x.a);
    

    • ex1:
      test2.js
      exports.a = 1;
      
      test1.js 的结果为:1

    • ex2:
      test2.js
      module.exports.a = 1;
      
      test1.js 的结果为:1

    • ex3
      test2.js
      exports.a = 2;
      module.exports.a = 1;
      
      test1.js 的结果为:1
    • ex4
      test2.js
      module.exports.a = 1;
      exports.a = 2;
      
      test1.js 的结果为:1
      module.exports对象不为空时,exports将会自动被忽略。因为此前module.exports通过赋值已经与exports指向的内存空间不一样了,而require()所引用的是module.exports,故而结果为1
    • ex5
      test2.js
      exports = function(){};
      
      test1.js 的结果为:报错
      因为exports此时指向的内存空间是该匿名函数的新空间,而此前ex1只是对原有与module.exports对象共同指向的空对象进行修改,但现在exports与module.exports各自指向了两个不同的内存空间,module.exports仍然指向了{},并没有属性a,故报错。

    总结

    1. exports 最初被定义为可以定义属性的空对象。
    2. module.exports 可以对外提供单个变量、函数或对象。
    3. 一个既有exports 又有 module.exports 的模块,exports会被忽略。
    4. 如果 exports设定为别的,就打破了exports 与 module.exports 的引用关系。若想要维持,则将module.exports 再次引用exports
      module.exports = exports;
    5. require() 引用的是module.exports

    引用模块

    require()

    1. 相对路径
    2. node_modules目录(可以不知道模块在文件系统中的具体位置)

    查找模块的步骤
    核心模块 ->
    当前目录下的node_modules目录 ->
    父目录的node_modules ->
    ...->
    环境变量 NODE_PATH 指定的目录 ->
    抛出异常 / 一找到模块就立即返回

    注意

    1. 当模块为目录时,在模块目录中定义模块的文件必须命名为index.js。除非在当前目录的package.json文件中特别指明。
    {
      "main" : "./example.js"
    }
    
    1. Node能把模块作为对象缓存起来。当程序中两个文件引入了相同的模块,第一次就会把模块返回的数据存到内存中,第二次就不用再去访问和计算模块的源文件了。(实际上有第二次引入的机会——“猴子补丁”)。

    相关文章

      网友评论

          本文标题:NodeJS——模块

          本文链接:https://www.haomeiwen.com/subject/kpmhfftx.html