11

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

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

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

请原谅这个问题的n00b维度,但我想知道它无处不在的“为什么”:)

4

3 回答 3

20

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

如果您查看 CommonJS 站点上的实现列表,您会看到 Node.js 已列出。请注意,它实现了“模块”。因此,这就是它的来源——它非常内置。

于 2012-07-18T23:39:29.153 回答
8

PhantomJS 和 Node.js 中的require意思完全一样,区别在于没有一个基础模块匹配。尽管fs两者都存在该模块,但它们是不同的并且不提供相同的功能。

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

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

            | 节点
            | | 幻影
            | | | 卡斯珀
            | | | | 更苗条
------------+---+---+---+--------
文件 | n | n | 是 | 是的
./文件 | 是 | 是 | 是 | 是的
文件.js | n | n | n | n
./file.js | n | n | n | n

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

可能需要的示例:

m.js(用于函数)

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

e.js(对于其他所有的 JS)

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

exports.anotherKey = function(){
    console.log("exports works");
};

a.json(任意 JSON)

[
    {
        "someKey": [ 1,2,3,4 ],
        "anotherKey": 3
    }
]

脚本.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"
于 2014-12-13T11:16:14.460 回答
0

其他人给出了很好的技术答案,但我想提供一个超级简化的答案,以防将来对某人有所帮助。“require”本身并不是一个库,但是当您想要访问模块(库和框架等)时使用它。所以它不像“require”是最受欢迎的库或类似的东西:)。

顺便说一句,许多旧代码要求您仍然使用“require”(注意我避免说它是必需的),但是已经使用“import”这个词开发了新语法(我猜是 ES6,从 2015 年开始)。我绝对更喜欢导入,它用于完全相同的目的,尽管它看起来有点不同。

无论如何,正如其他人提到的,“需要”意味着您需要(即访问)一个模块。但这并不一定意味着您可以访问框架……您实际上可能正在访问您自己创建的另一个页面!例如,您可能会看到:

 - var Comment = require("./models/comment");

这只是意味着“让我访问我在模型目录中创建的评论文件”。这也被认为是一个模块。

所以你可以这样想......你需要一些代码(或者你导入它)......这样你就可以按照你想要的方式使用它。如果你不需要/导入它,你就不会得到它。

于 2017-05-08T07:20:15.213 回答