VM이란 무엇인가요?
VM 모듈은 NodeJS의 핵심 모듈로, NodeJS의 require 메서드와 작동 메커니즘을 지원합니다. 때로는 VM 템플릿을 사용하여 몇 가지 특별한 작업을 수행할 수도 있습니다.
VM을 통해 JS를 즉시 컴파일하고 실행하거나 나중에 컴파일하고 저장하고 실행할 수 있습니다
VM 모듈에는 독립적으로 실행되는 샌드박스 시스템을 생성하기 위해 일반적으로 사용되는 세 가지 방법이 포함되어 있습니다.
vm.runInThisContext(코드, 파일 이름);
이 방법은 독립적인 샌드박스 실행 공간을 만드는 데 사용됩니다. 코드 내의 코드는 외부 전역 개체에 액세스할 수 있지만 다른 변수에는 액세스할 수 없습니다.
그리고 코드는 내부 및 외부적으로 공유됩니다
var vm = require("vm");
var p = 5;
global.p = 11;
vm.runInThisContext("console.log('ok', p)");//전역 아래에 11
표시
vm.runInThisContext("console.log(global)"); // 전역 표시
console.log(p);// 5 표시
vm.runInContext(code, sandBox);
이 방법은 독립적인 샌드박스 실행 공간을 만드는 데 사용됩니다. sandBox는 코드에 전역 변수로 전달되지만 전역 변수는 없습니다.
sandBox 요구사항은 vm.createContext() 메소드로 생성된 sandBox입니다
var vm = require("vm");
var util = require("util");
var 창 = {
피: 2,
VM: VM,
콘솔: 콘솔,
요구하다: 요구하다
};
var p = 5;
global.p = 11;
vm.createContext(window);
vm.runInContext('p = 3;console.log(typeof global);', window); // 전역은 정의되지 않았습니다
console.log(window.p);// 3으로 변경
console.log(util.inspect(window));
vm.runInNewContext(code, sandbox, opt);
이 메소드는 runInContext와 동일해야 하지만 sandBox를 생성하는 단계가 없습니다
비교
더 복잡한 상황
runInThisContext가 runInContext에서 실행되면 어떤 일이 발생합니까? runInThisContext는 누구의 전역 개체에 액세스합니까?
다음 코드는 어떻게 실행되나요?
var vm = require("vm");
var util = require("util");
var 창 = {
피: 2,
VM: VM,
콘솔: 콘솔,
요구하다: 요구하다
};
window.global = 창;
var p = 5;
global.p = 11;
vm.runInNewContext('p = 3;console.log(typeof global);require('vm').runInThisContext("console.log(p)");', window);
runInThisContext 내부의 코드는 외부 전역 개체에 액세스할 수 있지만 실제로는 외부 전역 개체가 없습니다. 하지만 본질적으로 전역 개체는 아닙니다. runInThisContext는 최상위 전역 개체에만 액세스할 수 있다는 점을 기억하세요.
실행 결과는 다음과 같습니다
객체(전역 존재)
11(글로벌 상위 P)