【问题标题】:Is 'require(...)' a common javascript pattern or a library function?'require(...)' 是常见的 javascript 模式还是库函数?
【发布时间】:2012-07-18 02:34:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript require


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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 一样使用特殊文件夹 node_modules 中定义的模块。它不能使用与 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
          }
      ]
      

      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"
      

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-04-22
          • 2021-06-12
          • 2020-05-31
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2015-12-13
          • 1970-01-01
          相关资源
          最近更新 更多