노드 js 전역 변수. Nodejs 기본. 모듈 배열: nodejs에서 모듈이 발견되는 순서




노드에서는 "전역" 또는 "GLOBAL" 개체를 통해 전역 변수를 설정할 수 있습니다.

GLOBAL._ = require("밑줄"); // 하지만 이렇게 해서는 안 됩니다!(아래 참고 사항 참조)

아니면 더 유용할지도...

글로벌.window = 글로벌; // 브라우저에서와 마찬가지로

노드 소스에서 서로에 대한 별칭임을 확인할 수 있습니다.

Node-v0.6.6/src/node.js:28:global = this; 128: 글로벌.GLOBAL = 글로벌;

위 코드에서 "this"는 전역 컨텍스트입니다. 노드가 사용하는 commonJS 모듈을 사용하면 모듈 내부의 이 "객체"(예: "귀하의 코드")가 전역 컨텍스트가 아닙니다. 이에 대한 증거를 보려면 아래에서 "this" 개체를 뿜어낸 다음 거대한 "GLOBAL" 개체를 뿜어내는 부분을 참조하세요.

Console.log("\n이것:"); console.log(this); console.log("\n글로벌:"); console.log(글로벌); /* 출력 ... 이것: {} 글로벌: ( ArrayBuffer: , Int8Array: ( BYTES_PER_ELEMENT: 1 ), Uint8Array: ( BYTES_PER_ELEMENT: 1 ), Int16Array: ( BYTES_PER_ELEMENT: 2 ), Uint16Array: ( BYTES_PER_ELEMENT: 2 ), Int32Array: ( BYTES_PER_ELEMENT: 4 ) , Uint32Array: ( BYTES_PER _ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8 ), DataView: , 전역: , 프로세스: ( EventEmitter: , 제목: "node", 주장: , 버전: "v0.6.5", _tickCallback: , moduleLoadList: [ "바인딩 평가", "바인딩 네이티브", "NativeModule 이벤트", "NativeModule 버퍼", "바인딩 버퍼", "NativeModule 어설션", "NativeModule util", "NativeModule 경로", "NativeModule 모듈", " NativeModule fs", "바인딩 fs", "바인딩 상수", "NativeModule 스트림", "NativeModule 콘솔", "바인딩 tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule 타이머", "바인딩 타이머_wrap", " NativeModule _linklist" ], 버전: ( node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" ), nextTick : , stdout: , 아치: "x64", stderr: , 플랫폼: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: ( TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", TERM: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ -sD905b/Listeners 시작", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", 경로: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/ X11 /bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "기본값", SHLVL: "1", COLORFGBG: "7;0", HOME: "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", 로그 이름: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /external", _: "./index.js"), openStdin: , 종료: , pid: 10321, 기능: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : true ), kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , RemoveListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask: , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , 상속: , _kill: , _byteLength: , mainModule: ( id: ". ", 내보내기: (), 상위: null, 파일 이름: "/workspace/zd/zgap/darwin-js/index.js", 로드됨: false, 종료됨: false, 어린이: , 경로: ), _debugProcess: , dlopen: , 가동 시간: , memoryUsage: , uvCounters: , 바인딩: ), GLOBAL: , 루트: , 버퍼: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 ), setTimeout: , setInterval: ,clearTimeout: ,clearInterval: , 콘솔: , 창: , 탐색기: () ) */

**참고: "GLOBAL._" 설정과 관련하여 일반적으로 var _ = require("underscore"); . 예, Java에서 com.foo.bar를 가져오는 것과 마찬가지로 밑줄을 사용하는 모든 파일에서 이 작업을 수행합니다. . 이렇게 하면 파일 간의 링크가 "명시적"이므로 코드가 수행하는 작업을 더 쉽게 확인할 수 있습니다. 약간 짜증나지만 좋습니다. .... 이것은 설교입니다.

모든 규칙에는 예외가 있습니다. "GLOBAL._"을 설정해야 하는 인스턴스가 정확히 하나 있었습니다. 저는 대부분 JSON이지만 좀 더 유연성을 추가하기 위해 "JS로 작성"된 "구성" 파일을 정의하는 시스템을 만들고 있었습니다. 이러한 구성 파일에는 "require" 문이 없었지만 밑줄에 액세스할 수 있기를 원했기 때문에(전체 시스템은 밑줄과 밑줄 패턴을 기반으로 함) "config"를 평가하기 전에 "GLOBAL._"을 설정했습니다. 그렇습니다. 모든 규칙에는 어딘가에 예외가 있습니다. 그러나 "'require'를 입력하는 것이 지겨워서 관례를 깨고 싶습니다."뿐만 아니라 타당한 이유가 있습니다.

NODE.JS– js를 실행하기 위한 소프트웨어 도구입니다.

Nodejs = V8 + I/O + 라이브러리

V8: 빠르고 현대적이며 경제적입니다.

장점

  • 자바스크립트
  • 클라이언트와 서버의 공통 코드
  • 기본 웹 작업
  • 동시에 많은 연결과 작업
  • 작동하는 프로토타입을 쉽게 만들 수 있음
  • 편리한 npm 패키지 관리자
  • 지역 사회

설치

설치할 때 nodejs는 PATH 변수(+ npm), [관리 - 환경 변수]에 자신을 씁니다. 명령줄에서 확인할 수 있습니다:
경로 설정

일반적으로 파일은 nodejs에서 시작됩니다. 간단한 스크립트를 작성하고 명령줄을 통해 실행해 보겠습니다.


스크립트가 실행되고 결과가 명령줄에 표시됩니다.

Nodejs 문서

nodejs 모듈

내장된 nodejs 모듈이 어떻게 작동하는지 이해하려면 nodejs 웹사이트(소스 코드)에서 소스 코드 아카이브를 다운로드해야 합니다. 그리고 lib 디렉터리로 이동합니다. (dir 명령 - 명령줄을 통해 파일 목록을 가져옵니다. 모든 하위 폴더의 파일을 나열해야 하는 경우 "dir" 대신 "dir /s"를 사용합니다.) 패키지에서 nodejs를 설치한 경우 lib 폴더에서 파일을 찾을 수 없습니다.

Nodejs에는 다양한 수준의 모듈이 있습니다. 안정. (예를 들어 0 – 사용하면 안 됩니다. 1, 2 – 사용할 수 있지만 모듈 API가 변경될 수 있습니다.)

함수가 늘어나고(프로젝트가 개발 중) 시간이 지남에 따라 USER 생성자 함수를 별도의 파일로 옮겨야 합니다. 여기가 모듈이 작동하는 곳입니다.

모듈은 nodejs가 프로젝트를 구성하기 위해 제공하는 일종의 방법입니다.

프로젝트가 커지는 경향이 있어 프로젝트를 여러 파일로 분할하려는 욕구가 생깁니다. 여기서 모듈이 작동합니다.

필요하다

HTML 페이지의 경우 스크립트 태그는 스크립트를 포함하는 데 사용됩니다. Nodejs에는 특별한 require 명령이 있습니다.

Var user = require("./user");

이 예에서는 동일한 디렉터리에 있는 파일(user.js)에 액세스합니다(확장자(.js)는 선택 사항임).

//require("./user"); // .js는 지정할 필요가 없습니다. // 이 경우 파일은 실행되지만 USER 변수는 없습니다. // 이것이 nodejs의 스크립트 태그와 주요 차이점입니다. // node.js에서는 함수와 변수가 각 모듈은 // 이 파일(모듈 자체)에 대해 전역적이며 // 연결될 때 자동으로 사용할 수 없게 됩니다. (require("./user")) // 그런데 어떻게 액세스할 수 있나요? // 각 모듈에는 특수 변수가 있습니다. 내보내기 - 이것은 객체이고 // 여기에 넣은 내용은 결과로 반환됩니다. require var user = require("./user.js"); // 결과: 사용자 = ( 사용자: 함수 )

nodejs 모듈식 시스템과 브라우저 스크립트의 첫 번째 차이점은 브라우저에 두 개의 스크립트 태그가 있는 경우 그 중 하나의 전역 수준에서 정의된 함수를 다른 쪽에서는 사용할 수 있지만 nodejs에서는 사용할 수 없다는 것입니다. nodejs에서 함수와 변수는 주어진 파일에 대해 전역적입니다(필요할 때는 사용할 수 없습니다). 따라서 nodejs를 사용하면 진정으로 독립적인 모듈을 작성할 수 있습니다. 그러나 모듈을 사용하려면 다음을 사용합니다. 수출 시스템. 각 모듈에는 특별한 내보내기 변수가 있습니다.

모듈 디렉터리 DIR/인덱스

폴더를 직접 연결합니다. var user = require("./user"); , 해당 index.js 가 포함되어 있습니다.

예를 들어

Function User(name)( this.name = name; ) User.prototype.hello = function(who)( console.log(phrases.Hello + ", " + who.name); ); 수출.사용자 = 사용자;

./server.js 파일에서 User 생성자를 연결하고 사용합니다.

//server.js var user = require("./user"); var vasya = new user.User("Vasya");

"./" - 현재 폴더 기준

내보내기는 객체이고 거기에 놓인 것은 require(exports.jpg)의 결과로 반환됩니다. 이런 방식으로 모듈은 개인 변수/함수를 선언하고 필요한 것만 내보낼 수 있습니다.


전역변수 등의 경우 글로벌 객체가 있습니다

글로벌.사용자 = 사용자;

결론

  • 연결이 필요합니다
  • 변수: var(모듈의 경우 전용), 내보내기, 전역(거의 사용되지 않음)
  • 모듈 유형: js, node(.node 확장자 포함), json(.json 확장자 포함). Json 모듈은 파일에 간단한 정보를 저장해야 할 때 사용됩니다.
  • 모듈 디렉터리 DIR/인덱스

모듈 객체

  • 모듈 객체
  • 모듈 기능 module.exports = 기능
  • 캐싱 모듈(모듈을 다시 읽지 않음)
  • 모듈 배열: 검색 순서
  • 매개변수 전달: 모듈 팩토리

모듈 객체(모듈의 기본 객체)는 각 모듈(파일, console.log(module;);을 출력할 수 있음)에 존재하는 변수입니다. . 내용: id 속성 – 일반적으로 파일 경로,
parent – ​​상위 모듈에 대한 링크(module.parent – ​​이를 요구하는 상위 모듈에 대한 링크),
어린이(module.children - require를 통해 연결된 모듈),
부동산 등을 수출합니다.

모듈인가, 애플리케이션인가? 모듈.부모

모듈을 직접 시작할 수 있지만 그렇지 않은 경우 해당 기능이 다른 모듈에 연결되어 있으면 이 기능을 내보내도록 합니다. 이 두 가지 경우는 다음을 확인하여 구분할 수 있습니다.

If(module.parent) (exports.run = run; ) else ( run(); )


ps: stackoverflow.com에서 말하는 대로 부모는 해석을 위해 스크립트를 호출한 모듈입니다.

// $ 노드 foo.js console.log(module.parent); // null // require("./foo") console.log(module.parent); // ( ... )

module.exports의 올바른 사용

모듈의 맥락에서:

module.exports = 내보내기 = this (이러한 구성은 동일합니다)

객체가 아닌 직접 함수를 전달하려면 다음 구문을 사용하십시오.

Module.exports = 사용자;


모듈 캐싱

Nodejs가 모듈을 로드할 때 해당 모듈 개체를 완전히 생성하고(parent , 내보내기 및 기타 유사한 속성을 고려하여) 이를 자체적으로 기억합니다(module.id(파일의 전체 경로)는 내부 캐시의 식별자 역할을 합니다) ) 그리고 다음에 모듈(파일)에 다시 액세스(연결)할 때 nodejs는 캐시에서 동일한 객체를 가져옵니다. 즉, 예를 들어 파일에서 모듈을 한 번 초기화하는 것으로 충분하며 나중에는 간단히 사용할 수 있습니다.

우리의 경우 var db = require("../db");
그리고 var db = require("./db"); 동일한 개체가 사용됩니다. 따라서 원칙은 다음과 같습니다. 모듈을 처음 사용할 때 초기화되고 앞으로는 연결해서 사용하기만 하면 됩니다(즉, 우리의 경우에는 db.connect()를 두 번 사용할 필요가 없습니다. 즉, 다른 파일에 있습니다).


모듈 배열: nodejs에서 모듈이 발견되는 순서

특정 경로를 지정하지 않고 DB를 항상 연결하도록 만드는 방법:

Var db = require("../db"); //또는 var db = require("./db");

그리고 이렇게:

Var db = require("db");

db가 연결된 파일에 관계없이.

이렇게 하려면 nodejs의 모듈 검색 순서(require가 호출될 때 발생하는 일)를 이해해야 합니다. nodejs에는 require("fs");와 같은 많은 내장 모듈이 있습니다. , 문제없이 연결됩니다. 예를 들어 require에 특정 경로를 지정하는 경우 require("../db"); , 검색은 지정된 경로를 기반으로 하며 파일을 찾거나 nodejs가 이 파일을 디렉터리로 가져오려고 시도합니다(그리고 카테고리 내에서 index.js를 찾습니다).

require("db")를 지정하는 경우; 모듈이 내장되어 있지 않으면 node_modules 디렉토리가 현재 위치를 기준으로 검색됩니다(발견된 경우 모듈을 가져오려고 시도합니다). node_modules 디렉터리가 없으면 위에서 node_modules 디렉터리가 검색됩니다.

모듈의 특정 경로를 지정하는 것 외에도 nodejs는 다음과 같은 모듈을 검색할 수 있습니다.

npm 소개 - Node.JS용 패키지 관리자

  1. 모듈에 대한 정보(이름, 버전 등)가 포함된 패키지 설명 파일(package.json)을 만듭니다. 수동으로 또는 명령을 통해
    npm 초기화
    (필요한 정보를 요청하겠습니다)
  2. 모듈을 게시하려면 다음을 수행해야 합니다.
    1. npm adduser 명령을 사용하여 사용자를 추가합니다(사용자 이름과 비밀번호를 입력해야 함). 이제 npm을 사용한 모든 작업은 이 사용자를 대신하여 수행됩니다. 사용자는 https://www.npmjs.com/~name_user에 로그인하여 모듈을 모니터링할 수 있습니다.
    2. 게시: npm 게시
  3. 그러면 누군가가 데이터베이스에 추가된 모듈을 사용할 수 있고 사용자 자신이 변경할 수 있습니다.
  4. npm help 명령을 사용하여 모든 npm 명령 가져오기
  5. 데이터베이스에서 모듈 검색: npm s 키워드 또는 npm 검색 키워드(예: npm s super module)
  6. 모듈 설치: npm install name_module 또는 npm i name_module
  7. 모듈을 설치할 때 nodejs는 먼저 현재 디렉터리에서 node_modules 폴더를 찾거나(그 다음 더 높은 등), (node_modules가 없는 경우) package.json을 찾습니다(또한 위로 올라갑니다. package.json은 일반적으로 루트를 나타냅니다. 프로젝트) 그리고 그에 따라 package.json을 찾으면 해당 디렉터리에 node_modules 폴더를 생성합니다. 두 옵션이 모두 실패하면 nodejs는 현재 디렉터리에 node_modules 폴더를 생성합니다. 특정 디렉터리에 모듈을 배치하려면 해당 디렉터리에 node_modules 폴더를 만들어야 합니다.
  8. npm up 업데이트 모듈(node_modules 폴더에 있는 업데이트 모듈을 확인합니다)
  9. npm 제거 모듈 이름(모듈 제거)

npm의 출력:

npm 초기화
nmp 추가 사용자
npm 게시
npm 검색 키워드
npm 설치 모듈
npm 업데이트 모듈
npm 제거 모듈
npm 도움말 명령

NPM 패키지 구조

필요한 버전 설치(예: npm i) [이메일 보호됨]

모듈이 github 등의 git 버전 관리 시스템을 사용하여 개발된 경우 최신 버전의 모듈을 얻을 수 있습니다. Git 읽기 전용(url): https://github.com/strongloop/express.git 및 콘솔에서 다음을 수행하는 것으로 충분합니다.

npm i https://github.com/strongloop/express.git

package.json의 종속성

종속성은 이 모듈이 의존하는 모듈을 가리킵니다.

개발자 종속성

devDependency에 등록된 모듈은 모듈을 종속성으로 가져오는 경우 설치되지 않습니다. 이는 개발용으로만 설치되며 예를 들어 node_modules 폴더의 모듈로 이동하여 npm i를 입력하는 경우(또는 npm config 플래그를 설정하여) 설치할 수 있습니다.

기본 필드는 패키지의 진입점을 지정합니다.

글로벌 모듈

-g 플래그를 설정하면 모든 모듈을 전역적으로 설치할 수 있습니다: npm -g module

전역은 시스템 디렉터리를 의미합니다.

Windows용 전역 모듈 디렉터리:

C:\users\사용자_이름\AppData\Roaming\npm

전역 모듈은 표준 시스템 디렉터리에 배치됩니다. package.json에 있는 바이너리는 시스템 경로(전역 모듈의 주요 사용)에 설치됩니다. 즉, 나중에 콘솔을 통해 호출할 수 있습니다.

I. Kantor 과정의 자료를 기반으로 함

노드에서는 "global" 또는 "GLOBAL" 개체를 통해 전역 변수를 설정할 수 있습니다.

GLOBAL._ = require("밑줄"); // 하지만 이렇게 해서는 안 됩니다!(아래 참고 사항 참조)

아니면 더 유용할지도...

글로벌.window = 글로벌; // 브라우저에서와 마찬가지로

노드 소스에서 서로에 대한 별칭임을 확인할 수 있습니다.

Node-v0.6.6/src/node.js:28:global = this; 128: 글로벌.GLOBAL = 글로벌;

위 코드에서 "this"는 전역 컨텍스트를 사용합니다. 노드가 사용하는 commonJS 모듈 시스템에서 모듈 내부의 "this" 객체(예: "Your Code")는 전역 컨텍스트가 아닙니다. 이에 대한 증명을 위해 아래에서 "this" 객체를 반전시킨 다음 거대한 "GLOBAL" 객체를 반전시키는 방법을 참조하세요.

Console.log("\n이것:"); console.log(this); console.log("\n글로벌:"); console.log(글로벌); /* 출력 ... 이것: {} 글로벌: ( ArrayBuffer: , Int8Array: ( BYTES_PER_ELEMENT: 1 ), Uint8Array: ( BYTES_PER_ELEMENT: 1 ), Int16Array: ( BYTES_PER_ELEMENT: 2 ), Uint16Array: ( BYTES_PER_ELEMENT: 2 ), Int32Array: ( BYTES_PER_ELEMENT: 4 ) , Uint32Array: ( BYTES_PER _ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8 ), DataView: , 전역: , 프로세스: ( EventEmitter: , 제목: "node", 주장: , 버전: "v0.6.5", _tickCallback: , moduleLoadList: [ "바인딩 평가", "바인딩 네이티브", "NativeModule 이벤트", "NativeModule 버퍼", "바인딩 버퍼", "NativeModule 어설션", "NativeModule util", "NativeModule 경로", "NativeModule 모듈", " NativeModule fs", "바인딩 fs", "바인딩 상수", "NativeModule 스트림", "NativeModule 콘솔", "바인딩 tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule 타이머", "바인딩 타이머_wrap", " NativeModule _linklist" ], 버전: ( node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" ), nextTick : , stdout: , 아치: "x64", stderr: , 플랫폼: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: ( TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", TERM: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ -sD905b/Listeners 시작", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", 경로: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/ X11 /bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "기본값", SHLVL: "1", COLORFGBG: "7;0", HOME: "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", 로그 이름: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /external", _: "./index.js"), openStdin: , 종료: , pid: 10321, 기능: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : true ), kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , RemoveListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask: , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , 상속: , _kill: , _byteLength: , mainModule: ( id: ". ", 내보내기: (), 상위: null, 파일 이름: "/workspace/zd/zgap/darwin-js/index.js", 로드됨: false, 종료됨: false, 어린이: , 경로: ), _debugProcess: , dlopen: , 가동 시간: , memoryUsage: , uvCounters: , 바인딩: ), GLOBAL: , 루트: , 버퍼: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 ), setTimeout: , setInterval: ,clearTimeout: ,clearInterval: , 콘솔: , 창: , 탐색기: () ) */

**참고: "GLOBAL._" 설정과 관련하여 일반적으로 var _ = require("underscore"); . 예, Java에서 com.foo.bar를 가져오는 것과 마찬가지로 밑줄을 사용하는 모든 파일에서 이 작업을 수행합니다. . 이렇게 하면 파일 간의 링크가 "명시적"이므로 코드가 수행하는 작업을 더 쉽게 확인할 수 있습니다. 약간 짜증나지만 좋다..... 설교적이다.

모든 규칙에는 예외가 있습니다. "GLOBAL._" 을 설정해야 하는 인스턴스가 정확히 하나 있었습니다. 저는 대부분 JSON이지만 좀 더 유연성을 추가하기 위해 "JS로 작성"된 "구성" 파일을 정의하는 시스템을 만들고 있었습니다. 이러한 구성 파일에는 "require" 문이 없었지만 밑줄에 액세스할 수 있기를 원했기 때문에(전체 시스템은 밑줄과 밑줄 패턴을 기반으로 함) "config"를 평가하기 전에 "GLOBAL._"을 설정했습니다. 그렇습니다. 모든 규칙에는 어딘가에 예외가 있습니다. 하지만 "'필수'를 입력하는 데 지쳐서 계약을 깨고 싶습니다."뿐만 아니라 합당한 이유가 있습니다.

안녕하세요 여러분! 이 기사에서 우리는 플랫폼을 계속해서 이해할 것입니다. NodeJS그리고 얘기해 전역 객체.

당신은 이미 이 개념에 익숙해야 합니다. 우리가 글을 쓸 때 자바스크립트브라우저에서 코드를 작성한 다음 전역 개체를 사용합니다. 창문. 안에 NodeJS전역 개체도 있으며 간단히 호출됩니다. 글로벌.

게다가 창문, 글로벌코드의 어느 곳에서나 일부 내장 속성과 메서드를 사용할 수 있습니다. 예를 살펴 보겠습니다.

아마도 브라우저 전역 개체에도 존재하는 가장 유명한 방법 중 하나일 것입니다. 창문- 이것 콘솔.로그(). 다음과 같이 작성할 수 있습니다.

그리고 코드는 대괄호 안의 텍스트를 콘솔에 표시합니다.

지정된 시간 후에 일부 작업을 수행할 수 있는 또 다른 잘 알려진 방법은 다음과 같습니다.

// 7초(7000밀리초) 안에 코드 실행
setTimeout(함수() (
console.log("안녕하세요, 세상!");
}, 7000);

있다면 추측하는 것은 어렵지 않다고 생각합니다. 세트타임아웃(), 그러면 다음이 있어야 합니다. 세트간격().

// 매초마다 "Hello, world"를 표시합니다.
setInterval(함수() (
console.log("안녕하세요, 세상!");
}, 1000);

NodeJS시스템에서 유용한 정보를 받을 수 있습니다. 예를 들어 전역 개체 속성을 사용하여 현재 있는 폴더의 전체 경로를 찾을 수 있습니다. __dirname.

Console.log(__dirname);

코드가 실행되는 파일의 이름도 얻으려면 다음과 같이 작성하면 됩니다.

노드에서는 "전역" 또는 "GLOBAL" 개체를 통해 전역 변수를 설정할 수 있습니다.

GLOBAL._ = require("밑줄"); // 하지만 이렇게 해서는 안 됩니다!(아래 참고 사항 참조)

아니면 더 유용할지도...

글로벌.window = 글로벌; // 브라우저에서와 마찬가지로

노드 소스에서 서로에 대한 별칭임을 확인할 수 있습니다.

Node-v0.6.6/src/node.js:28:global = this; 128: 글로벌.GLOBAL = 글로벌;

위 코드에서 "this"는 전역 컨텍스트입니다. 노드가 사용하는 commonJS 모듈을 사용하면 모듈 내부의 이 "객체"(예: "귀하의 코드")가 전역 컨텍스트가 아닙니다. 이에 대한 증거를 보려면 아래에서 "this" 개체를 뿜어낸 다음 거대한 "GLOBAL" 개체를 뿜어내는 부분을 참조하세요.

Console.log("\n이것:"); console.log(this); console.log("\n글로벌:"); console.log(글로벌); /* 출력 ... 이것: {} 글로벌: ( ArrayBuffer: , Int8Array: ( BYTES_PER_ELEMENT: 1 ), Uint8Array: ( BYTES_PER_ELEMENT: 1 ), Int16Array: ( BYTES_PER_ELEMENT: 2 ), Uint16Array: ( BYTES_PER_ELEMENT: 2 ), Int32Array: ( BYTES_PER_ELEMENT: 4 ) , Uint32Array: ( BYTES_PER _ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8 ), DataView: , 전역: , 프로세스: ( EventEmitter: , 제목: "node", 주장: , 버전: "v0.6.5", _tickCallback: , moduleLoadList: [ "바인딩 평가", "바인딩 네이티브", "NativeModule 이벤트", "NativeModule 버퍼", "바인딩 버퍼", "NativeModule 어설션", "NativeModule util", "NativeModule 경로", "NativeModule 모듈", " NativeModule fs", "바인딩 fs", "바인딩 상수", "NativeModule 스트림", "NativeModule 콘솔", "바인딩 tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule 타이머", "바인딩 타이머_wrap", " NativeModule _linklist" ], 버전: ( node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" ), nextTick : , stdout: , 아치: "x64", stderr: , 플랫폼: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: ( TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", TERM: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ -sD905b/Listeners 시작", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", 경로: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/ X11 /bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "기본값", SHLVL: "1", COLORFGBG: "7;0", HOME: "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", 로그 이름: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /external", _: "./index.js"), openStdin: , 종료: , pid: 10321, 기능: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : true ), kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , RemoveListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask: , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , 상속: , _kill: , _byteLength: , mainModule: ( id: ". ", 내보내기: (), 상위: null, 파일 이름: "/workspace/zd/zgap/darwin-js/index.js", 로드됨: false, 종료됨: false, 어린이: , 경로: ), _debugProcess: , dlopen: , 가동 시간: , memoryUsage: , uvCounters: , 바인딩: ), GLOBAL: , 루트: , 버퍼: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 ), setTimeout: , setInterval: ,clearTimeout: ,clearInterval: , 콘솔: , 창: , 탐색기: () ) */

**참고: "GLOBAL._" 설정과 관련하여 일반적으로 var _ = require("underscore"); 예, Java에서 com.foo.bar를 가져오는 것과 마찬가지로 밑줄을 사용하는 모든 파일에서 이 작업을 수행합니다. 이렇게 하면 파일 간의 링크가 "명시적"이므로 코드가 수행하는 작업을 더 쉽게 확인할 수 있습니다. 약간 짜증나지만 좋습니다. 이것은 설교입니다.

모든 규칙에는 예외가 있습니다. "GLOBAL._"을 설정해야 하는 인스턴스가 정확히 하나 있었습니다. 저는 대부분 JSON이지만 좀 더 유연성을 추가하기 위해 "JS로 작성"된 "구성" 파일을 정의하는 시스템을 만들고 있었습니다. 이러한 구성 파일에는 "require" 문이 없었지만 밑줄에 액세스할 수 있기를 원했기 때문에(전체 시스템은 밑줄과 밑줄 패턴을 기반으로 함) "config"를 평가하기 전에 "GLOBAL._"을 설정했습니다. 그렇습니다. 모든 규칙에는 어딘가에 예외가 있습니다. 하지만 단순히 "타이핑하는 게 지겹다"는 게 아니라 합의를 깨고 싶은 데에는 그럴 만한 이유가 있다"고 말했다.