Object 內置對象

對象SandBox

安全沙箱對象,用於管理一個獨立的運行空間

所有的代碼都運行在自己的沙箱中,全局的require 會調用當前沙箱加載模塊,沙箱會通過require 傳遞給加載的沙箱。下面的示例創建一個沙箱,限制只允許訪問全局基礎模塊中的assert 模塊,並添加a 和b 兩個定制模塊:

1 2 3 4 5 6 7 8
var vm = require('vm'); var sbox = new vm.SandBox({ a: 100, b: 200, assert: require('assert') }); var mod_in_sbox = sbox.require('./path/to/mod');

繼承關係

#lineWidth: 1.5 #font: Helvetica,sans-Serif #fontSize: 10 #leading: 1.6 #.this: fill=lightgray #.class: fill=white [<class>object|toString();toJSON()] [<this>SandBox|new SandBox()|global;modules|add();addScript();remove();has();clone();freeze();refresh();run();resolve();require();setModuleCompiler()] [object] <:- [SandBox] SandBox new SandBox() global modules add() addScript() remove() has() clone() freeze() refresh() run() resolve() require() setModuleCompiler() object toString() toJSON()

構造函數

SandBox

構造一個新的安全沙箱對象,並初始化基礎模塊

1
new SandBox(Object mods);

調用參數:

  • mods: Object, 指定要添加的模塊對象字典

構造一個新的安全沙箱對象,並初始化基礎模塊

1 2
new SandBox(Object mods, Function require);

調用參數:

  • mods: Object, 指定要添加的模塊對象字典
  • require: Function, 自定義require 函數,當模塊不存在時,先調用自定義函數,無返回再從文件中加載

構造一個獨立Global 新的安全沙箱對象,並初始化基礎模塊

1 2
new SandBox(Object mods, Object global);

調用參數:

  • mods: Object, 指定要添加的模塊對象字典
  • global: Object, 指定初始化的Global 屬性

構造一個獨立Global 新的安全沙箱對象,並初始化基礎模塊

1 2 3
new SandBox(Object mods, Function require, Object global);

調用參數:

  • mods: Object, 指定要添加的模塊對象字典
  • require: Function, 自定義require 函數,當模塊不存在時,先調用自定義函數,無返回再從文件中加載
  • global: Object, 指定初始化的Global 屬性

成員屬性

global

Object, 查詢沙箱的 global 對象

1
readonly Object SandBox.global;

modules

Object, 查詢沙箱中現存的所有模塊的字典對象

1
readonly Object SandBox.modules;

成員函數

add

向沙箱中添加一個基礎模塊

1 2
SandBox.add(String id, Value mod);

調用參數:

  • id: String, 指定要添加的模塊名稱,此路徑與當前運行腳本無關,必須為絕對路徑或者模塊名
  • mod: Value, 指定要添加的模塊對象

向沙箱中添加一組基礎模塊

1
SandBox.add(Object mods);

調用參數:

  • mods: Object, 指定要添加的模塊對象字典,添加的javascript 模塊將會生成一份複製,以避免沙箱修改對象產生互相干擾

addScript

向沙箱中添加一個腳本模塊

1 2
Value SandBox.addScript(String srcname, Buffer script);

調用參數:

  • srcname: String, 指定要添加的腳本名稱,srcname 必須包含擴展名,比如 json 或者js, jsc
  • script: Buffer, 指定要添加的二進制代碼

返回結果:

  • Value, 返回加載的模塊對象

remove

從沙箱中刪除指定的基礎模塊

1
SandBox.remove(String id);

調用參數:

  • id: String, 指定要刪除的模塊名稱,此路徑與當前運行腳本無關,必須為絕對路徑或者模塊名

has

從沙箱中檢測基礎模塊是否存在

1
Boolean SandBox.has(String id);

調用參數:

  • id: String, 指定要檢測的模塊名稱,此路徑與當前運行腳本無關,必須為絕對路徑或者模塊名

返回結果:

  • Boolean, 是否存在

clone

複製當前沙箱,新沙箱包含當前沙箱的模塊,以及相同的名稱和require 函數

1
SandBox SandBox.clone();

返回結果:

  • SandBox, 複製的新沙箱

freeze

凍結當前沙箱,凍結後的沙箱,對 global 所做的修改將被忽略

1
SandBox.freeze();

refresh

重新加載沙箱內的模塊,此操作只會重新初始化模塊,復位模塊內的變量,不更新模塊代碼

1
SandBox.refresh();

run

運行一個腳本

1 2
SandBox.run(String fname, Array argv = []);

調用參數:

  • fname: String, 指定要運行的腳本路徑,此路徑與當前運行腳本無關,必須為絕對路徑
  • argv: Array, 指定要運行的參數,此參數可在腳本內使用argv 獲取

resolve

查詢一個模塊並返回模塊完整文件名

1 2
String SandBox.resolve(String id, String base);

調用參數:

  • id: String, 指定要加載的模塊名稱
  • base: String, 指定查找路徑

返回結果:

  • String, 返回加載的模塊完整文件名

require

加載一個模塊並返回模塊對象

1 2
Value SandBox.require(String id, String base);

調用參數:

  • id: String, 指定要加載的模塊名稱
  • base: String, 指定查找路徑

返回結果:

  • Value, 返回加載的模塊對象

setModuleCompiler

對指定的extname 添加compiler, extname 不可為系統內置擴展名(包括{'.js', '.json', '.jsc', '.wasm'}), compiler 需返回有效的javascript 腳本.

1 2
SandBox.setModuleCompiler(String extname, Function compiler);

調用參數:

  • extname: String, 指定的extname, 必須以'.' 開頭, 且為非系統內置擴展名
  • compiler: Function, 編譯回調函數, 所有帶extname 的文件僅會require 一次. 該回調函數格式為compiler(buf, requireInfo)Buffer, requireInfo 結構為{filename: string}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
var vm = require('vm'); var sbox = new vm.SandBox({}); // 编译 typescript 脚本为 js 并加载 sbox.setModuleCompiler('.ts', tsCompiler); var mod_ts = sbox.require('./a.ts'); // 编译 coffee 脚本为 js 并加载 sbox.setModuleCompiler('.coffee', cafeCompiler); var mod_coffee = sbox.require('./a.coffee'); // 编译 jsx 脚本为 js 并加载 sbox.setModuleCompiler('.jsx', reactCompiler); var mod_react = sbox.require('./a.jsx'); // 编译 yml 脚本为自定义的内容(如 API 集合) 并加载 sbox.setModuleCompiler('.yml', yaml2Rest) sbox.setModuleCompiler('.yaml', yaml2Rest) // 编译 markdown 为自定义的内容(如 html 字符串或 XmlDocument 对象) 并加载 sbox.setModuleCompiler('.md', mdCompiler) sbox.setModuleCompiler('.markdown', mdCompiler)

toString

返回對象的字符串表示,一般返回"[Native Object]",對象可以根據自己的特性重新實現

1
String SandBox.toString();

返回結果:

  • String, 返回對象的字符串表示

toJSON

返回對象的JSON 格式表示,一般返回對象定義的可讀屬性集合

1
Value SandBox.toJSON(String key = "");

調用參數:

  • key: String, 未使用

返回結果:

  • Value, 返回包含可JSON 序列化的值