内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Node.jsAPI中vm模塊用法實(shí)例詳解

小編這次要給大家分享的是Node.js API中vm模塊用法實(shí)例詳解,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

10年的興隆臺(tái)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整興隆臺(tái)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“興隆臺(tái)網(wǎng)站設(shè)計(jì)”,“興隆臺(tái)網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

本文實(shí)例講述了Node.js API詳解之 vm模塊用法。分享給大家供大家參考,具體如下:

Node.js API詳解之 vm

vm 模塊提供了一系列 API 用于在 V8 虛擬機(jī)環(huán)境中編譯和運(yùn)行代碼。
JavaScript 代碼可以被編譯并立即運(yùn)行,或編譯、保存然后再運(yùn)行。
常見的用法是在沙盒中運(yùn)行代碼。沙盒代碼使用不同的V8上下文。

const vm = require('vm');
const x = 1;
const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.
const code = 'x += 40; var y = 17;';
// x and y are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);
console.log(sandbox.x); // 42
console.log(sandbox.y); // 17
console.log(x); // 1; y is not defined.

注意: vm模塊并不是實(shí)現(xiàn)代碼安全性的一套機(jī)制。 絕不要試圖用其運(yùn)行未經(jīng)信任的代碼.

vm.createContext([sandbox])

說明:

vm.createContext()主要是用于創(chuàng)建一個(gè)能運(yùn)行多個(gè)腳本的sandbox。
比如說,在模擬一個(gè)網(wǎng)頁(yè)瀏覽器時(shí),此方法可以被用于創(chuàng)建一個(gè)單獨(dú)的sandbox來代表一個(gè)窗口的全局對(duì)象,然后所有的script標(biāo)簽都可以在這個(gè)sandbox的上下文中運(yùn)行。
給定一個(gè)sandbox對(duì)象, vm.createContext()會(huì)設(shè)置此sandbox,
從而讓它具備在vm.runInContext()或者script.runInContext()中被使用的能力。
如果未提供sandbox(或者傳入undefined),那么會(huì)返回一個(gè)全新的,空的,上下文隔離化后的sandbox對(duì)象。
對(duì)于此方法中所調(diào)用的腳本,他們的全局對(duì)象不僅擁有我們提供的sandbox對(duì)象的所有屬性,同時(shí)還有任何global object所擁有的屬性。
對(duì)于這些腳本之外的所有代碼,他們的全局變量將保持不變。

demo:

const util = require('util');
const vm = require('vm');
global.globalVar = 3;
const sandbox = { globalVar: 1 };
vm.createContext(sandbox);
vm.runInContext('globalVar *= 2;', sandbox);
console.log(util.inspect(sandbox)); // { globalVar: 2 }
console.log(util.inspect(globalVar)); // 3

vm.isContext(sandbox)

說明:

當(dāng)給定的sandbox對(duì)象已經(jīng)被vm.createContext()上下文隔離化,則返回真。

demo:

const util = require('util');
const vm = require('vm');
global.globalVar = 3;
const sandbox = { globalVar: 1 };
vm.createContext(sandbox);
console.log(vm.isContext(sandbox));
// true

vm.runInContext(code, contextifiedSandbox[, options])

說明:

code:將被編譯和運(yùn)行的JavaScript代碼
contextifiedSandbox:一個(gè)被上下文隔離化過的對(duì)象,會(huì)在代碼被編譯和執(zhí)行之后充當(dāng)global對(duì)象
options:
filename:定義供腳本生成的堆棧跟蹤信息所使用的文件名
lineOffset:定義腳本生成的堆棧跟蹤信息所顯示的行號(hào)偏移
columnOffset:定義腳本生成的堆棧跟蹤信息所顯示的列號(hào)偏移
displayErrors:當(dāng)值為真的時(shí)候,假如在解析代碼的時(shí)候發(fā)生錯(cuò)誤Error,引起錯(cuò)誤的行將會(huì)被加入堆棧跟蹤信息
timeout:定義在被終止執(zhí)行之前此code被允許執(zhí)行的最大毫秒數(shù)。假如執(zhí)行被終止,將會(huì)拋出一個(gè)錯(cuò)誤Error
vm.runInContext()在指定的contextifiedSandbox的上下文里執(zhí)行vm.Script對(duì)象中被編譯后的代碼并返回其結(jié)果。
被執(zhí)行的代碼無法獲取本地作用域。contextifiedSandbox必須是事先被vm.createContext()上下文隔離化過的對(duì)象。

demo:

const util = require('util');
const vm = require('vm');
global.globalVar = 3;
const sandbox = { globalVar: 1 };
vm.createContext(sandbox);
vm.runInContext('globalVar *= 2;', sandbox);
console.log(util.inspect(sandbox)); 
// { globalVar: 2 }

說明:

vm.runInDebugContext()會(huì)在V8的調(diào)試上下文中編譯并執(zhí)行code。此方法主要在需要獲取V8Debug對(duì)象的時(shí)候使用。
注意: 調(diào)試上下文和對(duì)象從本質(zhì)而言是從屬于V8調(diào)試器的,故有可能會(huì)在沒有事先警告的情況下被改變(甚至被移除)
Debug對(duì)象另外還可以通過特定于V8的–expose_debug_as命令行選項(xiàng)獲得。

demo:

const vm = require('vm')
const Debug = vm.runInDebugContext('Debug');
console.log(Debug.findScript(process.emit).name); // 'events.js'
console.log(Debug.findScript(process.exit).name); // 'internal/process.js'

vm.runInNewContext(code[, sandbox][, options])

說明:

首先給指定的sandbox(若為undefined,則會(huì)新建一個(gè)sandbox)提供一個(gè)隔離的上下文,
再在此上下文中執(zhí)行vm.Script中被編譯的代碼,最后返回結(jié)果。運(yùn)行中的代碼無法獲取本地作用域。

demo:

const util = require('util');
const vm = require('vm');
const sandbox = {
 animal: 'cat',
 count: 2
};
vm.runInNewContext('count += 1; name = "kitty"', sandbox);
console.log(util.inspect(sandbox));
// { animal: 'cat', count: 3, name: 'kitty' }

vm.runInThisContext(code[, options])

說明:

vm.runInThisContext()在當(dāng)前的global對(duì)象的上下文中編譯并執(zhí)行code,最后返回結(jié)果。
運(yùn)行中的代碼無法獲取本地作用域,但可以獲取當(dāng)前的global對(duì)象。

demo:

const vm = require('vm');
let localVar = 'initial value';
const vmResult = vm.runInThisContext('localVar = "vm";');
console.log('vmResult:', vmResult);
console.log('localVar:', localVar);
const evalResult = eval('localVar = "eval";');
console.log('evalResult:', evalResult);
console.log('localVar:', localVar);
// vmResult: 'vm', localVar: 'initial value'
// evalResult: 'eval', localVar: 'eval'

vm.Script 類

說明:

vm.Script類型的實(shí)例包含若干預(yù)編譯的腳本,這些腳本能夠在特定的沙箱(或者上下文)中被運(yùn)行。

new vm.Script(code, options)

說明:

創(chuàng)建一個(gè)新的vm.Script對(duì)象只編譯代碼但不會(huì)執(zhí)行它。編譯過的vm.Script此后可以被多次執(zhí)行。
值得注意的是,code是不綁定于任何全局對(duì)象的,相反,它僅僅綁定于每次執(zhí)行它的對(duì)象。
code:要被解析的JavaScript代碼
options:
filename:定義供腳本生成的堆棧跟蹤信息所使用的文件名
lineOffset:定義腳本生成的堆棧跟蹤信息所顯示的行號(hào)偏移
columnOffset:定義腳本生成的堆棧跟蹤信息所顯示的列號(hào)偏移
displayErrors:當(dāng)值為真的時(shí)候,假如在解析代碼的時(shí)候發(fā)生錯(cuò)誤Error,引起錯(cuò)誤的行將會(huì)被加入堆棧跟蹤信息
timeout:定義在被終止執(zhí)行之前此code被允許執(zhí)行的最大毫秒數(shù)。假如執(zhí)行被終止,將會(huì)拋出一個(gè)錯(cuò)誤[Error][]。
cachedData:為源碼提供一個(gè)可選的存有v8代碼緩存數(shù)據(jù)的Buffer。一旦提供了此Buffer,取決于v8引擎對(duì)Buffer中數(shù)據(jù)的接受狀況,cachedDataRejected值將會(huì)被設(shè)為要么 真要么為假。
produceCachedData:當(dāng)值為真且cachedData不存在的時(shí)候,v8將會(huì)試圖為code生成代碼緩存數(shù)據(jù)。一旦成功,一個(gè)有V8代碼緩存數(shù)據(jù)的Buffer將會(huì)被生成和儲(chǔ)存在vm.Script返回的實(shí)例的cachedData屬性里。 取決于代碼緩存數(shù)據(jù)是否被成功生成,cachedDataProduced的值會(huì)被設(shè)置為true或者false。

demo:

const util = require('util');
const vm = require('vm');
const sandbox = {
 animal: 'cat',
 count: 2
};
const script = new vm.Script('count += 1; name = "kitty";');
const context = vm.createContext(sandbox);
script.runInContext(context);
console.log(util.inspect(sandbox));
// { animal: 'cat', count: 3, name: 'kitty' }

script.runInContext(contextifiedSandbox[, options])

說明:

在指定的contextifiedSandbox中執(zhí)行vm.Script對(duì)象中被編譯后的代碼并返回其結(jié)果。
被執(zhí)行的代碼無法獲取本地作用域。
contextifiedSandbox:由vm.createContext()返回的[contextified][]對(duì)象

demo:

const util = require('util');
const vm = require('vm');
const sandbox = {
 animal: 'cat',
 count: 2
};
const script = new vm.Script('count += 1; name = "kitty";');
const context = vm.createContext(sandbox);
for (let i = 0; i < 10; ++i) {
 script.runInContext(context);
}
console.log(util.inspect(sandbox));
// { animal: 'cat', count: 12, name: 'kitty' }

script.runInNewContext([sandbox[, options]])

說明:

首先給指定的sandbox提供一個(gè)隔離的上下文, 再在此上下文中執(zhí)行vm.Script中被編譯的代碼,最后返回結(jié)果。
運(yùn)行中的代碼無法獲取本地作用域。

demo:

const util = require('util');
const vm = require('vm');
const script = new vm.Script('globalVar = "set"');
const sandboxes = [{}, {}, {}];
sandboxes.forEach((sandbox) => {
 script.runInNewContext(sandbox);
});
console.log(util.inspect(sandboxes));
// [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]

script.runInThisContext([options])

說明:

在指定的global對(duì)象的上下文中執(zhí)行vm.Script對(duì)象里被編譯的代碼并返回其結(jié)果。
被執(zhí)行的代碼雖然無法獲取本地作用域,但是能獲取global對(duì)象。

demo:

const vm = require('vm');
global.globalVar = 0;
const script = new vm.Script('globalVar += 1');
for (let i = 0; i < 1000; ++i) {
 script.runInThisContext();
}
console.log(globalVar);
// 1000

例子:在vm中運(yùn)行一個(gè)http server

'use strict';
const vm = require('vm');
const code = `
(function(require) {
 const http = require('http');
 http.createServer((request, response) => {
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.end('Hello World\\n');
 }).listen(8124);
 console.log('Server running at http://127.0.0.1:8124/');
})`;
vm.runInThisContext(code)(require);

看完這篇關(guān)于Node.js API中vm模塊用法實(shí)例詳解的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。

網(wǎng)站欄目:Node.jsAPI中vm模塊用法實(shí)例詳解
轉(zhuǎn)載來于:http://www.rwnh.cn/article20/ghdjjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、云服務(wù)器商城網(wǎng)站、網(wǎng)站維護(hù)網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
西安市| 万宁市| 宝清县| 东至县| 镇康县| 普洱| 古蔺县| 拜城县| 沅江市| 马山县| 江城| 隆林| 遂宁市| 玛纳斯县| 泗洪县| 威宁| 普兰店市| 石阡县| 昌邑市| 隆尧县| 大埔区| 墨玉县| 分宜县| 东丽区| 南川市| 镇远县| 莱州市| 襄汾县| 德化县| 醴陵市| 彭阳县| 绥宁县| 改则县| 永川市| 安宁市| 蒙城县| 内乡县| 修文县| 黄大仙区| 太康县| 夏津县|