Is 'require (...)' общий шаблон javascript или библиотечная функция?

Обычно я нахожу это как первую строку в сценариях/модулях node.js, а также phantomJS, casperJS и т.д. Мне любопытно, если это общий шаблон для javascript (SSJS на стороне сервера) (аналогичный #include в C/С++ или import в Java) или это библиотека, такая как RequireJS или LabJS, которая вызывается для этого включения (ни у кого из них у меня пока нет возможности использовать на практике)

например. var http = require('http') или var casper = require('casper').create()

Мне интересно, если это шаблон, который стал стандартизованным для SSJS или все библиотеки/инструменты вызывают существующую функцию?

Прошу извинить измерение n00b на вопрос, но я хотел бы знать "почему" за его вездесущность:)

Ответ 1

Идиома require() является частью спецификации, известной как CommonJS. В частности, эта часть спецификации называется "Модули". RequireJS - это всего лишь одна реализация CommonJS (и, как правило, реализация на стороне браузера), на самом деле требуется другой подход из-за асинхронного характера браузера).

Если вы посмотрите на список реализаций на сайте CommonJS, вы см. Node.js в списке. Обратите внимание, что он реализует "Модули". Следовательно, то, откуда оно исходит - оно очень много встроено.

Ответ 2

require в PhantomJS и Node.js означает то же самое с той разницей, с которой ни один из базовых модулей не соответствует. Хотя модуль fs существует для обоих, они разные и не предоставляют одинаковых функций.

require функционально то же самое в PhantomJS и Node.js. CasperJS построен поверх PhantomJS и использует функцию require, но также исправляет его. В CasperJS также может потребоваться модуль с его именем, например require('module') вместо require('./module'), если он находится в одном каталоге.

Полная матрица (файл .js находится в том же каталоге, что и выполняемый script):

            | 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 так же, как это делает node. Он не может использовать фактические модули 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
    }
]

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". Я определенно предпочитаю импорт, и он используется для той же цели, хотя он выглядит немного по-другому.

В любом случае, как отмечали другие, "требуется" означает, что вам требуется (то есть доступ) к модулю. Но это не обязательно означает, что вы получаете доступ к библиотеке или фреймворку... на самом деле вы можете получить доступ к другой странице, которую вы сами создали! Например, вы можете увидеть это:

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

Это просто означает "дать мне доступ к тому файлу комментариев, который я сделал в каталоге моделей". Это также считается модулем.

Итак, вы можете думать об этом так: вам нужен какой-то код (или вы его импортируете)... чтобы вы могли использовать его так, как хотите. Если вы не потребовали/не импортировали его, вы не получили бы его.