博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CommonJS规范
阅读量:4576 次
发布时间:2019-06-08

本文共 2044 字,大约阅读时间需要 6 分钟。

CommonJS是服务器端模块的规范,Node.js采用了这个规范。

根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。下面就是一个简单的模块文件example.js。

console.log("evaluating example.js");

var invisible = function () {

  console.log("invisible");

}

exports.message = "hi";

exports.say = function () {

  console.log(message);

}

使用require方法,加载example.js。

var example = require('./example.js');

这时,变量example就对应模块中的exports对象,于是就可以通过这个变量,使用模块提供的各个方法。

{

  message: "hi",

  say: [Function]

}

require方法默认读取js文件,所以可以省略js后缀名。

var example = require('./example');

js文件名前面需要加上路径,可以是相对路径(相对于使用require方法的文件),也可以是绝对路径。如果省略路径,node.js会认为,你要加载一个核心模块,或者已经安装在本地 node_modules 目录中的模块。如果加载的是一个目录,node.js会首先寻找该目录中的 package.json 文件,加载该文件 main 属性提到的模块,否则就寻找该目录下的 index.js 文件。

下面的例子是使用一行语句,定义一个最简单的模块。

exports.do = function(a, b){ return a + b };

上面的语句定义了一个加法模块,做法就是在exports对象上定义一个do方法,那就是供外部调用的方法。使用的时候,只要用require函数调用即可。

var add = require('./addition');

add.do(1,2)

// 3

再看一个复杂一点的例子。

// foobar.js

function foobar(){

        this.foo = function(){

                console.log('Hello foo');

        }

        this.bar = function(){

                console.log('Hello bar');

        }

}

exports.foobar = foobar;

调用该模块的方法如下:

var foobar = require('./foobar').foobar,

    test   = new foobar();

test.bar(); // 'Hello bar'

有时,不需要exports返回一个对象,只需要它返回一个函数。这时,就要写成module.exports。

module.exports = function () {

  console.log("hello world")

}

AMD规范与CommonJS规范的兼容性

CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数。由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。

AMD规范使用define方法定义模块,下面就是一个例子:

define(['package/lib'], function(lib){

    function foo(){

        lib.log('hello world!');

    }

    return {

        foo: foo

    };

});

AMD规范允许输出的模块兼容CommonJS规范,这时define方法需要写成下面这样:

define(function (require, exports, module){

    var someModule = require("someModule");

    var anotherModule = require("anotherModule");    

 

    someModule.doTehAwesome();

    anotherModule.doMoarAwesome();

 

    exports.asplode = function (){

        someModule.doTehAwesome();

        anotherModule.doMoarAwesome();

    };

});

 

转载于:https://www.cnblogs.com/yuqing-o605/p/6486824.html

你可能感兴趣的文章
python登录面向对象_python基础 面向对象一
查看>>
人工智能建立本体库_基于本体技术的知识库构建设想
查看>>
python程序设计教程胡建华_Python程序设计教程
查看>>
仓库温度湿度控制措施_仓库温度、湿度控制管理制度(1)
查看>>
linux下定时调度shell脚本_Linux下使用shell脚本自动执行脚本文件 编辑shell定时脚本...
查看>>
win7如何设置通电自动开机_win7系统设置自动开机
查看>>
erlang启动参数详解_Erlang启动参数详解
查看>>
mac php-frm xampp_如何在Mac中使用shell_exec xampp php
查看>>
axure 导入元件库显示不出白框_猿型库:Axure小练习之自定义下拉框
查看>>
两个集合相减怎么算_你家使用的防火窗(耐火窗)质量合格吗?怎么判断好坏呢?...
查看>>
ue4加载本地图片_UE4引擎初始化原理详细讲解
查看>>
python整数作为条件_Python整数类型(int)详解
查看>>
如何开搓饵不掉钩_别限制鱼钩的选择,详谈弹簧钩在实战做钓的选择和应用
查看>>
lisp自动生成中垂线_【翻译】自动柯里化Rust函数
查看>>
心电图心电轴怎么计算_基础心电图速成宝典
查看>>
怎样对流媒体进行压力测试_企业怎样通过新媒体进行引流推广?
查看>>
msf win10漏洞_永恒之黑:CVE20200796漏洞复现
查看>>
华为nova5iotg功能使用_华为手机录屏功能和投屏功能都那么强大,说没用过真的合适吗?...
查看>>
卡路里消耗软件_精心计算卡路里,效果却不如意。减重的你其实可以用一个“手掌”来轻松搞定。...
查看>>
外接显示器设置_iPad Pro 2018/2020 Type-C to DP外接显示器的一点体验 「Soomal」
查看>>