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 提供了以下主要功能:

  1. Node.js 风格的 require 系统
  2. Node.js 核心模块的兼容实现
  3. NPM 模块支持
  4. 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兼容性而不需要额外的工具链。

核心功能

  1. 支持直接导入NPM模块
  2. 提供Node.js核心模块的polyfill(如fs、path、http等)
  3. 实现Node.js风格的模块解析算法
  4. 兼容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

注意事项

  1. 不是所有Node.js模块都能完美工作,特别是那些重度依赖Node.js特定API的模块
  2. 性能可能略低于原生Node.js环境
  3. 某些NPM包可能需要额外配置才能正常工作
  4. 建议优先使用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

兼容性说明

  1. 示例中Express可能需要额外的polyfill才能完全工作
  2. path等核心Node.js模块通常能完美工作
  3. 混合使用时需要注意模块系统的差异
  4. 建议先用简单模块测试,再逐步引入复杂依赖

deno_node为从Node.js迁移到Deno或需要在Deno中使用特定NPM模块提供了极大的便利,是Deno生态系统中的重要桥梁。

回到顶部