关于Deno库在Node.js项目中导入及Deno开发TypeScript库供Node使用的技术问询
Deno开发的TypeScript库如何供Node.js开发者使用?
嘿,这个问题问得实在是太实用了!我之前也折腾过把自己用Deno写的TS库转到Node项目里用,踩了几个小坑后总结出几个靠谱的方案,给你详细说说:
最推荐:用Deno官方的dnt工具一键转换
Deno团队专门做了dnt(Deno to Node Transform)这个工具,就是为了解决Deno库转Node兼容包的问题。它能自动处理TypeScript转译、模块格式转换(CommonJS/ES模块都支持)、类型声明生成,甚至还能给Deno特有的API加垫片,简直是省心神器。
具体步骤大概是这样:
- 在你的Deno项目根目录新建一个
build_npm.ts脚本,内容参考下面的模板:import { build } from "https://deno.land/x/dnt/mod.ts"; await build({ entryPoints: ["./mod.ts"], // 替换成你的库入口文件路径 outDir: "./npm-dist", // 生成的Node包输出目录 shims: { // 如果你的代码用到了Deno专属API(比如Deno.readFile),开启这个自动加垫片 deno: true, }, package: { // 这里填你的npm包信息,和普通package.json字段一致 name: "your-awesome-library", version: "1.0.0", description: "用Deno写的TS库,Node也能轻松用", license: "MIT", main: "mod.js", types: "mod.d.ts", }, }); // 可选:把README、LICENSE这些文件复制到输出目录,方便npm发布 await Deno.copyFile("README.md", "./npm-dist/README.md"); await Deno.copyFile("LICENSE", "./npm-dist/LICENSE"); - 运行这个脚本:
deno run -A build_npm.ts(-A是给足权限,因为要写文件) - 进入生成的
npm-dist目录,就可以像普通Node包一样发布到npm了:npm publish
这样Node开发者直接npm install your-awesome-library就能用,和他们平时用的npm包完全没区别,连类型提示都能正常工作。
手动适配:适合轻量无特殊依赖的库
如果你的库代码比较简单,完全没用到Deno专属的API(比如没调用Deno.*,也没用到Deno标准库的特殊模块),那手动改一改就能兼容Node:
- 把导入路径换成Node支持的模块,比如把
import { readTextFile } from "https://deno.land/std/fs/mod.ts"改成import { readFile } from "fs/promises" - 新建一个
tsconfig.json,配置成Node兼容的编译选项:{ "compilerOptions": { "target": "ES2020", "module": "CommonJS", "outDir": "./dist", "declaration": true, "strict": true }, "include": ["src/**/*"] } - 用
tsc编译成JS,然后写好package.json,发布到npm就行。
不过这个方法只适合小项目,要是用到了Deno特有的API,就得自己写垫片或者替换成Node的对应实现,比较麻烦。
临时方案:让Node开发者通过CDN直接导入
如果不想发布到npm,还可以让Node开发者用支持Deno模块的CDN直接导入你的库,比如:
// Node项目里的代码(需要把package.json的type设为module) import yourLibrary from "https://esm.sh/https://deno.land/x/your-library/mod.ts";
这种方式适合快速试用,但生产环境不太推荐,毕竟依赖CDN的稳定性,而且没法离线使用。
小提醒
不管用哪种方法,最好在Deno和Node环境都跑一遍测试,确保兼容性。如果用到了Deno特有的API,一定要记得用垫片或者替换成Node的对应API,不然Node运行时会报错。
备注:内容来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

