导入捆绑
importBundle 是用来评价由 :
bundle-source,把它们重新变成可调用功能:
const bundle = await bundleSource('path/to/bundle.js');
// 'bundle' is JSON-serializable
const options = {}; // filePrefix, endowments, other compartment options
const namespace = await importBundle(bundle);
const { default, namedExport1, namedExport2 } = namespace;
必须在 SES 环境中运行 : 在导入前必须安装 SES
@endo/import-bundle。 。 。 .
常规的方法是导入一个模块(例如:. @endo/init哪个
已经 import 'ses'; lockdown();。 。 。 .
捆绑将装入一个新的座舱,该座舱无法进入
平台全局类 document 或者说 Fetch 或者说 require。 。 。 .
捆绑被隔离到只能使用无能的JavaScript设施
以及你提供的一切捐赠.
每次打给 importBundle 创建新 Compartment。 。 。 .
在任何捆绑代码被冻结之前,新Combetment的全局被冻结
被评估,以强制执行 ocap规则.
模块格式
源可以被捆绑在各种"格式"中.
内地ZipBase64
默认, bundleSource 使用命名格式 endoZipBase64,其中
在 Zip 文件 和 base- 64 中捕获源模块和"组合图"
已编码.
区间地图描述了如何构建一组 硬化
Java 脚本 车厢和如何装入和连接
它们之间的源模块.
内语脚本
这个 endoScript 格式以 JavaScript 单一程序抓取源
以输入模块的名称空间对象完成.
获取导出
这个 getExport 格式以单一的普通JS风格字符串来捕捉源,
并用可调用功能包起来,提供 exports 财务报告和审定财务报表
module.exports 可附加出口的上下文.
嵌入式评价
更精细 getExport 名称 nestedEvaluate。 。 。 .
在此模式下,源树被转换为可评价字符串表,
每个原始模块各一个.
此表再作编码并像以前一样包裹.
评价过程使用单独的评价员调用每个单元,
提供一种机会,使 sourceMap 对每一个.
在随后调试信息和堆栈中保存相对文件名
痕迹.
要为这些相对文件名设置一个基准前缀,请提供 filePrefix
选项.
注意 nestedEvaluate 格式收到全球捐赠名称
require,尽管只有在源树导入其中之一时才会叫它
数字化 bundle-source "外"名表.
测试
这个 test 格式用于在本地对捆绑进行测试,并且是
故意不能连载或通过.
在测试中使用此格式以避免需要从源代码生成捆绑,
仅提供您需要的导出 importBundle。 。 。 .
import { importBundle, bundleTestExports } from '@endo/import-bundle';
test('who tests the tests', async t => {
const bundle = bundleTestExports({ a: 10 });
const namespace = await importBundle(bundle);
t.is(namespace.a, 10);
t.is(Object.prototype.toString.call(ns), '[object Module]');
});
选项
importBundle() 需要选项包和可选的额外权限.
const namespace = await importBundle(bundle, options, powers);
最常见的选择是 filePrefix,可以提供
nestedEvaluate- 格式捆绑.
设置捆绑内顶级模块的源文件名, 如
用于调试信件( 如错误中显示的堆栈痕迹) .
其它模块将基于其
位于原始源树内.
另一个常见的选择是 endowments,其中提供了将
在评估来源中,任何地方都有.
默认情况下, 捆绑只能访问标准的 JavaScript
基础Array, (中文(简体) ), Object, (中文(简体) ), Map(见e/cn.4/sub.2/2002/l.48等).
它不会得到 document, (中文(简体) ), window, (中文(简体) ), Request, (中文(简体) ), process, (中文(简体) ), require,或甚至
console 除非你把它们当作捐赠品 让你完全掌控
装满的捆绑可以做什么.
这个 bundle-source 工具有少量模块名称标记为
"外出" (中文(简体) ).
这些模块不会被捆绑到源中(从文件系统中复制到其中)
bundleSource 被调用).
相反,捆绑者给 require() 每个外部模块
是从原始来源图中的某处导入的.
这使得最终评估环境能够控制这些进口所得,
而不是原始源树.
为了支持这些“外部”进口,您需要提供 require
任何这种名字都能被尊崇的天赋.
此外 nestedEvaluate 格式总是需要 require 捐赠
(尽管只有在原始来源进口其中一种时才使用)
"外"名".
为了调试目的,你也许应该提供 console 捐赠.
见 makeConsole.js 在SwingSet源树中寻找灵感.
其余部分 options 传递到 Compartment 建筑师,
它目前只接受 transforms。 。 。 .
更多信息,请参见 compartment-shim 在 SES 仓库中的文件 .
请注意: transforms 被定义为每个对象都有一组
rewrite 方法.
请注意: sloppyGlobalsMode 只能被表层接受 evaluate
方法,而不是表层构造器本身,因此不能提供给
importBundle。 。 。 .
用于 sloppyGlobalsMode,您可能想要创建一个模拟
直接(而不是冻结其全球).
原始地图
对于一个远藤(zi, Base64)捆绑, bundleSource 将添加源地图到 a
每个用户缓存,如果导入在同一主机上,它们就可以被调试.
为了使用这个设施,通过一个 computeSourceMapLocation 能力进入
powers。 。 。 .
import 'ses';
import bundleSource from '@endo/bundle-source';
import { importBundle } from '@endo/import-bundle';
import { computeSourceMapLocation } from '@endo/import-bundle/source-map-node.js';
lockdown();
const bundle = await bundleSource('debugme.js');
await importBundle(
bundle,
{ endowments: { console } },
{ computeSourceMapLocation },
);
使用 node --inspect-brk 财务报告和审定财务报表 debugger 发言.