Deno如何为Node.js内置模块提供shim/polyfill兼容方案?
Deno实现Node.js模块shim/polyfill的方案
方案1:使用Deno原生import maps(官方推荐)
Deno原生支持import maps特性,不需要额外工具即可实现模块导入路径的全局重定向,完全满足需求:
- 第一步:编写自定义shim模块
新建shims/perf_hooks.ts文件,实现需要的API:// 可基于Deno原生API实现对应逻辑,Deno全局已自带performance对象 export const performance = { performance: globalThis.performance }; // 可按需补充perf_hooks模块下其他导出内容 - 第二步:创建import map配置文件
项目根目录新建import_map.json:{ "imports": { "perf_hooks": "./shims/perf_hooks.ts" } } - 第三步:运行时指定import map
启动命令添加--import-map参数:
配置生效后,项目中所有导入deno run --import-map import_map.json main.tsperf_hooks的位置都会自动使用自定义shim,无需修改原有Node.js模块的代码。
方案2:使用预制Node兼容层
如果需要适配大量Node.js内置模块,不需要逐个手写shim:
- 可以使用Deno官方标准库提供的Node兼容层,已实现包括
perf_hooks在内的绝大多数Node.js核心模块的polyfill,只需将import map中的对应路径指向兼容层的本地副本即可。 - 若需要更完整的Node运行时兼容,可在运行命令中添加
--compat参数,开启Deno的Node兼容模式,自动注入process、Buffer等Node全局变量。
社区常用工程化方案
如果项目复杂度较高,也可以使用以下打包方案实现shim注入:
- 使用esbuild搭配导入替换插件,在打包阶段将所有Node内置模块的导入路径替换为对应shim的路径
- 使用适配Deno的模块打包工具,配置alias规则实现全局路径重定向
内容的提问来源于stack exchange,提问作者Alana Storm
相关产品推荐
相关产品推荐

