로컬 변수에 액세스하여 node.js에서 외부 js 파일을로드하고 실행합니까?


130

include('./path/to/file')node.js에서 간단한 유형의 명령 을 수행하는 것이 쉬운가요 ?

내가하고 싶은 일은 로컬 변수에 액세스하고 스크립트를 실행하는 것입니다. 사람들은 일반적으로 단순한 hello world보다 큰 node.js 프로젝트를 어떻게 구성합니까? (모든 기능을 갖춘 동적 웹 사이트)

예를 들어 다음과 같은 디렉토리를 갖고 싶습니다.

/models

/views

... 등


로컬 파일 대신 외부 URL의 스크립트를 포함시킬 수도 있습니다. 여기를 참조하십시오 : pastebin.com/WkvHjGsG
앤더슨 녹색

위의 스크립트 downloadedModules는 스크립트와 같은 디렉토리에 폴더를 생성 한 경우에만 올바르게 작동합니다 .
앤더슨 그린

답변:


134

그냥 require('./yourfile.js');

외부 액세스하려는 모든 변수를 전역 변수로 선언하십시오. 그래서 대신

var a = "hello" 그것은 될 것이다

GLOBAL.a="hello" 아니면 그냥

a = "hello"

이것은 분명히 나쁘다. 글로벌 범위를 오염시키고 싶지 않습니다. 대신 제안 방법은 export함수 / 변수에 있습니다.

MVC 패턴을 원한다면 Geddy를 살펴보십시오.


3
부수적으로 .. 나는 Express를 좋아합니다. MVC에 대해 특별한 것이 아닌 경우에도 확인해야합니다.
Shripad Krishna

42
"이것은 분명히 나쁘다"라고 말할 때 "이것"은 무엇을 의미합니까?
앤더슨 그린

1
@AndersonGreen-그는 전역 범위에 변수를 넣는 것을 의미합니다.
Tim

77
@AndersonGreen : 범위에 대해 매우 영리한 농담이었다고 말해주십시오 ;-)
Dusty J

6
require당신의 경로 앞에 다음과 같은 접두사를 붙이지 않으면 npm 모듈의 모습 을 배우는 데 도움이되었습니다./
Dylan Valade

93

모듈을 정의하는 패턴 인 CommonJS를 이해해야합니다. 항상 나쁜 일인 GLOBAL 범위를 남용해서는 안됩니다. 대신 '내보내기'토큰을 사용할 수 있습니다.

// circle.js

var PI = 3.14; // PI will not be accessible from outside this module

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

그리고 우리 모듈을 사용할 클라이언트 코드 :

// client.js

var circle = require('./circle');
console.log( 'The area of a circle of radius 4 is '
           + circle.area(4));

이 코드는 node.js 문서 API에서 추출되었습니다.

http://nodejs.org/docs/v0.3.2/api/modules.html

또한 Rails 또는 Sinatra와 같은 것을 사용하려면 Express를 권장합니다 (URL을 게시 할 수 없었습니다.


64

Node 용 코드를 작성하는 경우 Ivan이 설명한 Node 모듈을 사용하는 것은 의심의 여지가 없습니다.

그러나 이미 작성되었고 노드를 인식하지 못하는 JavaScript를로드해야하는 경우 vm모듈을 사용하는 것이 좋습니다 eval.

예를 들어 다음은 내 execfile모듈 입니다.이 모듈 은 전역 컨텍스트 path에서 스크립트를 평가합니다 context.

var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
  var data = fs.readFileSync(path);
  vm.runInNewContext(data, context, path);
}

또한 참고 :로로드 된 모듈 require(…)은 전역 컨텍스트에 액세스 할 수 없습니다.


1
이 팁 감사합니다. 실제 사용 사례는 모듈 adhoc을로드해야 할 때입니다. 중앙 서비스에 등록하는 1000 개의 모듈이있는 등록 패턴과 같이 말합니다. 서비스에서 1000 require 문을 수행하는 대신 모듈을 스캔하여 하나씩로드하는 것이 훨씬 더 깨끗하고 더 나은 디자인입니다.
Assaf Moldavsky

노드는 동적 요구 사항을 지원하므로 노드 인식 모듈을 동적으로로드 할 때이 패턴을 사용할 이유가 없습니다. 실제로 Node의를 무시 require.cache하므로 단일 파일이 여러 번로드 될 수 있기 때문에 실제로 사용하는 것은 매우 위험합니다 .
David Wolever

좋아, 각각이 레지스트리 서비스에 등록하는 1000 개의 모듈이있는 곳을 제시 한 사례를 해결하려면 레지스트리 서비스에 1000 require 문을 사용하지 않고 제안한 것을 어떻게 사용합니까?
Assaf Moldavsky

1
그냥 require정상처럼 : function loadService(name) { return require('./services/' + name); }다음 서비스 그러나 응용 프로그램에 대한 의미가 나열되어 있습니다.
David Wolever

맞습니다. 그러나 레지스트리 서비스에있는 1000 개의 모듈을 모두 알아야합니다. 1000 개의 require 문을 갖는 것보다 낫지 않습니다. 전체 아이디어는 레지스트리 서비스가 모든 모듈을 알지 못하고 실제로는 모듈을 관리한다는 것입니다. 모듈은 레지스트리 서비스에 임시로 등록됩니다. 말이 돼?
Assaf Moldavsky

7

외부 자바 스크립트 파일의 함수 또는 객체를로드하려는 경우 다음 코드를 사용하여이 컨텍스트를로드하십시오. runInThisContext 메소드를 참고하십시오.

var vm = require("vm");
var fs = require("fs");

var data = fs.readFileSync('./externalfile.js');
const script = new vm.Script(data);
script.runInThisContext();

// here you can use externalfile's functions or objects as if they were instantiated here. They have been added to this context. 

2
많은 검색과 삭제 후이 기술은 저에게 효과적이었습니다. 내 파일은 브라우저에서 직접 사용하고 변수를 선언하기 위해 작성되었습니다. const aVar = {thing : 'a'}
lucsan

3

@Shripad@Ivan 의 대답을 확장하면서 Node.js의 표준 module.export 기능 을 사용하는 것이 좋습니다 .

상수 파일 ( 예 :) constants.js 에서 다음과 같이 상수를 작성합니다.

const CONST1 = 1;
module.exports.CONST1 = CONST1;

const CONST2 = 2;
module.exports.CONST2 = CONST2;

그런 다음 상수 를 사용 하려는 파일에서 다음 코드를 작성하십시오.

const {CONST1 , CONST2} = require('./constants.js');

const { ... }이전 에 구문 을 본 적이 없다면 할당을 파괴하는 것 입니다.


0

부활해서 죄송합니다. child_process 모듈을 사용하여 node.js에서 외부 js 파일을 실행할 수 있습니다

var child_process = require('child_process');

//EXECUTE yourExternalJsFile.js
child_process.exec('node yourExternalJsFile.js', (error, stdout, stderr) => {
    console.log(`${stdout}`);
    console.log(`${stderr}`);
    if (error !== null) {
        console.log(`exec error: ${error}`);
    }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.