查看: 66|回复: 0

Node.js常用命令与npm脚本调试及pm2进程管理实践

[复制链接]
发表于 半小时前 | 显示全部楼层 |阅读模式
Node.js 的命令行能力大致可以分成几类:直接执行脚本、初始化项目和管理依赖、通过 npm scripts 组织构建与测试、启动调试器、用 pm2 管理长期进程,以及在脚本中调用 fs 模块完成文件操作。下面按实际开发顺序梳理原文给出的命令、参数和代码,重点说明调用方式、适用场景和容易混淆的依赖字段。原文目录中虽有 http 模块和性能分析命令的标题,但正文没有给出可落地的代码或参数,本文不补造这部分内容。

一、直接运行 JavaScript 文件与临时表达式

node 命令用于执行 JavaScript 文件。例如准备一个 hello.js,内容如下:
  1. console.log('Hello, Node.js!');
复制代码

进入该文件所在目录后执行 node hello.js,控制台会输出 Hello, Node.js!。这是 Node.js 最基本的运行方式,让 JavaScript 可以脱离浏览器,在服务器端或命令行中执行脚本。

如果只是快速验证一段表达式,不想创建文件,可以使用 node -e 或 node --eval。命令后面直接跟一段 JavaScript 代码即可:
  1. node -e "console.log('This is a one-line script.')"
复制代码

执行后控制台输出 This is a one-line script.。这种形式适合即时测试简单表达式或代码片段;逻辑复杂时仍应写入文件,便于维护、复用和调试。

二、初始化项目与依赖管理

npm init 用于在当前目录创建 package.json,这是 Node.js 项目的核心配置文件。执行后命令行会引导填写项目名称、版本、描述、入口文件、测试命令、仓库地址、关键词、作者、许可证等信息,最终写入 package.json。这个文件后续会参与依赖管理、项目发布和团队共享。

package.json 中的 scripts 字段可以直接组织项目任务。原文给出的示例如下:
  1. {
  2.   "name": "my-node-project",
  3.   "version": "1.0.0",
  4.   "scripts": {
  5.     "start": "node index.js",
  6.     "build": "webpack --config webpack.config.js",
  7.     "test": "mocha tests/*.js",
  8.     "lint": "eslint src/*.js"
  9.   }
  10. }
复制代码

npm install 用于安装依赖包,常见有三种用法。安装单个依赖包时执行 npm install package-name,例如 npm install express,会把 express 及其依赖安装到 node_modules,并将依赖信息记录到 dependencies 字段;原文指出 --save 是默认行为。安装开发依赖时使用 npm install package-name --save-dev,例如 npm install mocha --save-dev,依赖会写入 devDependencies,生产环境不会安装这些仅开发阶段需要的包。全局安装使用 npm install package-name -g,例如 npm install nodemon -g,安装后可在任意目录使用对应命令行工具,适合 nodemon、typescript 编译器这类全局命令。

npm uninstall 用于卸载依赖,用法与安装对应。npm uninstall package-name 会从 node_modules 移除包,并从 dependencies 删除依赖信息;npm uninstall package-name --save-dev 用于卸载开发依赖,例如 npm uninstall eslint --save-dev 会从 devDependencies 删除 eslint 信息。

npm update 会在 package.json 指定的版本范围内检查并升级可更新的依赖,同时更新 package-lock.json(如果存在),以记录具体版本。原文强调更新有助于获取新特性和修复漏洞,但要注意版本兼容性,避免依赖升级后项目异常。

npm list 用于查看已安装依赖及其依赖关系树,输出中会以树形结构展示直接依赖和间接依赖的名称、版本和层级。排查依赖冲突、确认某个包由谁引入时,这个命令很实用。

npm view 用于查看远程包信息,不需要先安装。例如 npm view axios 会输出 axios 的版本、许可证、依赖、engines、关键词和维护者等信息。原文示例中显示 axios@0.21.1、MIT 许可证、deps: none、versions: 58,依赖项包含 follow-redirects: ^1.14.0,engines 中 node 为 >= 10。安装前先查看这些信息,有助于判断包是否符合项目技术栈和运行环境。

三、用 npm scripts 启动项目和执行任务

npm start 用于启动项目主脚本,它读取 package.json 中 scripts.start 的配置。例如 scripts 中配置 "start": "node index.js",执行 npm start 就等价于执行 node index.js。这样团队可以遵循统一的启动方式,不必记忆每个项目的入口命令。

npm run 用于执行 scripts 下的自定义脚本。例如 npm run build 执行构建命令,npm run test 执行测试命令,npm run lint 执行代码检查。原文示例中 build 使用 webpack,test 使用 mocha,lint 使用 eslint。把构建、测试和检查任务脚本化后,项目流程更统一,也便于在本地和持续集成环境中复用。

四、启动 Node.js 调试器

node --inspect 用于启动 Node.js 进程并开启调试能力。执行 node --inspect index.js 后会输出调试 URL,将其在 Chrome 浏览器开发者工具中打开,就可以进行断点调试、查看变量值和调用栈,适合排查运行中的逻辑问题。

node --inspect-brk 与 node --inspect 类似,区别是它会在代码第一行暂停,等待调试器连接。需要在程序启动阶段设置断点、检查初始状态时,应使用 --inspect-brk,避免错过启动阶段的执行过程。

五、用 pm2 管理长期运行的 Node.js 进程

pm2 start 用于启动 Node.js 应用并作为守护进程在后台运行。例如 pm2 start app.js 启动后,即使关闭终端,应用仍可继续运行。原文将这种方式用于需要长期稳定运行的服务,并提到应用崩溃后的自动重启能力。

pm2 start 还支持启动选项。例如 pm2 start app.js --name my-app -i 4 会以 my-app 为名称启动 4 个 app.js 实例,形成集群模式,以利用多核 CPU,适合高并发请求场景。

pm2 stop 用于停止应用进程。例如 pm2 stop my-app 会停止名为 my-app 的应用实例,适合更新、维护或临时下线。pm2 restart 用于重启应用,例如 pm2 restart my-app,它会先停止现有进程再重新启动,常用于代码更新后快速应用新版本。

pm2 list 用于列出 pm2 管理的应用及其状态,输出包含应用名称、进程 ID、运行状态、CPU 和内存使用情况等信息。原文示例表格中还有 id、namespace、version、mode、uptime、重启次数、user、watching 等字段。通过它可快速观察各应用资源占用和运行状态,及时发现内存泄漏或 CPU 负载异常。

pm2 logs 用于查看 pm2 管理应用的日志输出,例如 pm2 logs my-app 会实时显示该应用的启动信息、错误信息和运行过程中的打印内容,便于定位问题。原文还提到可按时间范围或特定进程查看日志,但未给出具体参数,实际使用时应结合对应版本文档确认。

六、在脚本中调用 fs 模块操作文件

fs 是 Node.js 的文件系统核心模块。它不是独立命令行命令,但通过 Node.js 脚本可以实现文件读取、写入和目录操作。读取文件示例:
  1. const fs = require('fs');
  2. fs.readFile('example.txt', 'utf8', (err, data) => {
  3.   if (err) throw err;
  4.   console.log(data);
  5. });
复制代码

这段代码使用 fs.readFile 读取 example.txt,并以 UTF-8 编码输出内容,适合读取配置文件、解析数据文件等场景。

写入文件示例:
  1. const fs = require('fs');
  2. const content = 'This is some new content to write to the file.';
  3. fs.writeFile('example.txt', content, (err) => {
  4.   if (err) throw err;
  5.   console.log('File has been written successfully.');
  6. });
复制代码

fs.writeFile 会把内容写入 example.txt;文件不存在时创建,已存在时覆盖原内容。它可用于记录日志、保存应用状态或生成文件。

目录操作示例:
  1. const fs = require('fs');
  2. fs.mkdir('new-directory', (err) => {
  3.   if (err) throw err;
  4.   console.log('Directory created successfully.');
  5. });
  6. fs.readdir('.', (err, files) => {
  7.   if (err) throw err;
  8.   console.log('Files in the current directory:', files);
  9. });
复制代码

fs.mkdir 创建目录,fs.readdir 读取当前目录下的文件和目录列表。上述代码都通过回调中的 err 判断错误,实际脚本中应保留错误处理,避免文件或目录异常时难以定位。

七、实践中的使用顺序与注意点

日常开发可以按“npm init 建项目、npm install 区分生产与开发依赖、npm scripts 统一启动和任务、node --inspect 或 --inspect-brk 调试、pm2 守护长期进程、pm2 logs 排查运行日志、fs 脚本处理文件”的顺序组织。依赖层面要区分 dependencies 和 devDependencies,避免把测试、格式化工具误装入生产依赖;执行 npm update 时关注版本兼容性;出现依赖冲突时用 npm list 查看依赖树,安装前可用 npm view 了解远程包信息。进程层面可用 pm2 list 观察 CPU、内存和状态,用 pm2 logs 查看实时输出。文件操作则应在回调中处理 err,并根据场景选择 readFile、writeFile、mkdir 或 readdir。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-27 15:49 , Processed in 0.025359 second(s), 28 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部