全局安装的Node.js命令行应用如何读取自身目录下的文件
正确读取CLI包内文件的方案
问题的核心是:Node.js中用./开头的相对路径,默认是相对于进程当前工作目录(process.cwd(),也就是用户执行命令的目录)进行寻址,而非你的CLI包的安装目录,你需要通过绝对路径指向包内的目标文件,具体实现分两种场景:
场景1:使用CommonJS模块规范(默认情况,package.json未配置"type": "module")
Node.js 内置的__dirname变量会返回当前执行的JS文件所在目录的绝对路径,结合path模块拼接出目标文件的绝对路径即可:
- 引入依赖的内置模块
const path = require('path'); const fs = require('fs');
- 替换原有读取逻辑
// 拼接得到tailwind.css文件的绝对路径 const targetPath = path.join(__dirname, './helpers/tailwind.css'); fs.readFile(targetPath, (err, css) => { // 原有业务逻辑 })
不要直接用字符串拼接路径,不同操作系统的路径分隔符存在差异,
path.join会自动做跨系统兼容处理。
场景2:使用ES Module规范(package.json配置了"type": "module")
ESM规范下没有内置的__dirname变量,需要通过import.meta.url转换得到当前文件所在目录的路径:
import path from 'path'; import fs from 'fs/promises'; import { fileURLToPath } from 'url'; // 转换得到当前文件的绝对路径 const __filename = fileURLToPath(import.meta.url); // 提取当前文件所在目录的绝对路径 const __dirname = path.dirname(__filename); const targetPath = path.join(__dirname, './helpers/tailwind.css'); // 读取文件 const css = await fs.readFile(targetPath, 'utf-8');
内容的提问来源于stack exchange,提问作者Marc Rasmussen
相关产品推荐
相关产品推荐

