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");
Это просто означает "дать мне доступ к тому файлу комментариев, который я сделал в каталоге моделей". Это также считается модулем.
Итак, вы можете думать об этом так: вам нужен какой-то код (или вы его импортируете)... чтобы вы могли использовать его так, как хотите. Если вы не потребовали/не импортировали его, вы не получили бы его.