美文网首页
09 全局-module

09 全局-module

作者: Frewen | 来源:发表于2018-10-04 11:33 被阅读0次

    全局:模块管理

    Node应用是由模块组成的,Node遵循了CommonJS的模块规范,来隔离每个模块的作用域,使每个模块在它自身的命名空间中执行。

    JS 模块化的两种方案分别是:AMDCommonJS

    • AMD 规范的主要内容:AMD是异步模块加载机制。从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制。define和require这两个定义模块、调用模块的方法,合称为AMD模式
    • CommonJS规范的主要内容:模块必须通过 module.exports 导出对外的变量或接口,通过 require() 来导入其他模块的输出到当前模块作用域中。
    module分类
    使用第三方模块
    • 导入 date-now 模块
    • 调用 date-now 模块的 now 方法,在控制台打印 now 的运行结果
    • 安装 date-now 模块,运行程序
    • 创建 package.json 文件,用 npm install module-name -S 安装模块
    • 查看 package.json 文件中的依赖项
    #!/usr/bin/node
    
    var now = require('date-now');
    
    console.log(now());
    console.log(Date.now());
    
    ## 输出结果
    1537882086300
    1537882086304
    

    在程序运行的时候,程序会报错,因为对于该程序,没有date-now这个模块,因此,需要先通过npm包管理器进行安装

    #npm缩写于 Node Packaged Modules, 是 node.js 的模块管理器
    ~/node.js/nodejs-demo/07-module(master) » npm install date-now
    

    关于在每一个包管理器中的package.json文件,这个文件是一个项目配置文件,里面有项目配置的一些信息,同时该文件还包括所需要的模块依赖项

    使用 package.json 配置文件管理第三方模块的过程:

    • 首先我们创建一个文件夹package,在这个文件夹里面初识一个package.json文件
    ~/package » npm init
    # 此时我们打开package.json文件
    ~/package » cat package.json                            wangding@OFFICE
    {
      "name": "package",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "dependencies": {
        "date-now": "^1.0.1"
      }
    }
    

    其中需要注意"devDependencies""dependencies" ,其中前者是开发时以来的npm模块,后者是自己所写的打包成的应用程序所需要的npm模块

    • 安装第三方模块:npm install moduleName -S(--save) ,此时该模块会自动添加到package.json文件里的"dependencies" 里面
    • 发布程序和 package.json 配置文件(发布到npm网站上),然后使用时:运行 npm install 安装第三方模块就可以使用自己的创建的第三方模块了

    如果我们使用的是别人的npm的包管理器的时候,只需要在别人的项目下运行npm install命令,就可以让程序自动下载程序运行时所需要的所有模块

    创建并使用模块,导出变量
    • 在 02-export-var.js 脚本中导出变量 Math.PI打印 module 信息
    • 在 02-main.js 脚本中导入上面的模块
    • 测试模块的接口,观察 module 中的 exports 信息
    #!/usr/bin/node
    // export-var.js
    module.exports = Math.PI;
    
    console.dir(module);// dir是输出一个对象
    
    #!/usr/bin/node
    
    var PI = require('./02-export-var');
    
    console.log('\n'+ PI);
    console.log();
    console.dir(module);
    
    创建并使用模块,导出函数
    • 在 02-export-function.js 脚本中定义 circle 函数
    • 函数的入口参数是圆的半径
    • circle 函数返回一个对象
    • 对象中有两个成员函数,分别计算:圆的面积和周长
    • 导出 circle 函数
    • 在 02-main.js 脚本中导入上面的模块
    • 测试模块的接口,观察 module 中的 exports 信息
    #!/usr/bin/node
    // 02-export-function.js
    function circle(radius){
      return {
        diameter:function(){return 2*radius;},
        circumference:function(){return 2*Math.PI*radius;},
        area:function(){return Math.PI*radius*radius;}
      };
    }
    
    module.exports = circle;
    
    var circle = require('./02-export-function');
    
    const log = console.log;
    
    log(circle(20).diameter());
    log(circle(20).circumference());
    log(circle(20).area());
    
    创建并使用模块,导出对象
    • 在 02-export-object.js 脚本中定义 Circle 对象字面量
    • Circle 对象有三个公开方法,分别计算圆的直径、面积和周长
    • 导出 Circle 对象,打印 module 信息
    • 在 02-main.js 脚本中导入上面的模块
    • 测试模块的接口,观察 module 中的 exports 信息
    #!/usr/bin/node
    // 02-export-object.js 
    module.exports = {
      diameter: function(radius){return 2*radius;},
      circumference:function(radius){return 2*Math.PI*radius;},
      area:function(radius){return Math.PI*radius*radius;}
    }
    
    var circle = require('./02-export-object');
    
    const log = console.log;
    
    log(circle.diameter(20));
    log(circle.circumference(20));
    log(circle.area(20));
    
    使用全局对象 global
    • 在 03-global.js 定义模块级变量 pi, 函数 circle 以及对象字面量 objCircle
    • 编写 03-main.js 脚本,导入 03-global.js 脚本
    • 使用 03-global.js 脚本中的变量、函数和对象
    • 运行 03-main.js,观察程序结果,理解程序出错的原因
    • 修改 03-global.js 脚本,将变量、函数和对象定义为全局的
    • 运行 03-main.js 脚本,观察程序结果,理解程序工作原因
    #!/usr/bin/node
    // 03-global.js
    global.pi = Math.PI;
    
    global.circle = (radius)=>{
      return {
        circumference:function(){return 2*Math.PI*radius;},
        area:function(){return Math.PI*radius*radius;}
      }
    }
    
    global.circleobj = {
      circumference:function(radius){return 2*Math.PI.radius},
      area:function(radius){return Math.PI*radius*radius}
    }
    
    #!/usr/bin/node
    // 03-main.js
    require('./03-global.js');
    console.log(global.pi);
    console.log(global.circle(20).circumference());
    console.log(global.circleobj.area(20));
    
    使用模块级变量在对象间共享信息
    • 编写 04-share.js 脚本,定义模块级变量 count,定义构造函数 Num
    • Num 有两个公开方法:add 让 count 加一,getCount 得到 count 的值
    • 导出构造函数 Num
    • 编写 04-main.js 脚本,导入 Num 构造函数
    • 用 Num 实例化 n1 和 n2 两个对象
    • n1.add() 方法调用两次,控制台打印 n1.getCount() 和 n2.getCount()
    • n2.add() 方法调用一次,控制台打印 n1.getCount() 和 n2.getCount()
    • 运行 04-main.js 程序,观察程序运行结果,理解程序工作原理
    #!/usr/bin/node
    // 04-share.js
    var count = 0;
    function Num(){
      this.add = ()=>{count++;}
      this.getcount = ()=>{console.log(count);};
    }
    
    module.exports = Num;
    
    #!/usr/bin/node
    // 04-main.js
    var Num = require('./04-share.js');
    var n1 = new Num();
    var n2 = new Num();
    
    n1.add();
    n1.add();
    n1.getcount();
    n2.getcount();
    n2.add();
    n1.getcount();
    n2.getcount();
    ## 输出结果
    2
    2
    3
    3
    
    npm模块的目录结构和程序结构
    目录结构
    程序结构

    相关文章

      网友评论

          本文标题:09 全局-module

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