nodejs 中读取 package.json 文件内容

我的 node 版本为v14.17.4 系统版本为macos bigsur 11.6 在准备发布一个自己配置的 cli 项目时遇到了一个问题,就是当我使用common.js规范引入node_modules文件

const program = require("commander");
const download = require("download-git-repo");
const inquirer = require("inquirer");
const ora = require("ora");
const chalk = require("chalk");
const packageData = require("./package.json");
const fs = require("fs");
const path = require("path");

执行命令 test -V, 结果控制台报了一个错

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/Users/xxx//package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
    at file:///Users/xxx/cli-demo/index.js:4:17
    at ModuleJob.run (internal/modules/esm/module_job.js:170:25)
    at async Loader.import (internal/modules/esm/loader.js:178:24)
    at async Object.loadESM (internal/process/esm_loader.js:68:5)

根据报错提示,我进行了修改,在package.json 文件里添加了 "type": "module"这个配置项,并把node_modules 的引入改成了

import program from "commander";
import download from "download-git-repo";
import inquirer from "inquirer";
import ora from "ora";
import chalk from "chalk";
import packageJson from "./package.json";
import fs from "fs";
import path from "path";

但是新的问题又出现了,报了下面这个错

internal/process/esm_loader.js:74
    internalBinding('errors').triggerUncaughtException(
                              ^

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".json" for /Users/lixue/code_boy/vue_product/cli-demo/package.json
    at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:71:15)
    at Loader.getFormat (internal/modules/esm/loader.js:105:42)
    at Loader.getModuleJob (internal/modules/esm/loader.js:243:31)
    at async ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:75:21)
    at async Promise.all (index 5)
    at async link (internal/modules/esm/module_job.js:80:9) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}

大概意思就是说没有识别出我这样引入的的 package.json 文件。去查阅了一下 nodejs 文档内 fs.directory 这个api的使用方法,文档说明如下

fs.readFileSync(path[, options])

path  |  |  |  文件名或文件描述符
options  | 
encoding  |  默认值: null
flag  请参阅对文件系统 flags 的支持。 默认值: 'r'。
返回:  | 
返回 path 的内容。

有关详细信息,请参阅此 API 的异步版本的文档:fs.readFile()。

如果指定了 encoding 选项,则此函数返回字符串。 否则它返回缓冲区。

与 fs.readFile() 类似,当路径为目录时,fs.readFileSync() 的行为是特定于平台的。
 
  

可以这样引入

const packageJsonData = JSON.parse(fs.readFileSync('package.json', 'utf8'))
// 由于 fs.readFileSync 返回的是json 字符串,所以用parse转成对象形式
// 可以用 packageJsonData.name 的调用方式 获取当前 package.json 内name的值

至此问题得到解决。

你可能感兴趣的:(npm,前端,node.js,javascript,前端)