zoukankan      html  css  js  c++  java
  • CommonJs

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

    CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个类似Python,Ruby和Java标 准库。这样的话,开发者可以使用CommonJS API编写应用程序,然后这些应用可以运行在不同的JavaScript解释器和不同的主机环境中。在兼容CommonJS的系统中,你可以使用 JavaScript程序开发:
    服务器端JavaScript应用程序
    命令行工具
    图形界面应用程序
    混合应用程序(如,Titanium或Adobe AIR)。
    api定义:
    二进制:二进制数据对象(字节数组和/或字符串)(建议、讨论、早期实现)
    编码:编码和字符集(建议、讨论、早期实现)
    io:I / O流(建议、讨论)
    fs,fs基地:文件系统(建议、讨论、早期实现)
    系统:系统接口(stdin、stdout,stderr,等等)(1.0,提出修正案)
    断言,测试:单元测试(1.0,修正案提议未决)
    套接字:套接字I / O TCP / IP套接字(早期的建议)
    事件队列:反应堆反应堆/事件队列(早期的建议)
    工人:工(并发无共享进程/线程)(建议)
    控制台:控制台(建议)。[2] ​
    CommonJS是一种规范,NodeJS是这种规范的实现。CommonJS是一 个不断发展的规范,计划将要包括如下部分:
    • Modules
    • Binary strings and buffers
    • Charset encodings
    • Binary, buffered, and textual input and output (io) streams
    • System process arguments, environment, and streams
    • File system interface
    • Socket streams
    • Unit test assertions, running, and reporting
    • Web server gateway interface, JSGI
    • Local and remote packages and package management

    具体每个子规范的定制进度请查看官方网站的说明:http://commonjs.org/specs/

    CommonJS有很多实现,其中不乏很多大名鼎鼎的项目,比如 说:Apache的CouchDBnode.js等。但这些项目大 部分只实现了CommonJS的部分规范。具体的项目和实现部分参见官方网站的说明:http://commonjs.org/impl/

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

    根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。

    global.warming = true;
    

    上面代码的waiming变量,可以被所有模块读取。当然,这样做是不推荐,输出模块变量的最好方法是使用module.exports对象。

    var i = 1;
    var max = 30;
    
    module.exports = function () {
      for (i -= 1; i++ < max; ) {
        console.log(i);
      }
      max *= 1.1;
    };
    

    上面代码通过module.exports对象,定义了一个函数,该函数就是模块外部与内部通信的桥梁。

    加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的module.exports对象。假定有一个一个简单的模块example.js。

    // 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。

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

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

    require方法默认读取js文件,所以可以省略js后缀名,所以上面的代码往往写成下面这样。

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

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

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

    // addition.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();
        };
    });

    参考链接

    转自:http://javascript.ruanyifeng.com/nodejs/commonjs.html

  • 相关阅读:
    倒序数组的算法
    SQL 日期操作函数
    sp_executesql 练习
    c#编译器对byte类型的一些规则
    角度在excel中如何输入并使其能计算
    5天学会fx5800计算器测量编程(二) fx5800函数学习
    5天学会fx5800计算器测量编程(二) fx5800语法学习
    如何快速的将大地坐标系导入进施工结构的cad平面图纸中
    CAD中批量导入坐标和点号的方法命令
    5天学会fx5800计算器测量编程(一)
  • 原文地址:https://www.cnblogs.com/youxin/p/3956810.html
Copyright © 2011-2022 走看看