'require(...)'是一个常见的javascript模式还是库函数?

PhD*_*PhD 11 javascript require

我通常认为这是node.js脚本/模块中的第一行以及phantomJS,casperJS等.我很好奇,如果这是服务器端javascript(SSJS)的常见模式(类似于#includeC/C++或import在Java)或者它是一个像RequireJS或LabJS这样的库被调用这个包含(我还没有机会在实践中使用它)?

例如var http = require('http')var casper = require('casper').create()

我很好奇这是一个已经成为SSJS 标准化的模式,还是每个库/工具调用现有函数?

请原谅问题的n00b维度,但我想知道其无所不在背后的'为什么':)

voi*_*hos 20

这个require()成语是CommonJS规范的一部分.具体来说,该规范的那部分称为"模块".RequireJS只是CommonJS的一个实现(它通常是一个浏览器端实现 - 事实上,由于浏览器的异步性,它采用了不同的方法).

如果你看一下在CommonJS的网站实现的列表,你会看到的Node.js上市.请注意,它实现了"模块".因此,它就是它的来源 - 它非常内置.


Art*_* B. 8

require在PhantomJS和Node.js的表示正好区别在于没有一个基本模块匹配的相同.尽管fs两者都存在模块,但它们是不同的,并且不提供相同的功能.

require在PhantomJS和Node.js中功能相同 CasperJS建立在PhantomJS之上并使用它的require功能,但也修补它.使用CasperJS,还可以要求模块具有其名称,require('module')而不是require('./module')它是否在同一目录中.

完整矩阵(file.js与执行的脚本位于同一目录中):

            | node
            |   | phantom
            |   |   | casper
            |   |   |   | slimer
------------+---+---+---+--------
file        | n | n | y | y
./file      | y | y | y | y
file.js     | n | n | n | n
./file.js   | n | n | n | n

PhantomJS也可以像使用node_modules节点一样使用特殊文件夹中定义的模块.它不能使用与PhantomJS中不存在的模块具有依赖关系的实际节点模块.

可能需要的例子:

m.js(用于功能)

module.exports = function(){
    return {
        someKey: [1,2,3,4],
        anotherKey: function(){
            console.log("module exports works");
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

e.js(作为JS的其他一切)

exports.someKey = {
    innerKey: [1,2,3,4]
};

exports.anotherKey = function(){
    console.log("exports works");
};
Run Code Online (Sandbox Code Playgroud)

a.json(任意JSON)

[
    {
        "someKey": [ 1,2,3,4 ],
        "anotherKey": 3
    }
]
Run Code Online (Sandbox Code Playgroud)

的script.js

var m = require("./m")();
m.anotherKey(); // prints "module exports works"

var e = require("./e");
e.anotherKey(); // prints "exports works"

var a = require("./a");
console.log(a[0].anotherKey); // prints "3"
Run Code Online (Sandbox Code Playgroud)