• node.js 学习笔记(三)模块基础


    Node Js采用模块方式来管理和组织代码,NodeJs的所有的功能都存在每个模块中

    一、什么是模块?

    简单说,一个具有特定功能的文件就是一个模块,模块之间可能存在一定的依赖关系,使用模块可以很好的把这些依赖关系整合起来。

    二、为什么要使用模块

    2.1 解决命名冲突

    2.2 提高代码的复用性

    2.3 避免依赖管理

    2.4 可以实现代码的异步加载,提高页面的加载性能,避免网页失去响应

    2.5 有利于团队分工

    三、模块规范

    目前有三种流行的模块规范:AMD,CMD,Common.js

    先简单介绍下:

    3.1,AMD:(Asynchronous Module Definition=异步模块定义),这种规范是异步的加载模块,requirejs应用了这一规范,适合客户端浏览器环境。主要解决js文件依赖问题还有js加载时浏览器会停止页面渲染,加载文件越多页面失去响应时间更长;

    模块引用方式:

    js代码:

    define(id?,dependencies?,factory)
        第一个参数 id 为字符串类型,表示了模块标识,为可选参数。若不存在则模块标识应该默认定义为在加载器中被请求脚本的标识。如果存在,那么模块标识必须为顶层的或者一个绝对的标识。
        第二个参数,dependencies ,是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。
        第三个参数,factory,是一个需要进行实例化的函数或者一个对象.

    创建模块标识为 alpha 的模块,依赖于 require, export,和标识为 beta 的模块  

    define("alpha", [ "require", "exports", "beta" ], function( require, exports, beta ){
        export.verb = function(){
            return beta.verb();
            // or:
            return require("beta").verb();
        }
    });

    类似与 CommonJS 方式定义

    define(function(){
    var exports = {};
    exports.say = function(){
    alert('hello');
    };
    return exports;
    });

    3.2,CMD:(Common Module Definition), 是seajs推崇的规范,国内大牛玉伯之作。

    主要控制JS文件加载时机,当我们需要的时候再加载

     define( factory );
     define( id?, deps?, factory );
    全局函数define,用来定义模块。
    字符串id为模块标识,数组deps为模块依赖
        参数 factory  可以是一个函数,也可以为对象或者字符串。
        当 factory 为对象、字符串时,表示模块的接口就是该对象、字符串。

     factory 为函数的时候,表示模块的构造方法,执行构造方法便可以得到模块向外提供的接口。

    define( function(require, exports, module) { 
        // 模块代码
    });

    3.3,Common.Js:采用的是同步加载文件方式,只适用于服务端(NodeJs平台)

    demo:model.js

        var name = "Array"
        function printName(){  
          console.log(name);
        }    
        function printFullName(firstName){ 
           console.log(firstName + name)
        }   
        module.exports = {      
           printName:  printName,      
           printFullName:  printFullName
        }
        var nameModule = require("./model.js")
        nameModule.printName()  //  "Array"
        nameModule.printFullName("Bob")  //  "Bob Array"

    运行:

    注:

    • 一个单独的文件就是一个模块,每个模块都是一个单独的作用域,在模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性

    • 模块输出:模块只有一个出口,module.exports对象,我们需要把模块输出的内容放入该对象

    • 加载模块:加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象,如果请求的模块不能返回,那么"require"必须抛出一个错误

    四、模块特点

    4.1 独立性。模块的功能代码都是写在一个函数里,模块与模块互不影响

    4.2 模块中使用的var 定义变量都是局部变量

    4.3 模块有一个模块对象,包含moduleId(模块名),esports(导出对象)

    4.4 如果模块中需要暴露方法或属性给外部使用,那么就执行往exports对象上面添加。

    4.5 使用一个模块用require(“moduleId”),该方法返回的是模块对象的exports对象。

    五,自定义模块

    从模块的定义我们知道,一个JS文件就是一个模块,所以定义一个模块,我们只要新建一个JS文件就好

    a.js文件

    function tellMe(){
    
     console.log(“this is a.js”);
    
    }

    在a.js文件中我们简单定义了个方法,根据模块的独立性(内部的变量和函数只能在该模块使用)我们只能在当前模块中使用,所以我们可以使用模块内的exports对象(导出对象)输出模块中功能供外部使用。

    function sayHi(){
    
     console.log(“hi”);
    
    }
    //非常重要,导出模块功能(供外部使用)
    
    exports.tellMe = tellMe;

    模块定义完毕,下面就是要使用了,我们在b.js文件中使用a.js模块

    b.js

    var aa=require("./a.js");//引入模块
    aa.tellMe();//使用模块中的功能

    注:在文件里面引入模块的话,相对路径必须添加  . / ,不可以省略 . /   ,否则会报错  ;可以省略后缀名

    运行

  • 相关阅读:
    基于范围的for循环
    ML.NET技术研究系列-2聚类算法KMeans
    SQLServer常用运维SQL整理
    ML.NET技术研究系列-1入门篇
    Kafka基本知识整理
    .NetCore技术研究-EntityFramework Core 3.0 Preview
    容器技术研究-Kubernetes基本概念
    特来电混沌工程实践-混沌事件注入
    .Net Core技术研究-Span<T>和ValueTuple<T>
    Visual Studio Git本地Repos和GitHub远程Repos互操作
  • 原文地址:https://www.cnblogs.com/smile-xin/p/11609382.html
Copyright © 2020-2023  润新知