이 글에서는 Nodejs에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API를 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
관련 권장 사항: "nodejs Tutorial"
Node를 일상적인 개발에 사용할 때 파일 시스템 및 경로 작업과 같은 몇 가지 기본 API를 사용하게 되며 모든 사람이 쉽게 이해하고 직접 사용할 수 있도록 여기에 정리했습니다. .
여기서는 전부가 아닌 가장 일반적으로 사용되는 것만 소개합니다. 더 포괄적인 정보를 보려면 공식 문서를 살펴보세요.
쓸데없는 말을 하지 말고 더 많은 코드를 작성하세요.
프로세스 모듈
먼저 현재 Node 프로세스와 관련된 글로벌 환경 정보를 제공하는 프로세스 모듈을 소개합니다. 이후 API에서 사용됩니다.
// 内置模块,直接使用 const process = require('process');
process.cwd()
현재 Node 프로세스가 실행되는 디렉터리를 반환하는 함수입니다. 예를 들어 일반적인 시나리오는 다음과 같습니다.
A 노드 모듈 A
는 NPM을 통해 게시된 프로젝트 모듈 A
는 B
에서 사용됩니다. A
의 B
프로젝트에서 파일을 조작해야 하는 경우 process.cwd()
를 사용하여 B
를 얻을 수 있습니다. code > 프로젝트 경로입니다. 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.js console.log(path.basename('scripts/index.js', '.js')); // 匹配到 .js,返回 index console.log(path.basename('scripts/index.js', '.json')); // 没匹配到,返回 index.js
path.dirname(path)
和 path.basename
对应,返回指定 path
console.log(path.basename('scripts/index.js')); // scripts console.log(path.basename('scripts/hook/index.js')); // scripts/hook
process.argv🎜🎜🎜단말기가 Node를 통해 명령을 실행할 때 들어오는 명령줄 매개변수는 process.argv
를 통해 얻을 수 있습니다. 반환값은 배열입니다: 🎜
- 0: 노드 경로(일반적으로 사용되지 않음, 그냥 무시하세요)
- 1: 실행된 JS 파일 경로(일반적으로 사용되지 않음, 그냥 무시하세요)
- 2~n: 실제 수신 명령의 매개변수**
🎜따라서 process.argv[2]
에서만 가져오면 됩니다. > . 🎜보통 이렇게 사용됩니다🎜: 🎜console.log(path.basename('scripts/index.js')); // .js
console.log(path.basename('README.md')); // .md
🎜원하는 매개변수를 직접 가져옵니다. 🎜🎜process.env🎜🎜🎜 직접적으로 거의 사용되지 않는 현재 환경과 관련된 모든 정보를 저장하는 객체를 반환합니다. 🎜🎜일반적으로 현재 환경을 식별하기 위해 process.env
에 일부 변수를 마운트합니다. 예를 들어 개발
과 생산
을 구별하기 위해 가장 일반적으로 사용되는 process.env.NODE_ENV
입니다. vue-cli
의 소스 코드에는 현재 모드가 DEBUG
인지 여부를 나타내는 process.env.VUE_CLI_DEBUG
가 자주 표시됩니다. 🎜🎜다음은 웹팩 플러그인 DefinePlugin🎜입니다. , 일일 빌드 프로세스에서 우리는 종종 이 플러그인을 사용하여 다양한 전역 변수를 주입하여 다양한 빌드 프로세스를 실행하며, 코드의 process.env.xxx
는 특정 값인 deadCode로 대체됩니다. 코드 크기를 최적화하기 위해 Terser 압축 단계에서 제거됩니다. 🎜🎜process.platform🎜🎜🎜 많이 사용되지는 않습니다. 현재 시스템 정보를 반환합니다. 열거 값은 다음과 같습니다. 🎜├── scripts
│ └── index.js
├── src
│ └── index.js
├── package.json
├── README.md
🎜Path 모듈🎜🎜🎜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);
🎜Node의 거의 🎜경로 관련 작업🎜에서 이 모듈을 사용합니다. 🎜🎜가장 일반적으로 사용되는 5가지 항목은 다음과 같습니다. 🎜🎜path.join(...paths)🎜🎜🎜path.join
은 다음과 같은 용도로 사용됩니다. add 전달된 여러 경로가 전체 경로로 결합됩니다. 🎜-> node scripts/index.js
package.json
/Users/xiaolian/Code/A/package.json
src/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
🎜매우 일반적인 시나리오를 살펴보겠습니다. 현재 프로젝트의 package.json 파일을 가져와야 하며 다음과 같은 경로를 얻을 수 있습니다. 🎜// 内置模块,直接使用
const fs = require('fs');
🎜path.join
임의 개수의 경로에서(예: 🎜const fs = require('fs');
fs.stat('a.js', function(err, stats) {
console.log(stats);
});
🎜path.resolve(...paths)🎜🎜🎜path.resovle
및 path.join
차이점은 여러 개의 수신 경로와 현재 실행 경로를 완전한 절대 경로로 연결하는 기능이라는 것입니다. 🎜🎜이제 scripts
디렉터리에 index.js
가 있고 루트 디렉터리에서 node scripts/index.js
를 실행한다고 가정해 보겠습니다. 🎜export interface StatsBase<t> {
isFile(): boolean; // 判断是否是一个文件
isDirectory(): boolean; // 判断是否一个目录
size: T; // 大小(字节数)
atime: Date; // 访问时间
mtime: Date; // 上次文件内容修改时间
ctime: Date; // 上次文件状态改变时间
birthtime: Date; // 创建时间
}</t>
🎜일반적으로 path.resolve
의 첫 번째 매개변수가 ./
일 때 바로 이해하고 path.join을 할 수 있습니다. (processs .cwd(), '')
는 일관되게 작동합니다. 🎜🎜path.basename(path[, ext])🎜🎜🎜path.basename
은 지정된 경로의 마지막 경로를 반환합니다. code> 이름. 여기서 두 번째 매개변수 <code>ext
는 선택사항이며 파일 확장자를 나타냅니다. 예: 🎜const fs = require('fs');
try {
const stats = fs.statSync('a.js');
} catch(e) {}
🎜path.dirname(path)🎜🎜🎜은 path.basename
에 해당하고 지정된 경로를 반환합니다. code> 끝에 경로 이름 앞에 경로가 있습니다. 예: 🎜<pre class='brush:php;toolbar:false;'>console.log(path.basename(&#39;scripts/index.js&#39;)); // scripts
console.log(path.basename(&#39;scripts/hook/index.js&#39;)); // scripts/hook</pre><h3 id="strong-path-extname-path-strong"><strong>path.extname(path)</strong></h3>
<p>和 <code>path.basename
对应,返回指定 path
最后一个路径名的文件扩展名(含小数点 .
)。比如:console.log(path.basename('scripts/index.js')); // .js
console.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.js
package.json
/Users/xiaolian/Code/A/package.json
src/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<t> {
isFile(): boolean; // 判断是否是一个文件
isDirectory(): boolean; // 判断是否一个目录
size: T; // 大小(字节数)
atime: Date; // 访问时间
mtime: Date; // 上次文件内容修改时间
ctime: Date; // 上次文件状态改变时间
birthtime: Date; // 创建时间
}</t>
一般我们会使用 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 常用的一些三方包。
更多编程相关知识,请访问:编程视频!!
process.env
에 일부 변수를 마운트합니다. 예를 들어 개발
과 생산
을 구별하기 위해 가장 일반적으로 사용되는 process.env.NODE_ENV
입니다. vue-cli
의 소스 코드에는 현재 모드가 DEBUG
인지 여부를 나타내는 process.env.VUE_CLI_DEBUG
가 자주 표시됩니다. 🎜🎜다음은 웹팩 플러그인 DefinePlugin🎜입니다. , 일일 빌드 프로세스에서 우리는 종종 이 플러그인을 사용하여 다양한 전역 변수를 주입하여 다양한 빌드 프로세스를 실행하며, 코드의 process.env.xxx
는 특정 값인 deadCode로 대체됩니다. 코드 크기를 최적화하기 위해 Terser 압축 단계에서 제거됩니다. 🎜🎜process.platform🎜🎜🎜 많이 사용되지는 않습니다. 현재 시스템 정보를 반환합니다. 열거 값은 다음과 같습니다. 🎜├── scripts
│ └── index.js
├── src
│ └── index.js
├── package.json
├── README.md
🎜Path 모듈🎜🎜🎜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);
🎜Node의 거의 🎜경로 관련 작업🎜에서 이 모듈을 사용합니다. 🎜🎜가장 일반적으로 사용되는 5가지 항목은 다음과 같습니다. 🎜🎜path.join(...paths)🎜🎜🎜path.join
은 다음과 같은 용도로 사용됩니다. add 전달된 여러 경로가 전체 경로로 결합됩니다. 🎜-> node scripts/index.js
package.json
/Users/xiaolian/Code/A/package.json
src/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
🎜매우 일반적인 시나리오를 살펴보겠습니다. 현재 프로젝트의 package.json 파일을 가져와야 하며 다음과 같은 경로를 얻을 수 있습니다. 🎜// 内置模块,直接使用
const fs = require('fs');
🎜path.join
임의 개수의 경로에서(예: 🎜const fs = require('fs');
fs.stat('a.js', function(err, stats) {
console.log(stats);
});
🎜path.resolve(...paths)🎜🎜🎜path.resovle
및 path.join
차이점은 여러 개의 수신 경로와 현재 실행 경로를 완전한 절대 경로로 연결하는 기능이라는 것입니다. 🎜🎜이제 scripts
디렉터리에 index.js
가 있고 루트 디렉터리에서 node scripts/index.js
를 실행한다고 가정해 보겠습니다. 🎜export interface StatsBase<t> {
isFile(): boolean; // 判断是否是一个文件
isDirectory(): boolean; // 判断是否一个目录
size: T; // 大小(字节数)
atime: Date; // 访问时间
mtime: Date; // 上次文件内容修改时间
ctime: Date; // 上次文件状态改变时间
birthtime: Date; // 创建时间
}</t>
🎜일반적으로 path.resolve
의 첫 번째 매개변수가 ./
일 때 바로 이해하고 path.join을 할 수 있습니다. (processs .cwd(), '')
는 일관되게 작동합니다. 🎜🎜path.basename(path[, ext])🎜🎜🎜path.basename
은 지정된 경로의 마지막 경로를 반환합니다. code> 이름. 여기서 두 번째 매개변수 <code>ext
는 선택사항이며 파일 확장자를 나타냅니다. 예: 🎜const fs = require('fs');
try {
const stats = fs.statSync('a.js');
} catch(e) {}
🎜path.dirname(path)🎜🎜🎜은 path.basename
에 해당하고 지정된 경로를 반환합니다. code> 끝에 경로 이름 앞에 경로가 있습니다. 예: 🎜<pre class='brush:php;toolbar:false;'>console.log(path.basename(&#39;scripts/index.js&#39;)); // scripts
console.log(path.basename(&#39;scripts/hook/index.js&#39;)); // scripts/hook</pre><h3 id="strong-path-extname-path-strong"><strong>path.extname(path)</strong></h3>
<p>和 <code>path.basename
对应,返回指定 path
最后一个路径名的文件扩展名(含小数点 .
)。比如:console.log(path.basename('scripts/index.js')); // .js
console.log(path.basename('README.md')); // .md
对比
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);🎜Node의 거의 🎜경로 관련 작업🎜에서 이 모듈을 사용합니다. 🎜🎜가장 일반적으로 사용되는 5가지 항목은 다음과 같습니다. 🎜
🎜path.join(...paths)🎜🎜🎜path.join
은 다음과 같은 용도로 사용됩니다. add 전달된 여러 경로가 전체 경로로 결합됩니다. 🎜-> node scripts/index.js
package.json
/Users/xiaolian/Code/A/package.json
src/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
🎜매우 일반적인 시나리오를 살펴보겠습니다. 현재 프로젝트의 package.json 파일을 가져와야 하며 다음과 같은 경로를 얻을 수 있습니다. 🎜// 内置模块,直接使用
const fs = require('fs');
🎜path.join
임의 개수의 경로에서(예: 🎜const fs = require('fs');
fs.stat('a.js', function(err, stats) {
console.log(stats);
});
🎜path.resolve(...paths)🎜🎜🎜path.resovle
및 path.join
차이점은 여러 개의 수신 경로와 현재 실행 경로를 완전한 절대 경로로 연결하는 기능이라는 것입니다. 🎜🎜이제 scripts
디렉터리에 index.js
가 있고 루트 디렉터리에서 node scripts/index.js
를 실행한다고 가정해 보겠습니다. 🎜export interface StatsBase<t> {
isFile(): boolean; // 判断是否是一个文件
isDirectory(): boolean; // 判断是否一个目录
size: T; // 大小(字节数)
atime: Date; // 访问时间
mtime: Date; // 上次文件内容修改时间
ctime: Date; // 上次文件状态改变时间
birthtime: Date; // 创建时间
}</t>
🎜일반적으로 path.resolve
의 첫 번째 매개변수가 ./
일 때 바로 이해하고 path.join을 할 수 있습니다. (processs .cwd(), '')
는 일관되게 작동합니다. 🎜🎜path.basename(path[, ext])🎜🎜🎜path.basename
은 지정된 경로의 마지막 경로를 반환합니다. code> 이름. 여기서 두 번째 매개변수 <code>ext
는 선택사항이며 파일 확장자를 나타냅니다. 예: 🎜const fs = require('fs');
try {
const stats = fs.statSync('a.js');
} catch(e) {}
🎜path.dirname(path)🎜🎜🎜은 path.basename
에 해당하고 지정된 경로를 반환합니다. code> 끝에 경로 이름 앞에 경로가 있습니다. 예: 🎜<pre class='brush:php;toolbar:false;'>console.log(path.basename(&#39;scripts/index.js&#39;)); // scripts
console.log(path.basename(&#39;scripts/hook/index.js&#39;)); // scripts/hook</pre><h3 id="strong-path-extname-path-strong"><strong>path.extname(path)</strong></h3>
<p>和 <code>path.basename
对应,返回指定 path
最后一个路径名的文件扩展名(含小数点 .
)。比如:console.log(path.basename('scripts/index.js')); // .js
console.log(path.basename('README.md')); // .md
对比
path.resovle
및 path.join
차이점은 여러 개의 수신 경로와 현재 실행 경로를 완전한 절대 경로로 연결하는 기능이라는 것입니다. 🎜🎜이제 scripts
디렉터리에 index.js
가 있고 루트 디렉터리에서 node scripts/index.js
를 실행한다고 가정해 보겠습니다. 🎜export interface StatsBase<t> { isFile(): boolean; // 判断是否是一个文件 isDirectory(): boolean; // 判断是否一个目录 size: T; // 大小(字节数) atime: Date; // 访问时间 mtime: Date; // 上次文件内容修改时间 ctime: Date; // 上次文件状态改变时间 birthtime: Date; // 创建时间 }</t>🎜일반적으로
path.resolve
의 첫 번째 매개변수가 ./
일 때 바로 이해하고 path.join을 할 수 있습니다. (processs .cwd(), '')
는 일관되게 작동합니다. 🎜🎜path.basename(path[, ext])🎜🎜🎜path.basename
은 지정된 경로의 마지막 경로를 반환합니다. code> 이름. 여기서 두 번째 매개변수 <code>ext
는 선택사항이며 파일 확장자를 나타냅니다. 예: 🎜const fs = require('fs');
try {
const stats = fs.statSync('a.js');
} catch(e) {}
🎜path.dirname(path)🎜🎜🎜은 path.basename
에 해당하고 지정된 경로를 반환합니다. code> 끝에 경로 이름 앞에 경로가 있습니다. 예: 🎜<pre class='brush:php;toolbar:false;'>console.log(path.basename(&#39;scripts/index.js&#39;)); // scripts
console.log(path.basename(&#39;scripts/hook/index.js&#39;)); // scripts/hook</pre><h3 id="strong-path-extname-path-strong"><strong>path.extname(path)</strong></h3>
<p>和 <code>path.basename
对应,返回指定 path
最后一个路径名的文件扩展名(含小数点 .
)。比如:console.log(path.basename('scripts/index.js')); // .js
console.log(path.basename('README.md')); // .md
对比
path.basename
에 해당하고 지정된 경로를 반환합니다. code> 끝에 경로 이름 앞에 경로가 있습니다. 예: 🎜<pre class='brush:php;toolbar:false;'>console.log(path.basename(&#39;scripts/index.js&#39;)); // scripts
console.log(path.basename(&#39;scripts/hook/index.js&#39;)); // scripts/hook</pre><h3 id="strong-path-extname-path-strong"><strong>path.extname(path)</strong></h3>
<p>和 <code>path.basename
对应,返回指定 path
最后一个路径名的文件扩展名(含小数点 .
)。比如:console.log(path.basename('scripts/index.js')); // .js console.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.js package.json /Users/xiaolian/Code/A/package.json src/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<t> { isFile(): boolean; // 判断是否是一个文件 isDirectory(): boolean; // 判断是否一个目录 size: T; // 大小(字节数) atime: Date; // 访问时间 mtime: Date; // 上次文件内容修改时间 ctime: Date; // 上次文件状态改变时间 birthtime: Date; // 创建时间 }</t>
一般我们会使用 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에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
