Hello World #

一、程序概述 #

按照编程语言学习的传统,让我们从Hello World程序开始,了解Deno程序的基本结构和运行方式。

二、创建源文件 #

2.1 创建项目目录 #

bash
mkdir -p ~/projects/hello_deno
cd ~/projects/hello_deno

2.2 创建源文件 #

创建 hello.ts 文件:

typescript
console.log("Hello, Deno!");

三、程序解析 #

3.1 控制台输出 #

typescript
console.log("Hello, Deno!");
  • console:全局对象,提供控制台输出方法
  • log():输出方法,打印到标准输出
  • "Hello, Deno!":字符串字面量

3.2 TypeScript特性 #

Deno原生支持TypeScript,可以添加类型:

typescript
const message: string = "Hello, Deno!";
console.log(message);

四、运行程序 #

4.1 基本运行 #

bash
deno run hello.ts

输出:

text
Hello, Deno!

4.2 运行流程 #

text
源代码 (.ts) → TypeScript编译器 → JavaScript → V8执行

4.3 检查模式 #

只检查类型,不执行代码:

bash
deno check hello.ts

五、权限系统 #

5.1 安全默认 #

Deno默认禁止访问敏感资源。让我们看一个需要权限的例子:

创建 read_file.ts

typescript
const content = await Deno.readTextFile("./hello.ts");
console.log(content);

运行:

bash
deno run read_file.ts

会得到权限错误:

text
┌ Deno requests read access to "./hello.ts".
├ Run again with --allow-read to bypass this prompt.
└ Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all read permissions) >

5.2 授权运行 #

bash
deno run --allow-read read_file.ts

5.3 权限标志 #

标志 说明 示例
–allow-read 允许读取文件 –allow-read=/tmp
–allow-write 允许写入文件 –allow-write=./output
–allow-net 允许网络访问 –allow-net=api.example.com
–allow-env 允许访问环境变量 –allow-env=NODE_ENV
–allow-run 允许运行子进程 –allow-run=git
–allow-ffi 允许FFI调用 –allow-ffi
-A, --allow-all 允许所有权限 -A

5.4 权限白名单 #

可以指定具体的权限范围:

bash
# 只允许读取当前目录
deno run --allow-read=. read_file.ts

# 只允许访问特定域名
deno run --allow-net=api.example.com fetch_data.ts

# 只允许访问特定环境变量
deno run --allow-env=HOME,PATH env_check.ts

六、网络请求示例 #

创建 fetch_data.ts

typescript
const response = await fetch("https://api.github.com/users/denoland");
const data = await response.json();

console.log("Deno GitHub用户信息:");
console.log(`名称: ${data.name}`);
console.log(`描述: ${data.bio}`);
console.log(`仓库数: ${data.public_repos}`);

运行:

bash
deno run --allow-net=api.github.com fetch_data.ts

输出:

text
Deno GitHub用户信息:
名称: deno
描述: A modern runtime for JavaScript and TypeScript.
仓库数: 50

七、HTTP服务器示例 #

创建 server.ts

typescript
import { serve } from "https://deno.land/std@0.208.0/http/server.ts";

serve((request: Request) => {
  const url = new URL(request.url);
  
  if (url.pathname === "/") {
    return new Response("Hello, Deno!", {
      headers: { "content-type": "text/plain" }
    });
  }
  
  if (url.pathname === "/json") {
    return Response.json({ message: "Hello, Deno!", time: new Date() });
  }
  
  return new Response("Not Found", { status: 404 });
}, { port: 8000 });

console.log("Server running at http://localhost:8000/");

运行:

bash
deno run --allow-net server.ts

访问:

bash
curl http://localhost:8000/
curl http://localhost:8000/json

八、文件操作示例 #

创建 file_ops.ts

typescript
// 写入文件
await Deno.writeTextFile("./output.txt", "Hello from Deno!\n");
console.log("文件写入成功");

// 读取文件
const content = await Deno.readTextFile("./output.txt");
console.log("文件内容:", content);

// 获取文件信息
const info = await Deno.stat("./output.txt");
console.log("文件大小:", info.size, "字节");
console.log("是否文件:", info.isFile);
console.log("修改时间:", info.mtime);

运行:

bash
deno run --allow-read --allow-write file_ops.ts

九、命令行参数 #

创建 args.ts

typescript
// 获取命令行参数
const args = Deno.args;

console.log("参数列表:", args);
console.log("参数个数:", args.length);

// 解析命名参数
const name = args[0] || "World";
const count = parseInt(args[1]) || 1;

for (let i = 0; i < count; i++) {
  console.log(`Hello, ${name}!`);
}

运行:

bash
deno run args.ts Deno 3

输出:

text
参数列表: [ "Deno", "3" ]
参数个数: 2
Hello, Deno!
Hello, Deno!
Hello, Deno!

十、环境变量 #

创建 env.ts

typescript
// 获取环境变量
const home = Deno.env.get("HOME");
const path = Deno.env.get("PATH");
const shell = Deno.env.get("SHELL");

console.log("HOME:", home);
console.log("SHELL:", shell);
console.log("PATH:", path?.split(":").slice(0, 3).join(":"));

// 设置环境变量(需要--allow-env权限)
Deno.env.set("MY_VAR", "Hello from Deno");
console.log("MY_VAR:", Deno.env.get("MY_VAR"));

// 删除环境变量
Deno.env.delete("MY_VAR");

运行:

bash
deno run --allow-env env.ts

十一、顶层await #

Deno支持顶层await:

typescript
// 无需async函数包装
const response = await fetch("https://api.github.com/zen");
const quote = await response.text();

console.log("GitHub Zen:", quote);

const file = await Deno.readTextFile("./hello.ts");
console.log("文件内容:", file);

十二、从URL运行 #

Deno可以直接运行远程脚本:

bash
# 运行官方示例
deno run https://deno.land/std@0.208.0/examples/welcome.ts

# 运行带权限的远程脚本
deno run --allow-net https://deno.land/std@0.208.0/examples/curl.ts https://example.com

十三、编译可执行文件 #

将Deno脚本编译为独立可执行文件:

bash
deno compile --allow-net --output hello-server server.ts

生成的可执行文件可以直接运行:

bash
./hello-server

十四、实践练习 #

练习1:个人信息 #

typescript
const name = "张三";
const age = 25;
const city = "北京";

interface Person {
  name: string;
  age: number;
  city: string;
}

const person: Person = { name, age, city };

console.log("个人信息:");
console.log(`姓名: ${person.name}`);
console.log(`年龄: ${person.age}`);
console.log(`城市: ${person.city}`);

练习2:简单计算 #

typescript
const a = 10;
const b = 3;

console.log(`${a} + ${b} = ${a + b}`);
console.log(`${a} - ${b} = ${a - b}`);
console.log(`${a} * ${b} = ${a * b}`);
console.log(`${a} / ${b} = ${(a / b).toFixed(2)}`);
console.log(`${a} % ${b} = ${a % b}`);
console.log(`${a} ** ${b} = ${a ** b}`);

练习3:读取配置文件 #

typescript
interface Config {
  name: string;
  version: string;
  debug: boolean;
}

const configPath = "./config.json";

try {
  const content = await Deno.readTextFile(configPath);
  const config: Config = JSON.parse(content);
  
  console.log("配置信息:");
  console.log(`名称: ${config.name}`);
  console.log(`版本: ${config.version}`);
  console.log(`调试模式: ${config.debug ? "开启" : "关闭"}`);
} catch (error) {
  if (error instanceof Deno.errors.NotFound) {
    console.log("配置文件不存在,使用默认配置");
  } else {
    console.error("读取配置文件失败:", error.message);
  }
}

十五、总结 #

本章学习了:

  • Deno程序的基本结构
  • 运行TypeScript/JavaScript文件
  • 权限系统的使用
  • 网络请求与HTTP服务
  • 文件操作
  • 命令行参数与环境变量
  • 顶层await特性
  • 从URL运行脚本
  • 编译可执行文件

下一章,我们将深入学习Deno命令行工具的使用。

最后更新:2026-03-28