node.js命令使用教程:新手完成第一张作品的方法

站长资讯13小时前发布 jdkjadmin
0 00
node.js命令使用教程:新手完成第一张作品的方法

node.js命令使用教程:新手完成第一张作品的方法

Node.js 不只是运行服务器的工具。它也能在命令行中执行 JavaScript,让你用一段程序生成文件、处理数据或自动完成重复任务。本文从检查环境开始,带你编写一个无需安装第三方依赖的 Node.js 小程序,生成一张可在浏览器中打开的 SVG 几何海报。

这里的“作品”是一份真正写到磁盘上的矢量图文件。你可以打开、修改,也可以把它用于练习或继续设计。需要先说明:Node.js 本身不会替你生成 AI 图片;本文演示的是用代码绘制基础图形,适合入门命令行、学习文件输出和制作简单图案。

一、Node.js 命令适合做什么

Node.js 命令常用于运行 JavaScript 脚本,例如批量整理文件、生成 SVG 或 JSON、处理文本、启动本地开发工具。相较于在浏览器控制台里执行代码,命令行脚本可以读取命令行参数,并通过 Node.js 提供的模块访问文件系统等功能。

本文会用到两个内置模块:node:fs 用于写文件,node:path 用于处理文件名。它们随 Node.js 一起提供,不需要先执行 npm install。如果只是生成这张海报,也不需要搭建服务器、安装框架或注册账号。

二、检查 Node.js 是否可用

打开终端。在 Windows 上可以使用 PowerShell 或 Windows Terminal;在 macOS 上可以使用“终端”;Linux 用户可使用常见的终端程序。输入:

node --version

如果输出类似 v22.14.0,说明系统找到了 Node.js。具体版本会因安装时间和发行版而异,不必追求与示例完全相同。再检查 npm 是否可用:

npm --version

npm 通常与 Node.js 一起安装,是管理 JavaScript 软件包的工具。本文不依赖 npm,所以只要 node --version 能正常返回版本号,就可以继续。

如果提示找不到 node,通常是尚未安装 Node.js,或安装目录没有加入系统的 PATH 环境变量。请从 Node.js 官方网站选择适合操作系统的安装包,完成安装后关闭并重新打开终端,再执行检查命令。不要把网上来源不明的可执行文件随意加入 PATH。

三、认识最常用的 Node.js 命令

1. 直接运行一段 JavaScript

在终端输入 node 并按回车,可以进入交互式环境(REPL)。输入一条 JavaScript 表达式后,Node.js 会返回结果:

node
1 + 2
console.log("你好,Node.js")
.exit

.exit 是 REPL 的退出命令。它不是 JavaScript 语句,不能写进普通的 .js 文件里。初学者也可以通过 Ctrl+C 结束当前交互过程。

2. 运行脚本文件

把代码保存为 hello.js 后,在该文件所在目录运行:

node hello.js

Node.js 会执行这个文件中的 JavaScript。文件名和路径要与实际位置一致。如果终端当前目录不对,命令可能会报告找不到文件;可以先用 cd 切换目录,也可以把脚本的完整路径传给 node。

3. 查看帮助与检查语法

想确认当前 Node.js 支持哪些命令行选项,可运行:

node --help

下面的命令会检查脚本语法,但不会执行脚本:

node --check hello.js

有些选项会因 Node.js 版本而异。遇到“未知选项”时,应以本机 node --help 和对应版本的官方文档为准,而不是假定每台机器的命令完全一致。

四、创建项目目录和脚本

新建一个文件夹,例如 node-first-artwork,并在终端切换到这个目录。以下命令在 macOS、Linux 和常见的 Windows PowerShell 中均可使用:

mkdir node-first-artwork
cd node-first-artwork

使用你习惯的文本编辑器,在该文件夹里创建 artwork.cjs。这里选用 .cjs 扩展名,是为了明确使用 CommonJS 模块写法,避免项目配置为 ES module 时产生模块格式上的困惑。把下面的代码完整复制进去并保存。

const fs = require('node:fs');
const path = require('node:path');

const args = process.argv.slice(2);
const title = args[0] || '我的第一张作品';
const outputName = args[1] || 'first-artwork.svg';

function escapeXml(value) {
  return String(value)
    .replaceAll('&', '&')
    .replaceAll('<', '&lt;')
    .replaceAll('>', '&gt;')
    .replaceAll('"', '&quot;')
    .replaceAll("'", '&apos;');
}

if (args.length > 2) {
  console.error('用法:node artwork.cjs [标题] [输出文件名.svg]');
  process.exitCode = 1;
} else if (
  !outputName.endsWith('.svg') ||
  outputName.includes('/') ||
  outputName.includes('\\') ||
  outputName === '.' ||
  outputName === '..'
) {
  console.error('输出文件名必须是当前目录中的 .svg 文件名,不能包含路径。');
  process.exitCode = 1;
} else {
  const safeTitle = escapeXml(title);

  const svg = `<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600" viewBox="0 0 900 600" role="img" aria-labelledby="title desc">
  <title id="title">${safeTitle}</title>
  <desc id="desc">由 Node.js 生成的彩色几何海报</desc>
  <rect width="900" height="600" fill="#101827"/>
  <circle cx="700" cy="180" r="105" fill="#f6bd60"/>
  <path d="M0 430 L260 190 L510 430 Z" fill="#4ecdc4"/>
  <path d="M300 430 L580 150 L900 430 Z" fill="#6c63ff"/>
  <path d="M0 470 Q220 410 450 480 T900 460 V600 H0 Z" fill="#253b5b"/>
  <text x="64" y="530" fill="#ffffff" font-size="32" font-family="sans-serif">${safeTitle}</text>
</svg>
`;

  const outputPath = path.join(process.cwd(), outputName);

  try {
    fs.writeFileSync(outputPath, svg, { encoding: 'utf8', flag: 'wx' });
    console.log(`作品已生成:${outputPath}`);
  } catch (error) {
    if (error.code === 'EEXIST') {
      console.error('目标文件已存在。请换一个文件名,避免覆盖已有作品。');
    } else {
      console.error(`写入失败:${error.message}`);
    }
    process.exitCode = 1;
  }
}

五、运行程序,打开第一张作品

确认终端仍位于项目目录,然后执行:

node artwork.cjs

正常情况下,终端会显示生成文件的路径,目录中也会出现 first-artwork.svg。SVG 是一种基于文本描述的矢量图格式,浏览器通常可以直接打开。你可以在文件管理器中双击它,或把文件拖进浏览器窗口查看海报。

这段程序从 process.argv 读取命令行参数。Node.js 会把启动命令及其参数放进这个数组;前两个元素通常与 Node.js 可执行文件和脚本路径有关,所以示例使用 slice(2) 取得脚本参数。传入标题和输出文件名的例子:

node artwork.cjs "海边的日落" sunset.svg

命令执行后会生成 sunset.svg,图中文字会显示“海边的日落”。标题有空格时,建议用引号括起来。Windows PowerShell、macOS 和 Linux 的引号与转义细节可能有所不同;如果参数带有引号、美元符号或反斜线等特殊字符,按当前终端的规则处理,并在运行后检查实际输出。

六、读懂程序中几个关键部分

命令行参数不是自动可信的

示例允许两个可选参数:标题和输出文件名。代码用 args.length > 2 拒绝额外参数;如果用户没有提供标题或文件名,则使用默认值。它也检查输出名必须以 .svg 结尾,并拒绝包含斜线的路径,这样输出目标限定在当前工作目录中。

不过,这只是针对这个小程序的输入校验,并不代表所有用户输入都安全,也不是通用文件访问控制方案。比如程序运行的当前目录本身仍可能是一个不该写入的目录;文件权限也由操作系统和当前账户决定。如果要将脚本用于多人共享的服务、自动化流水线或处理不可信输入,需要根据实际威胁进一步限制输入、目录和权限。

为什么要转义标题

SVG 文档使用 XML 标记。标题如果包含 &、<、引号等字符,直接拼进文档可能破坏 XML 结构。escapeXml 会把这些字符转换为相应实体,使标题作为文本写入,而不是被当成标记解释。

这项处理有明确范围:它针对本示例将字符串插入 SVG 文本节点的场景。它不等于 HTML 清理器,也不能用来安全地把任意内容塞进属性、脚本、CSS 或 URL。修改 SVG 模板时,如果增加新的插入位置,应重新判断该位置所需的编码方式。

为什么使用 flag: 'wx'

writeFileSync 会将内容写入指定文件;选项中的 encoding: 'utf8' 指定文本编码,flag: 'wx' 表示以排他方式创建文件:目标已存在时,不覆盖原文件,而是报错。这样可以降低不小心覆盖已有作品的风险。

如果确实要覆盖文件,可以先备份或换一个新文件名,再有意识地调整写入方式。不要为了消除报错就盲目删掉文件,也不要把“防止覆盖”误认为对抗恶意程序的完整安全机制。

七、常见错误与排查方法

1. 提示找不到 node 命令

先关闭并重新打开终端,再运行 node --version。如果仍然失败,检查 Node.js 是否安装成功以及 PATH 是否包含安装目录。不要把 npm 和 node 混为一谈:npm 管理软件包,运行这个脚本使用的是 node 命令。

2. 提示找不到脚本文件

运行 pwd(macOS、Linux)或 PowerShell 中的 Get-Location 查看当前目录,确认 artwork.cjs 就在该目录。也可以先执行 cd 进入正确文件夹。注意文件扩展名:编辑器有时会把文件保存成 artwork.cjs.txt,而不是 artwork.cjs。

3. 显示目标文件已存在

程序使用了防覆盖选项。如果目录里已经有同名 SVG,换一个输出名再运行即可:

node artwork.cjs "新的海报" second-artwork.svg

4. 标题乱码或参数没有按预期传入

确认源文件以 UTF-8 保存,并检查命令中标题的引号是否成对。若从脚本或其他程序启动 Node.js,调用方对参数的拆分方式也会影响 process.argv 内容。可以临时在程序中打印参数检查:

console.log(process.argv.slice(2));

调试完成后,应移除这条输出或只在需要时保留,避免把不适合公开的参数写进日志。

5. 复制代码后出现语法错误

检查是否漏掉反引号、括号或分号,也要确认多行 SVG 字符串使用的是反引号,而不是普通单引号。可以先运行:

node --check artwork.cjs

如果报错行号指向字符串内部,先检查字符串开头和结尾;如果报错指向 require,确认文件名是 .cjs 且代码没有被误粘贴进 HTML 文件。

八、适用范围、参数限制与安全边界

这个练习适合学习 Node.js 的基本命令、参数读取、字符串拼接和文件写入,也适合生成结构简单、样式固定的 SVG。它不能代替专业图形编辑器,也不会自动提供复杂排版、字体嵌入、照片编辑或 AI 生成能力。复杂作品可能需要专门的绘图库、设计软件或其他生成服务。

代码没有设置自定义的标题长度上限,也没有设置操作系统层面的命令行参数上限。实际可传入的命令长度会受到终端、操作系统和启动方式等因素影响,不能把某个固定数字当作所有环境通用的 Node.js 限制。对交互式脚本而言,合理做法是按业务需要为输入长度设限,而不是依赖系统恰好拒绝超长输入。

本程序只把一个受检查的文件名拼入当前工作目录,并使用同步写入。同步写入对这个很小的单文件练习足够直观,但在需要高并发或处理大型文件的程序中,阻塞式操作可能影响性能,应考虑异步文件 API。示例不创建子目录、不联网、不执行外部命令,也不需要管理员权限。

运行 Node.js 程序时,代码会以当前账户的权限执行。Node.js 不是沙箱:不要为了“看看效果”就运行来源不明的脚本、安装来路不明的软件包,或把未经审查的代码以管理员身份启动。Node.js 的一些版本提供额外权限控制选项,但可用能力与适用条件依版本而异;它们也不能替代代码审查、操作系统权限和安全隔离。

同样,不要把用户输入直接拼接进 child_process.exec 之类的命令字符串。本文没有调用 shell,也没有执行用户提供的命令。如果以后需要启动其他程序,应优先使用适当的参数数组接口,并对参数和目标程序进行明确校验;这仍不意味着可以安全执行任意不可信程序。

九、尝试修改,让作品变成自己的

可以先从改变颜色入手:在代码中找到 fill="#101827" 等属性,把十六进制颜色值换成自己喜欢的颜色。调整 circle 元素中的圆心坐标和半径,可以改变太阳的位置与大小;调整 path 的路径数据,可以尝试不同的山形。每次保存后重新运行程序,并使用新的文件名,保留不同版本。

也可以在 SVG 字符串中增加一个基础形状,例如矩形:

<rect x="80" y="80" width="120" height="70" rx="12" fill="#ff6b6b"/>

把这行插入 SVG 的元素区域,保存后再次运行。SVG 的元素顺序会影响绘制层级:后出现的图形通常绘制在先出现的图形上方。若新形状被遮住,可以调整它在文档中的位置。

最后回顾完整流程:终端运行 node --version 检查环境;用编辑器保存 .cjs 脚本;通过 node artwork.cjs 执行;在文件夹中找到 SVG 并用浏览器打开。掌握这几步之后,你就能把 Node.js 命令用在更多小任务上,并逐步把简单脚本扩展成自己的工具。

© 版权声明

相关文章