Project Icon

sval

轻量级JavaScript解释器 支持最新ECMAScript特性

Sval是一款基于Acorn解析器的JavaScript解释器,支持运行最新ECMAScript特性。它提供沙箱和侵入式两种模式,适用于评估高版本ECMAScript代码或受限环境。Sval具备模块化支持,可轻松导入导出模块,为开发者提供灵活的代码执行方案。该工具在需要安全执行动态JavaScript代码的场景中尤为有用。

Sval · npm github-actions coveralls

一个用JavaScript编写的JavaScript解释器,基于解析器Acorn

  • 运行在ES5环境,支持最新的ES特性
  • 可选入侵式和沙箱模式

它对于评估更高版本ECMAScript代码很有用,或者适用于禁用了evalsetTimeoutnew Function的环境。

在playground上尝试Sval。

安装

Node

使用npm安装Sval。

npm install sval

浏览器

直接从unpkg引入。或者从releases下载,获取最小化文件dist/min/sval.min.js,并在HTML页面中引入。你可以直接访问全局变量Sval

<script type="text/javascript" src="https://unpkg.com/sval"></script>

快速开始

import Sval from 'sval'

// 创建一个解释器
const interpreter = new Sval({
  // 代码的ECMA版本
  // 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
  // 或 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024
  // 或 "latest"
  ecmaVer: 'latest',
  // 代码源类型
  // "script" 或 "module"
  sourceType: 'script',
  // 代码是否在沙箱中运行
  sandBox: true,
})

// 解析并运行代码
interpreter.run(`
  console.log('Hello World')
`)

使用方法

Sval构造函数有三个选项:ecmaVersourceTypesandBox

  • ecmaVer是代码的ECMAScript版本。目前支持3、5、6(2015)、7(2016)、8(2017)、9(2018)、10(2019)、11(2020)、12(2021)、13(2022)、14(2023)、15(2024)和"latest",默认版本为"latest"。

  • sourceType可以是"script"或"module",用于声明Sval如何处理代码。"script"意味着代码将被视为普通脚本,而"module"意味着代码将被视为ES模块,具有全局严格模式并解析import和export声明。默认类型为"script"。

  • sandBox为true表示沙箱模式,为false表示入侵式模式。沙箱模式将在隔离的沙箱中运行代码,不会污染全局作用域。入侵式模式允许你在当前环境的相同全局作用域中运行代码。默认设置为true。

Sval实例有两个主要方法:parserun

  • parse用于使用内部Acorn或自定义解析器解析代码,获取相应的AST,如parse(code: string)parse(code: string, parser: (code: string, options: SvalOptions) => estree.Node

  • run用于评估输入的代码,接受一个字符串作为参数,如run(code: string),或接受一个遵循ESTree规范的AST作为参数,如run(ast: estree.Node)

此外,Sval实例还有一个方法import和一个对象exports用于模块化。

  • import用于将模块导入Sval实例作用域。此方法对不同的sourceType有不同的行为。

    对于"script",此方法接受一个名称和一个模块作为参数,如import(name: string, mod: any),或接受一个包含模块的对象作为参数,如import({ [name: string]: any })。这些模块将自动声明为Sval实例作用域中的全局变量。此方法更可能在沙箱模式下使用。

    对于"module",此方法接受一个路径和一个模块声明作为参数,如import(path: string, mod: Module),或接受一个包含模块声明的对象作为参数,如import({ [path: string]: Module })Module可以是ES模块导出对象,如{ default?: any, [name: string]: any },或返回ES模块导出对象的函数,如() => ({ default?: any, [name: string]: any })。如果通过动态导入导入模块,Module也可以是一个promise或返回promise的函数。这些模块不会自动声明为Sval实例作用域中的全局变量,代码应使用import声明来导入模块。

  • exports用于获取从运行中导出的内容,如果有多次运行的导出会合并。这个对象对不同的sourceType也有不同的行为。

    对于"script",此对象将自动声明为Sval实例作用域中的全局变量,代码可以简单地在其上挂载属性进行导出。

    对于"module",此对象不会自动声明为Sval实例作用域中的全局变量,代码需要使用export声明进行导出。

以下是importexports的示例:

"script"示例:

import Sval from 'sval'

// 为脚本创建一个解释器
const scriptInterpreter = new Sval({ sourceType: 'script' })

// 在解释器中添加全局模块
scriptInterpreter.import('importWhatYouNeed', 'AllKindsOfStuffs')
// 或 scriptInterpreter.import({ importWhatYouNeed: 'AllKindsOfStuffs' })

// 解析并运行代码
scriptInterpreter.run(`
  exports.mod = importWhatYouNeed
`)

// 获取运行的导出
console.log(scriptInterpreter.exports.mod) // 得到 'AllKindsOfStuffs'

"module"示例:

import Sval from 'sval'

// 为模块创建一个解释器
const moduleInterpreter = new Sval({ sourceType: 'module' })

// 在解释器中添加ES模块
moduleInterpreter.import('./import-what-you-need', { default: 'AllKindsOfStuffs' })
// 或 moduleInterpreter.import('./import-what-you-need', () => ({ default: 'AllKindsOfStuffs' }))
// 或 moduleInterpreter.import({ './import-what-you-need': { default: 'AllKindsOfStuffs' } })
// 或 moduleInterpreter.import({ './import-what-you-need': () => ({ default: 'AllKindsOfStuffs' }) })

// 在解释器中为动态导入添加ES模块
moduleInterpreter.import('./dynamic-import-what-you-need', Promise.resolve({ default: 'AllKindsOfStuffs' }))

// 解析并运行代码
moduleInterpreter.run(`
  import importWhatYouNeed from './import-what-you-need'
  import('./dynamic-import-what-you-need').then(m => console.log(m.default)) // 得到 'AllKindsOfStuffs'
  export { importWhatYouNeed as mod }
`)

// 获取运行的导出
console.log(moduleInterpreter.exports.mod) // 得到 'AllKindsOfStuffs'

注意

WithStatementLabeledStatement未实现且不推荐使用。请避免使用它们。

参考

许可证

Sval 使用 MIT 许可证。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号