• 简要理解CommonJS规范


    写在前面:

    一个文件就是一个模块。
      另外本文中的示例代码需要在node.js环境中方可正常运行,否则将出现错误。事实上ES6已经出现了模块规范,如果使用ES6的模块规范是无需node.js环境的。因此,需要将commonJS规范和ES6的模块规范区分开来。

    一、为什么制定CommonJS规范?

    在后端,JavaScript的规范远远落后并且有很多缺陷,这使得难以使用JavaScript开发大型应用。比如:

    1. 没有模块系统
    2. 标准库较少
    3. 没有标准接口
    4. 缺乏包管理系统
    5. 列表内容

    CommonJS规范的提出,主要是为了弥补JavaScript没有标准的缺陷,已达到像Python、Ruby和Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段。

    二、CommonJS模块规范

    CommonJS模块规范主要分为三部分:模块引用、模块定义、模块标识。

    1、模块引用
      如果在a.js文件中使用如下语句

    var math=require('math');
    

    意为使用require()方法,引入math模块,并赋值给变量math。事实上,命名的变量名和引入的模块名不必相同,就像这样:

    var Math=require('math');
    

    赋值的意义在于,a.js中将仅能识别Math,因为这是已经定义的变量,并不能识别math,因为math没有定义。

    带路径和不带路径
      上面例子中require的参数仅仅是模块名字的字符串,没有带有路径,引用的是a.js所在当前目录下的node_modules目录下的math模块。如果当前目录没有node_modules目录或者node_modules目录里面没有安装math模块,便会报错。
      
      如果要引入的模块在其他路径,就需要使用到相对路径或者绝对路径,例如:

    var add=require('./add.js')
    

    上面例子中引入了当前目录下的add.js文件,并赋值给add变量。

    2、模块定义

    module对象:在每一个模块中,module对象代表该模块自身。
    export属性:module对象的一个属性,它向外提供接口。
    

    仍然采用上一个示例,假设add.js中的代码如下:

    function add(num1,num2){
    	alert(num1+num2);
    }
    

    尽管a.js文件引入了add.js文件,前者却仍然无法使用后者中的add函数,在a.js文件中add(3,5)这样的代码会报错,提示add不是一个函数。
      add.js中的函数要能被其他模块使用,就需要暴露一个对外的接口,export属性用于完成这一工作。将add.js中代码改为如下:

    exports.add=function (num1,num2){
    	alert(num1+num2);
    }
    

    a.js文件就可以正常调用add.js中的方法,例如add.add(3,5)这样的调用能够正常执行,前一个add意为本文件中add变量代表的模块,后一个add是引入模块的add方法。

    3、模块标识

    模块标识指的是传递给require方法的参数,必须是符合小驼峰命名的字符串,或者以 . 、… 、开头的相对路径,或者绝对路径。

    三、CommonJS模块规范的好处

    CommonJS模块规范很好地解决变量污染问题,每个模块具有独立空间,互不干扰,命名空间等方案与之相比相形见绌。

    CommonJS规范定义模块十分简单,接口十分简洁。

    CommonJS模块规范支持引入和导出功能,这样可以顺畅地连接各个模块,实现彼此间的依赖关系。

  • 相关阅读:
    Ubuntu 18.04 上使用xrdp远程桌面登录蓝屏解决
    给定几个字母,输出所有可能的组合(使用递归解决)
    docker容器启动参数
    群辉6.1.7安装scrapy框架执行爬虫
    python爬虫在解析不带引号的json报错的问题解决方案
    python的datetime常用方法
    Ubutntu安装docker启动报Removed /etc/systemd/system/docker.service.
    Django admin argument to reversed() must be a sequence
    linux(乌班图)下执行pip没有问题,执行sudo pip报错的问题
    Robot Framework 关键字操作实例
  • 原文地址:https://www.cnblogs.com/twodog/p/12134750.html
Copyright © 2020-2023  润新知