如何根据JavaScript运行时(Node/Deno/Bun)导入对应模块?
根据JS运行时条件导入模块的实用方案
下面给你几个能根据Node、Deno、Bun不同运行时导入对应模块的方法:
1. 动态导入+运行时检测
静态import没法直接放在条件语句里,但可以用动态import()函数结合环境判断来实现,这是最直接的方式:
let MyLib; // 检测Bun环境 if (typeof Bun !== 'undefined') { MyLib = await import('./mylib-bun.js'); } // 检测Deno环境 else if (typeof Deno !== 'undefined') { MyLib = await import('./mylib-deno.js'); } // 检测Node环境 else if (typeof process !== 'undefined' && process.release.name === 'node') { MyLib = await import('./mylib-node.js'); } // 之后就能正常使用模块了 MyLib.default.doSomething();
注意:动态import返回Promise,所以代码要放在async函数里,或者用.then()处理。
2. 封装统一入口模块
如果多个地方都要用到这个模块,不如单独写一个入口文件做统一处理,其他地方直接导入这个入口就行:
比如创建mylib.js:
let lib; if (typeof Bun !== 'undefined') { lib = await import('./mylib-bun.js'); } else if (typeof Deno !== 'undefined') { lib = await import('./mylib-deno.js'); } else if (typeof process !== 'undefined' && process.release.name === 'node') { lib = await import('./mylib-node.js'); } // 导出模块的内容,保持接口一致 export default lib.default; export const { MyFunction } = lib;
其他文件里直接导入:
import MyLib, { MyFunction } from './mylib.js';
3. 用package.json条件导出(Node/Bun支持)
如果是开发npm包,或者在Node、Bun环境里,可以用package.json的条件导出功能,直接配置不同环境对应的文件:
{ "exports": { "bun": "./mylib-bun.js", "deno": "./mylib-deno.js", "node": "./mylib-node.js", "default": "./mylib-node.js" } }
之后直接导入包名或者相对路径,运行时会自动匹配对应的文件:
import MyLib from './mylib';
Deno需要额外配置import map或者启用相关标志来识别这种条件导出。
4. Deno专属导入映射
Deno支持通过deno.json配置导入映射,专门指定Deno环境下的模块路径:
{ "imports": { "./mylib": "./mylib-deno.js" } }
Node和Bun则可以用各自的配置方式(比如Node的条件导出、Bun兼容package.json配置)来分别处理。
目前没有原生的import runtime=Deno { MyFunction } from "./mylib-deno.js"这种语法,上面这些都是当前实际开发中能用的方案。
内容的提问来源于stack exchange,提问作者Alex Shaw
相关产品推荐
相关产品推荐

