详解Node.js中Process、Path和File System模块常用 API

本篇文章给大家介绍一下nodejs中process、path和file system模块常用 api。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

详解Node.js中Process、Path和File System模块常用 API

相关推荐:《nodejs 教程》

在日常使用 Node 进行开发的时候,会使用到一些文件系统、路径操作等基础 API,这里整理一下,方便大家理解和直接使用。

这里只介绍最常用的那些,不是所有哈,想要看更全的,直接看官方文档就 OK。

尽量不废话,多上代码。

Process 模块

先介绍 process 模块,它提供了当前 Node 进程相关的全局环境信息。在后面的 API 中被用到。

// 内置模块,直接使用const process = require('process');

登录后复制

process.cwd()

这是一个函数,返回当前 Node 进程执行的目录,举例一个常见的场景:

一个 Node 模块 A 通过 NPM 发布,项目 B 中使用了模块 A。在 A 中需要操作 B 项目下的文件时,就可以用 process.cwd() 来获取 B 项目的路径。

const cwd = process.cwd(); // 输出:/Users/xiaolian/Code/node-api-test

登录后复制

process.argv

在终端通过 Node 执行命令的时候,通过 process.argv 可以获取传入的命令行参数,返回值是一个数组:

0: Node 路径(一般用不到,直接忽略)1: 被执行的 JS 文件路径(一般用不到,直接忽略)2~n: 真实传入命令的参数**

所以,我们只要从 process.argv[2] 开始获取就好了。一般都是这样用

const args = process.argv.slice(2);

登录后复制

直接获取我们想要的参数。

process.env

返回一个对象,存储当前环境相关的所有信息,一般很少直接用到。

一般我们会在 process.env 上挂载一些变量标识当前的环境。比如最常见的用 process.env.NODE_ENV 区分 development 和 production。在 vue-cli 的源码中也经常会看到 process.env.VUE_CLI_DEBUG 标识当前是不是一 DEBUG 模式。

这里提一个 webpack 的插件 DefinePlugin,在日常的构建流程中,我们经常会通过这个插件来注入不同的全局变量,从而执行不同的构建流程,并且代码中的 process.env.xxx 会被替换成具体的值,在 Terser 压缩阶段会将 deadCode 移除,优化代码体积。

process.platform

这个用的不多,返回当前系统信息,枚举值如下:

console.log(process.platform);// 'aix'// 'darwin'  - macOS// 'freebsd'// 'linux' - linux// 'openbsd'// 'sunos'// 'win32' - windows

登录后复制

Path 模块

// 内置模块,直接使用const path = require('path');

登录后复制

Node 中几乎路径相关的操作都会使用这个模块。

这里就说 5 个最常用的:

path.join(…paths)

path.join 作用是将传入的多个路径拼成一个完整的路径。

const dPath = path.join('template', 'aaa', 'bbb', 'ccc', 'd.js');// 输出: template/aaa/bbb/ccc/d.js

登录后复制

来看一个非常常见的场景,我们需要获取当前项目的 package.json 文件,就可以这样获取它的路径:

const pkgPath = path.join(process.cwd(), './package.json');// 输出: /Users/xiaolian/Code/node-api-test/package.json

登录后复制

path.join 可以传入任意个路径,比如:

['package.json', 'README.md'].forEach(fileName => {  const templateFilePath = path.join(process.cwd(), 'template', fileName);  console.log(templateFilePath);});// 输出: /Users/xiaolian/Code/node-api-test/template/package.json// 输出: /Users/xiaolian/Code/node-api-test/template/README.md

登录后复制

path.resolve(…paths)

path.resovle 和 path.join 的区别在于它的作用是将传入的多个路径和当前执行路径拼接成一个完整的绝对路径。

假设我现在 index.js 在 scripts 目录下,然后我在根目录下执行 node scripts/index.js,它的代码如下:

const dPath = path.resolve('aaa', 'bbb', 'ccc', 'd.js');// 输出:  /Users/xiaolian/Code/node-api-test/aaa/bbb/ccc/d.js

登录后复制

一般情况下,当 path.resolve 的第一个参数为 ./ 时,可以直接理解和 path.join(processs.cwd(), ”) 表现一致。

path.basename(path[, ext])

path.basename 返回指定 path 最后一个路径名,其中第二个参数 ext 可选,表示文件扩展名。比如:

console.log(path.basename('scripts/index.js'));  // index.jsconsole.log(path.basename('scripts/index.js', '.js'));  // 匹配到 .js,返回 indexconsole.log(path.basename('scripts/index.js', '.json'));  // 没匹配到,返回 index.js

登录后复制

path.dirname(path)

和 path.basename 对应,返回指定 path 最后一个路径名之前的路径。比如:

console.log(path.basename('scripts/index.js'));  // scriptsconsole.log(path.basename('scripts/hook/index.js'));  // scripts/hook

登录后复制

path.extname(path)

和 path.basename 对应,返回指定 path 最后一个路径名的文件扩展名(含小数点 .)。比如:

console.log(path.basename('scripts/index.js'));  // .jsconsole.log(path.basename('README.md'));  // .md

登录后复制

对比

最后再来对比一下各个路径相关的 API 的区别。

项目 A 的目录结构如下:

├── scripts│   └── index.js├── src│   └── index.js├── package.json├── README.md

登录后复制

scripts/index.js 的代码如下:

const path = require('path');console.log(path.join('package.json'));console.log(path.resolve('package.json'));console.log(path.join('src', 'index.js'));console.log(path.resolve('src', 'index.js'));console.log(path.join(process.cwd(), 'package.json'));console.log(path.resolve('./', 'package.json'));console.log(__filename);console.log(__dirname);

登录后复制

然后,我们在项目 A 的跟目录下执行 node scripts/index.js,结果如下:

-> node scripts/index.jspackage.json/Users/xiaolian/Code/A/package.jsonsrc/index.js/Users/xiaolian/Code/A/src/index.js/Users/xiaolian/Code/A/package.json/Users/xiaolian/Code/A/package.json/Users/xiaolian/Code/A/scripts/index.js/Users/xiaolian/Code/A/scripts

登录后复制

品,仔细品,它们有什么区别。

个人而言,一般还是习惯用 path.join(process.cwd(), ‘xxx’)。

File System 模块

// 内置模块,直接使用const fs = require('fs');

登录后复制

文件系统相关操作的模块,除了 fs 之外,我们还经常用到 fs-extra,后面会介绍。

这个模块在平时的 Node 开发中会被大量使用,这里简单列几个,其它的还是看文档哈:nodejs.org/dist/latest…

fs 模块的 API 默认都是异步回调的形式,如果你想使用同步的方法,有两种解决方法:

使用 Node 提供的同步 API:xxxSync,也就是在 API 的后面加一个 Sync 后缀,它就是一个同步方法了(具体还是需要查文档哈,是否有提供同步 API)包装成一个 Promise 使用

fs.stat(path[, options], callback)

fs.stat() 返回一个文件或者目录的信息。

const fs = require('fs');fs.stat('a.js', function(err, stats) {  console.log(stats);});

登录后复制

其中包含的参数有很多,介绍几个比较常用的:

export interface StatsBase {  isFile(): boolean;                 // 判断是否是一个文件  isDirectory(): boolean;            // 判断是否一个目录  size: T;                           // 大小(字节数)  atime: Date;                       // 访问时间  mtime: Date;                       // 上次文件内容修改时间  ctime: Date;                       // 上次文件状态改变时间  birthtime: Date;                   // 创建时间}

登录后复制

一般我们会使用 fs.stat 来取文件的大小,做一些判断逻辑,比如发布的时候可以检测文件大小是否符合规范。在 CLI 中,经常需要获取一个路径下的所有文件,这时候也需要使用 fs.stat 来判断是目录还是文件,如果是目录则继续递归。当然,现在也有更方便的 API 可以完成这个工作。

同步方法

const fs = require('fs');try {  const stats = fs.statSync('a.js');} catch(e) {}

登录后复制

fs.readdir(path[, options], callback)

fs.readdir(path) 获取 path 目录下的文件和目录,返回值为一个包含 file 和 directory 的数组。

假设当前目录为:

.├── a│   ├── a.js│   └── b│       └── b.js├── index.js└── package.json

登录后复制

执行以下代码:

const fs = require('fs');fs.readdir(process.cwd(), function (error, files) {  if (!error) {    console.log(files);  }});

登录后复制

返回值为:

[ 'a',  'index.js',  'package.json' ]

登录后复制

可以看到这里只返回了根目录下的文件和目录,并没有去深度遍历。所以如果需要获取所有文件名,就需要自己实现递归。

同步方法

const fs = require('fs');try {  const dirs = fs.readdirSync(process.cwd());} catch(e) {}

登录后复制

fs.readFile(path[, options], callback)

文件读取的 API,通过 fs.readFile 可以获取指定 path 的文件内容。

入参如下:

第一个参数: 文件路径第二个参数: 配置对象,包括 encoding 和 flag,也可以直接传如 encoding 字符串第三个参数: 回调函数

使用方法如下:

const fs = require('fs');const path = require('path');fs.readFile(path.join(process.cwd(), 'package.json'), 'utf-8', function (  error,  content) {  if (!error) {    console.log(content);  }});

登录后复制

如果没传 encoding,则其默认值为 null,此时返回的文件内容为 Buffer 格式。

同步方法

const fs = require('fs');try {  fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8');} catch(e) {}

登录后复制

fs.writeFile(file, data[, options], callback)

对应着读文件 readFile,fs 也提供了写文件的 API writeFile,接收四个参数:

第一个参数: 待写入的文件路径第二个参数: 待写入的文件内容第三个参数: 配置对象,包括 encoding 和 flag,也可以直接传如 encoding 字符串第三个参数: 回调函数

使用方法如下:

const fs = require('fs');const path = require('path');fs.writeFile(  path.join(process.cwd(), 'result.js'),  'console.log("Hello World")',  function (error, content) {    console.log(error);  });

登录后复制

同步方法

const fs = require('fs');const path = require('path');try {  fs.writeFileSync(    path.join(process.cwd(), 'result.js'),    'console.log("Hello World")',    'utf-8'  );} catch (e) {}

登录后复制

本文主要是总结了一下在开发 Node 时常用的一些 API,后续的文章会带来 Node 常用的一些三方包。

更多编程相关知识,请访问:编程视频!!

以上就是详解Node.js中Process、Path和File System模块常用 API的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2715245.html

(0)
上一篇 2025年3月7日 21:42:19
下一篇 2025年3月7日 21:42:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 浅谈nodejs连接mysql数据库的方法

    本篇文章给大家介绍一下使用nodejs连接mysql数据库的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs》 1.安装mysql模块 npm install mysql 登录后复制 2.创建…

    2025年3月7日
    200
  • 深入浅析nodejs中的事件和事件循环

    本篇文章给大家讲解一下nodejs中的event,并探讨一下settimeout,setimmediate和process.nexttick的区别。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 nodejs中的事件循环 …

    2025年3月7日
    200
  • 初步了解Nodejs中的异步I/O

    本篇文章带大家初步了解下nodejs中的异步i/o。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 “异步”这个名词其实在Node之前就已经诞生了。但是在绝大多数高级编程语言中,异步并不多见。在众多高级语言或运行平台中,将…

    2025年3月7日 编程技术
    200
  • 2021年8个值得收藏的Nodejs项目

    本篇文章给大家分享8个值得收藏的nodejs项目。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 【相关推荐:《nodejs》】 转载推荐:项目无论是用于自己的应用,还是找开源项目贡献代码,这些都是不错的选择 1. Cyt…

    2025年3月7日 编程技术
    200
  • 浅谈使用nodejs设计一个秒杀系统的方法

    本篇文章给大家介绍一下使用nodejs设计一个秒杀系统的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 对于前端来说,“并发”场景很少遇到,本文将从常见的的秒杀场景,来讲讲一个真实线上的node应用遇到“并发”将会用…

    2025年3月7日
    200
  • 详解检测和升级项目中Node依赖的方法

    本篇文章给大家介绍一下检测和升级项目中node依赖的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 在现代前端开发中,一个项目往往依赖众多第三方包,多则几十个甚至过百,那么如何检测及升级这些依赖就成为了难题。【相关推…

    2025年3月7日 编程技术
    200
  • 分享一个实用Nodejs npm包:koa-csrf

    本篇文章给大家分享一个实用nodejs npm包—koa-csrf。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 koa-csrf是一个用于防止csrf攻击的koa中间件。 当然关于什么是csrf、以及如何预…

    2025年3月7日
    200
  • Windows环境下Nodejs多版本间如何切换?

    本篇文章给大家介绍一下windows环境下node多版本间进行切换的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 NodeJS多版本切换使用(Windows) 优先安装nvm版本管理工具通过安装包安装nodejs:…

    2025年3月7日
    200
  • 详解Nodejs+Nest实现的短链接服务

    本篇文章给大家介绍一下基于node框架nest实现短链接服务的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 推荐学习:《node》 日常生活中能见到各种奇怪的短链接,每次点击跳转的时候,笔者都会觉得神奇,这短链是怎…

    2025年3月7日
    200
  • 聊聊Nodejs获取参数的四种方法

    本篇文章给大家介绍一下nodejs获取参数的四种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 推荐学习:《nodejs》 获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了…

    2025年3月7日
    200

发表回复

登录后才能评论