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