概述
我的 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 <string> | <Buffer> | <URL> | <integer> 文件名或文件描述符
options <Object> | <string>
encoding <string> | <null> 默认值: null
flag <string> 请参阅对文件系统 flags 的支持。 默认值: 'r'。
返回: <string> | <Buffer>
返回 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的值
至此问题得到解决。
最后
以上就是狂野荷花为你收集整理的nodejs 中读取 package.json 文件内容的全部内容,希望文章能够帮你解决nodejs 中读取 package.json 文件内容所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复