node.js 전역 내부에 정의된 require 객체는 어떻게 작동하나요?
-
10-12-2019 - |
문제
응, 좀 당황스럽네.
노드 창을 열고 다음을 입력하면 this.require
당신은 다음을 얻습니다:
[Function: require]
resolve: [Function],
main: undefined,
extensions:
{ '.js': [Function],
'.json': [Function],
'.node': [Function] },
registerExtension: [Function],
cache: {} }
이는 다음과 같은 기능을 의미합니다. require(args)
말하자면, 만들어졌습니다. require=function(){return resultOfOperation}
그때 누군가가 앞으로 다가와 이렇게 말했습니다. require.cache={}
나는 그 모든 것에 괜찮습니다. 그러나 캐시 객체는 어떤 용도로든 사용됩니다. require(args)
기능?requirejs 소스는 캐시 객체에 대해 전혀 언급하지 않으므로 다른 모듈 로더를 실행하고 있는지 아니면 이것이 단지 nodejs가 다른 동작을 추적하는 데 사용하는 것인지 궁금합니다.
질문은, "추가 속성이 할당된 함수가 실행 코드 본문 내에서 해당 속성에 액세스할 수 있습니까?" (바람직하게는 우수한 기능에 대한 지식 없이)
참고로 저는 이것이 C++로 엔진에 작성되었을 가능성이 있다는 것을 알고 있습니다. 저는 사람들이 자바스크립트로 이 작업을 수행할 수 있는 방법을 생각할 수 있는지 알고 싶습니다.
해결책
우선 약간의 혼란이 있는 것 같습니다.노드의 require
~이다 ~ 아니다 RequireJS.그것들은 완전히 다른 두 가지입니다.
노드의 모듈 시스템에 대해 자세히 알아보려면 여기 관련 문서가 있습니다.여기 있습니다 필요한 문서.
두 번째 질문에 답하려면 자바스크립트의 함수는 객체입니다.위에서 설명한 것과 같은 작업을 수행하는 한 가지 방법은 다음과 같습니다.
var foo = function() {
console.log(foo.cache);
};
foo.cache = {
bar: 1
};
foo();
// Outputs { bar: 1 }
또 다른 방법은 더 이상 사용되지 않음 arguments.callee
(그러니 집에서는 하지 마세요):
var foo = function() {
console.log(arguments.callee.cache);
};
foo.cache = {
bar: 1
};
foo();
// Outputs { bar: 1 }
다른 팁
마지막 질문:
추가 속성이 할당된 함수가 실행 코드 본문 내에서 해당 속성에 액세스할 수 있습니까?
함수의 전역 이름을 사용할 수 있습니다.예를 들어
var myFunc = function() {
console.log(myFunc.a++);
}
myFunc.a = 1;
myFunc();
myFunc();
출력됩니다
1
2
이제 다른 질문
나는 그 모든 것에 괜찮습니다. 그러나 캐시 객체가 require(args) 함수에 사용됩니까?
예, require.cache가 사용되므로 동일한 모듈을 두 번 로드하면 동일한 개체를 반환하고 실제로 스크립트를 다시 로드하지 않습니다.node.js 문서를 확인하세요. require.cache
: http://nodejs.org/api/globals.html#globals_require_cache