首页 > web前端 > js教程 > 正文

如何用 JavaScript 构建漂亮的终端 UI (TUI)!

Linda Hamilton
发布: 2024-11-25 00:04:17
原创
970 人浏览过

如果您像我一样并且完全沉迷于 CLI 和终端 UI,那么这篇文章适合您!

不幸的是,没有一种原生方法可以用 JavaScript 构建漂亮的终端 UI——至少据我所知没有!这是我自己遇到的一个问题,最终导致我移植了最令人惊叹的 TUI 库之一:Lipgloss,由 Charm 的人们创建。

不相信我?看看这个:

How To Build Beautiful Terminal UIs (TUIs) in JavaScript!

很漂亮吧?

这里有一个问题:Lipgloss 是用 Go 编写的。虽然我通常使用 Go 工作,但最近我需要使用 Node.js 编写一个 Web 监控工具。我不愿意放弃我时尚、漂亮的 UI,所以我发现自己处于经典的开发者挑战模式

您知道当您深入代码时,突然出现一些意想不到的事情的神奇时刻吗?这就是我最终将 Lipgloss 的部分内容移植到 WebAssembly (Wasm) 的方式。这就是魅力诞生的方式。

什么是魅力?

Charsm 是 Charm CLI Wasm 的缩写。很酷,对吧?让我们深入探讨如何使用它在 JavaScript 中构建令人惊叹的 TUI。


入门

使用简单的 npm 命令安装 charsm:

npm install charsm
登录后复制
登录后复制

创建一个简单的表

首先,导入 charsm 并在脚本中初始化它:

import { initLip, Lipgloss } from "charsm";

(async function () {
  const ini = await initLip();
})();
登录后复制
登录后复制

initLip 函数加载 Wasm 文件,为渲染做好一切准备。让我们尝试打印一个表格:

const rows = [
  ["Chinese", "您好", "你好"],
  ["Japanese", "こんにちは", "やあ"],
  ["Arabic", "أهلين", "أهلا"],
  ["Russian", "Здравствуйте", "Привет"],
  ["Spanish", "Hola", "¿Qué tal?"],
];

const tabledata = { 
  headers: ["LANGUAGE", "FORMAL", "INFORMAL"], 
  rows: rows 
};

(async function () {
  const ini = await initLip();
  const lip = new Lipgloss();

  const table = lip.newTable({
    data: tabledata,
    table: { border: "rounded", color: "99", width: 100 },
    header: { color: "212", bold: true },
    rows: { even: { color: "246" } },
  });

  console.log(table);
})();
登录后复制
登录后复制

我们还可以使用十六进制代码来表示颜色(查看结尾中完整示例的链接)

结果:

How To Build Beautiful Terminal UIs (TUIs) in JavaScript!

简单吧?现在,让我们继续渲染列表。


渲染列表

目前,我们可以渲染一个简单的列表。其工作原理如下:

const subtle = { Light: "#D9DCCF", Dark: "#383838" };
const special = { Light: "#43BF6D", Dark: "#73F59F" };

const list = lip.List({
  data: ["Grapefruit", "Yuzu", "Citron", "Pomelo", "Kumquat"],
  selected: [],
  listStyle: "alphabet",
  styles: {
    numeratorColor: special.Dark,
    itemColor: subtle.Dark,
    marginRight: 1,
  },
});
const combined = table + "\n\n" + list
console.log(combined);
登录后复制
登录后复制

How To Build Beautiful Terminal UIs (TUIs) in JavaScript!

自定义所选项目

让我们通过对所选项目使用自定义枚举器图标(例如 ✅)来让它变得更漂亮:

const customList = lip.List({
  data: ["Grapefruit", "Yuzu", "Citron", "Pomelo", "Kumquat"],
  selected: ["Grapefruit", "Yuzu"],
  listStyle: "custom",
  customEnum: "✅",
  styles: {
    numeratorColor: special.Dark,
    itemColor: subtle.Dark,
    marginRight: 1,
  },
});

console.log(customList);
登录后复制
登录后复制

所选项目将显示 ✅ 图标。

How To Build Beautiful Terminal UIs (TUIs) in JavaScript!


渲染 Markdown

Charsm 包装了 Charm 中的 Glamour 库来处理 Markdown 渲染:

npm install charsm
登录后复制
登录后复制

定制风格

将 charsm 中的样式视为终端的 CSS。您可以按照以下步骤创建自己的风格:

import { initLip, Lipgloss } from "charsm";

(async function () {
  const ini = await initLip();
})();
登录后复制
登录后复制

将此样式应用于文本:

const rows = [
  ["Chinese", "您好", "你好"],
  ["Japanese", "こんにちは", "やあ"],
  ["Arabic", "أهلين", "أهلا"],
  ["Russian", "Здравствуйте", "Привет"],
  ["Spanish", "Hola", "¿Qué tal?"],
];

const tabledata = { 
  headers: ["LANGUAGE", "FORMAL", "INFORMAL"], 
  rows: rows 
};

(async function () {
  const ini = await initLip();
  const lip = new Lipgloss();

  const table = lip.newTable({
    data: tabledata,
    table: { border: "rounded", color: "99", width: 100 },
    header: { color: "212", bold: true },
    rows: { even: { color: "246" } },
  });

  console.log(table);
})();
登录后复制
登录后复制

请参阅 github 上的自述文件以获取更多选项或更好的选项,但这里是一个“完整”示例

想要布局吗? Charsm 支持简单的类似 Flex 的布局:

const subtle = { Light: "#D9DCCF", Dark: "#383838" };
const special = { Light: "#43BF6D", Dark: "#73F59F" };

const list = lip.List({
  data: ["Grapefruit", "Yuzu", "Citron", "Pomelo", "Kumquat"],
  selected: [],
  listStyle: "alphabet",
  styles: {
    numeratorColor: special.Dark,
    itemColor: subtle.Dark,
    marginRight: 1,
  },
});
const combined = table + "\n\n" + list
console.log(combined);
登录后复制
登录后复制

总结

这就是你得到的!使用 charsm,您可以渲染表格、列表、Markdown,甚至创建自定义样式 - 所有这些都在终端内进行,顺便说一下,您可以环绕列表或 Markdown,因为它是文本

const customList = lip.List({
  data: ["Grapefruit", "Yuzu", "Citron", "Pomelo", "Kumquat"],
  selected: ["Grapefruit", "Yuzu"],
  listStyle: "custom",
  customEnum: "✅",
  styles: {
    numeratorColor: special.Dark,
    itemColor: subtle.Dark,
    marginRight: 1,
  },
});

console.log(customList);
登录后复制
登录后复制

表格和列表将被边框包裹,并带有填充和边距!

How To Build Beautiful Terminal UIs (TUIs) in JavaScript!

这只是开始。我将很快添加交互式组件(如表单),敬请期待。享受在 JavaScript 中尝试和构建自己漂亮的终端 UI 的乐趣!

干杯!

以上是如何用 JavaScript 构建漂亮的终端 UI (TUI)!的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板