如何在Node.js中运行可在浏览器环境正常工作的JS脚本
浏览器端脚本适配Node.js运行解决方案
核心适配思路
Node.js 原生不存在浏览器环境独有的window全局对象,适配核心是补全脚本实际依赖的window下的属性,不要直接将window全量替换为global避免全局污染。
具体操作步骤
- 第一步:梳理依赖的属性
运行unminify后的脚本,根据报错信息整理脚本实际用到的window下的属性,这类链上工具脚本通常依赖的属性只有几类:base64编解码方法、webcrypto加密接口、脚本自身挂载的全局导出对象,很少涉及DOM操作。 - 第二步:按需补全全局模拟
如果依赖的属性很少,可以直接在脚本顶部手动补全:
如果依赖的浏览器API较多,可以直接用// 脚本开头添加全局声明 global.window = global.window || {}; // 补全base64编解码能力 window.btoa = window.btoa || ((str) => Buffer.from(str, 'binary').toString('base64')); window.atob = window.atob || ((b64) => Buffer.from(b64, 'base64').toString('binary')); // 补全加密接口 window.crypto = window.crypto || require('crypto').webcrypto;jsdom模拟完整浏览器上下文:// 先执行安装命令:npm install jsdom const { JSDOM } = require('jsdom'); const dom = new JSDOM('<!DOCTYPE html>'); global.window = dom.window; global.document = dom.window.document; // 之后再引入目标EVM.js脚本即可 - 第三步:导出脚本能力
这类浏览器脚本通常会把对外暴露的方法挂载到window对象上,适配Node.js时在脚本末尾添加导出规则即可:// 替换为脚本实际挂载到window上的对象名即可 module.exports = window.EVM;
内容的提问来源于stack exchange,提问作者Francesco Clementi
相关产品推荐
相关产品推荐

