OpenCode 实践课:4 分钟用 Node.js 写出一个命令行二维码生成器

项目介绍

日常开发中经常需要在终端里快速生成一个二维码——比如分享本地测试地址给同事、把一段配置文本编码成二维码供手机扫描。今天我们用 OpenCode,不写一行代码,4 分钟做一个命令行二维码生成器。

技术栈:Node.js + qrcode + commander,约 90 行代码。支持终端 ASCII 显示和 PNG 文件输出两种模式。

最终效果:

$ node qr.mjs "https://opencode.ai" --terminal
█████████████████████████████████████
█████████████████████████████████████
████ ▄▄▄▄▄ █ ▀ ▄█▀▄▀▀ ▄▀  ▄▄▄▄▄ ████
████ █   █ █▀▀█▄▄█ █ ▄█▀▀ █   █ ████
████ █▄▄▄█ █▀  █▄ ▀█▀▀█▄█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █▄▀ █▄▀ █ █▄█▄▄▄▄▄▄▄████
████▄▀▄▄▄ ▀ ▀▄▀▄ █ █  ▀▄▄▄▀▀█▄█▀▄████
██████▄▀▀▀▀▀█ ▄ ▄▄▀▀█▄▀ ▄█  ██▄ █████
████▄▄▀▄▀▀▀▀▀█▀▄▄▀▄▀▀ ▀▀▀▀ ▄█▀▀▀█████
█████ ▀ ▄▄▄▀▀ ▀▄▄▀▀  ▀ ▀ █▄▄▀  ▀▄████
████ ▄ █▄▄ ██▀▄▄▀▄ █ ▀█ ▄▀▀█▄█   █████
████▄ ▄▄ █▄ ▄█▀██▄ ▀ ▄▀▄██▀█▀▀▀▄▀████
████▄██▄▄██▄█▀▀█▀▀▄▄▄▀ ▀▄█ ▄█▀▄ █████
█████ ▄▄▄▄▄▄█ ▀▀█ ██ █▀▀ █▄█▄█▄▀ ████
█████▀  ▀▀█▄██▄▄█▀▄▀█ ▀▀▀ ▄▀ ▀▀▄▀████
████▀▀▄▄▀▀▀▀█▀▀█▀▀▀▀▄▄▄▄ ▀▀▀▀█▀ ▄████
████▄█▄▄▀  ▄▀ ▀▄███  ▀ ▀ ▄▀▄▀█▀▀▄████
████▄█  █ ▄▀▀  ▀▀   ▄██ ▀▀▀ ▄█  ▄████
████▄  ▀█▄▄ ▄ ▀▄ ▀█▀▀▀█▀ ▀ ▀▀▄█▀▄████
████▄▄█▀▄▄▄▄▄▄▀█▄ █ █▀▀▀█ ▀▀█ ▀▀▄████
████▄▄ ▀▄▀▄█▄█ ▀▀▀█▄▄▀▀▄█▄ ▄▀▄▄▀▄████
████ ▄▄▄▄▄ █▀█▀██▀▀▄█ ▄ ▀ █▄█ ███ ████
████ █   █ █▀█▀ █▀▀█▄▄▄▄▄██▄▄ ▄█  ████
████ █▄▄▄█ █▀  ▄▄██ ▀█  █▄▄█▀ ▀██ ████
████▄▄▄▄▄▄▄█▄█▄█▄█▄█████▄█▄▄▄▄██▄████
█████████████████████████████████████
█████████████████████████████████████

准备工作

  • Node.js ≥ 18(支持 ES Module)
  • OpenCode(安装方式见 opencode.ai
  • 无需任何 npm 包预先安装——OpenCode 会帮你搞定

实践过程

第一步:初始化项目

我对 OpenCode 说:

> 在当前目录创建一个 Node.js 项目,用 ESM 模块模式。我要写一个命令行二维码生成工具。package.json 里设置 "type": "module"

OpenCode 立即创建了 package.json,并自动识别出需要用到的 npm 包。它问我是否要安装 qrcodecommander,我回复确认。不到 30 秒,项目骨架就搭好了。

关键要点:告诉 OpenCode 你的运行环境(ESM / CommonJS),它能自动调整配置,省去手动翻文档的时间。

第二步:编写核心逻辑

我对 OpenCode 说:

> 创建一个 qr.mjs 文件,实现以下功能:
> 1. 使用 commander 解析命令行参数
> 2. 接收一个必选参数:要编码的文本
> 3. 支持 -t, --terminal 选项,在终端用 ASCII 显示二维码
> 4. 支持 -o, --output <file> 选项,输出为 PNG 文件
> 5. 支持 -s, --size <number> 选项,设置图片尺寸,默认 256

OpenCode 生成了完整的 CLI 框架代码,包括参数解析、选项校验逻辑。它还细心地添加了"至少指定 terminal 或 output 之一"的互斥检查,这一点我都没提到。

关键要点:用自然语言描述"做什么"而非"怎么写",把边界条件一起说出来,OpenCode 会自动补全你遗漏的细节。

第三步:接入二维码生成

我对 OpenCode 说:

> 用 qrcode 包的 toString 方法实现终端输出,用 toFile 方法实现 PNG 输出。终端模式下默认使用 small 尺寸,PNG 模式下使用 --size 参数指定的尺寸。

OpenCode 补充了 QRCode.toString()QRCode.toFile() 的调用,并在终端输出前打印了编码内容和提示信息。生成的代码简洁清晰,没有任何冗余。

关键要点:如果你知道要用哪个库的哪个 API,直接告诉 OpenCode,它能更精准地生成代码。不知道也没关系——说"帮我生成二维码并输出到终端",它会自动搜索合适的方案。

第四步:测试与润色

我对 OpenCode 说:

> 运行测试一下,生成 opencode.ai 的终端二维码,再输出一张 PNG 图片验证。如果有不符合预期的地方请调整。

OpenCode 自动执行了测试命令,生成的二维码扫描后正确跳转到 opencode.ai。它还在终端二维码上方加了一行分隔线和提示文字,让输出更美观。

关键要点:把 OpenCode 当成结对编程的同事,告诉它"测试一下""不符合预期就改",它会自动迭代。

完整代码

#!/usr/bin/env node
import { program } from 'commander';
import QRCode from 'qrcode';

program
  .name('qr')
  .description('命令行二维码生成器')
  .argument('<text>', '要编码的文本或 URL')
  .option('-t, --terminal', '在终端中显示二维码')
  .option('-o, --output <file>', '输出为 PNG 文件')
  .option('-s, --size <number>', 'PNG 图片尺寸(像素)', '256')
  .parse();

const options = program.opts();
const text = program.args[0];

if (!text) {
  console.error('错误:请提供要编码的文本');
  process.exit(1);
}

if (!options.terminal && !options.output) {
  console.error('错误:请指定 --terminal 或 --output 选项');
  process.exit(1);
}

async function main() {
  if (options.terminal) {
    console.log(`\n📱 编码内容: ${text}\n`);
    const ascii = await QRCode.toString(text, {
      type: 'terminal',
      small: true,
    });
    console.log(ascii);
    console.log('✅ 扫描上方二维码即可查看内容\n');
  }

  if (options.output) {
    const size = parseInt(options.size, 10);
    if (isNaN(size) || size < 64 || size > 4096) {
      console.error('错误:尺寸必须在 64-4096 之间');
      process.exit(1);
    }
    await QRCode.toFile(options.output, text, {
      width: size,
      margin: 2,
      color: { dark: '#000000', light: '#ffffff' },
    });
    console.log(`✅ 二维码已保存到: ${options.output} (${size}x${size})`);
  }
}

main().catch((err) => {
  console.error('生成失败:', err.message);
  process.exit(1);
});
// package.json
{
  "name": "qr-cli",
  "version": "1.0.0",
  "type": "module",
  "dependencies": {
    "commander": "^12.0.0",
    "qrcode": "^1.5.0"
  }
}

安装与使用:

npm install
node qr.mjs "https://github.com" --terminal
node qr.mjs "Hello OpenCode" -o hello.png -s 512

小结

这个二维码生成器从零到跑通,全程没有手写一行代码。整个过程就是:

描述需求 → OpenCode 搭项目骨架

指定 API → OpenCode 生成实现代码

运行测试 → OpenCode 自动验证并修复

传统开发流程里,光是翻 qrcode 和 commander 的 npm 文档、处理 ES Module 配置就要花掉十几分钟。而用 OpenCode,你只需要把注意力放在"我想实现什么"上,"怎么写"交给 AI。

这种体验就像有一个即问即答的高级工程师坐在旁边——你说需求,它写代码,你说"跑一下",它帮你测试。对于原型验证、小工具开发、日常脚本编写,效率提升非常明显。