Rust Node.js兼容库deno_node的使用:在Deno中无缝运行NPM模块和Node.js代码
deno_node
deno_node
提供了在 Deno 中使用 Node.js 相关功能的能力,包括 require
和其他 Node.js 兼容功能。
安装
在你的项目目录中运行以下 Cargo 命令:
cargo add deno_node
或者在 Cargo.toml 中添加以下行:
deno_node = "0.150.0"
使用示例
以下是一个完整的示例,展示如何在 Deno 中使用 deno_node
来运行 NPM 模块和 Node.js 代码:
// main.ts
import { createRequire } from "https://deno.land/std@0.150.0/node/module.ts";
// 创建一个 require 函数
const require = createRequire(import.meta.url);
// 使用 require 导入 Node.js 模块
const chalk = require("chalk");
// 使用导入的模块
console.log(chalk.red("Hello from Node.js module in Deno!"));
首先,你需要确保已安装 Node.js 模块:
npm install chalk
然后运行 Deno 脚本:
deno run --allow-read --allow-env main.ts
完整示例
下面是一个更完整的示例,展示如何使用多个 Node.js 模块:
// app.ts
import { createRequire } from "https://deno.land/std@0.150.0/node/module.ts";
// 创建 require 函数
const require = createRequire(import.meta.url);
// 导入多个 Node.js 模块
const path = require("path");
const fs = require("fs");
const axios = require("axios");
// 使用 path 模块
console.log("当前目录:", path.resolve("."));
// 使用 fs 模块
fs.writeFileSync("test.txt", "Hello Deno with Node.js!");
// 使用 axios 发起 HTTP 请求
async function fetchData() {
const response = await axios.get("https://jsonplaceholder.typicode.com/todos/1");
console.log("获取的数据:", response.data);
}
fetchData();
运行前需要安装依赖:
npm install axios
然后运行:
deno run --allow-read --allow-write --allow-net app.ts
功能
deno_node
提供了以下主要功能:
- Node.js 风格的
require
系统 - Node.js 核心模块的兼容实现
- NPM 模块支持
- Node.js 全局变量和 API 支持
所有者
- Ryan Dahl (Deno 创始人)
- David Sherret
- Bartek Iwańczuk
- denobot (Deno 官方机器人)
1 回复
Rust Node.js兼容库deno_node的使用:在Deno中无缝运行NPM模块和Node.js代码
deno_node
是Deno生态系统中的一个重要兼容层,它允许开发者在Deno运行时中直接使用Node.js模块和API。这个库由Deno团队维护,旨在提供Node.js兼容性而不需要额外的工具链。
核心功能
- 支持直接导入NPM模块
- 提供Node.js核心模块的polyfill(如fs、path、http等)
- 实现Node.js风格的模块解析算法
- 兼容CommonJS模块系统
使用方法
基本配置
首先确保你使用的是Deno 1.25或更高版本,然后在你的Deno项目中:
// 导入deno_node的Node.js兼容层
import { createRequire } from "https://deno.land/std@0.150.0/node/module.ts";
// 创建require函数
const require = createRequire(import.meta.url);
使用NPM模块示例
// 导入chalk颜色库
const chalk = require("chalk");
console.log(chalk.blue("Hello from NPM!"));
使用Node.js核心模块
// 使用Node.js的path模块
const path = require("path");
console.log(path.join("/foo", "bar", "baz")); // 输出: /foo/bar/baz
运行Node.js脚本文件
// 直接运行Node.js脚本
require("./legacy-node-script.js");
高级用法
配置NPM包解析
import { createRequire } from "https://deno.land/std@0.150.0/node/module.ts";
// 指定node_modules目录位置
const require = createRequire(import.meta.url, "/path/to/node_modules");
const lodash = require("lodash");
与ES模块混合使用
// 同时使用ES模块和CommonJS
import { createRequire } from "https://deno.land/std/node/module.ts";
const require = createRequire(import.meta.url);
// ES模块导入
import { serve } from "https://deno.land/std/http/server.ts";
// CommonJS导入
const express = require("express");
运行方式
运行带有Node.js兼容性的Deno脚本需要特殊权限:
deno run --unstable --allow-read --allow-env --allow-net your_script.ts
注意事项
- 不是所有Node.js模块都能完美工作,特别是那些重度依赖Node.js特定API的模块
- 性能可能略低于原生Node.js环境
- 某些NPM包可能需要额外配置才能正常工作
- 建议优先使用Deno原生模块,仅在必要时使用Node.js兼容层
完整示例demo
以下是一个完整的Deno项目示例,展示了如何使用deno_node来混合使用NPM模块和Deno原生模块:
// 导入Deno原生HTTP服务器模块
import { serve } from "https://deno.land/std/http/server.ts";
// 设置Node.js兼容层
import { createRequire } from "https://deno.land/std/node/module.ts";
const require = createRequire(import.meta.url);
// 导入NPM模块 - express
const express = require("express");
// 导入Node.js核心模块 - path
const path = require("path");
// 创建一个Express应用
const app = express();
// 使用path模块
const staticPath = path.join("public", "assets");
// Express路由
app.get("/", (req, res) => {
res.send("Hello from Express in Deno!");
});
// 同时启动Deno原生HTTP服务器
serve(async (req) => {
return new Response("Hello from Deno HTTP server!");
}, { port: 8000 });
console.log("Deno HTTP server running on http://localhost:8000");
console.log("Express server will run on port 3000 (if fully compatible)");
要运行这个示例,使用以下命令:
deno run --unstable --allow-read --allow-env --allow-net --allow-write example.ts
兼容性说明
- 示例中Express可能需要额外的polyfill才能完全工作
- path等核心Node.js模块通常能完美工作
- 混合使用时需要注意模块系统的差异
- 建议先用简单模块测试,再逐步引入复杂依赖
deno_node
为从Node.js迁移到Deno或需要在Deno中使用特定NPM模块提供了极大的便利,是Deno生态系统中的重要桥梁。