이 글에서는 Nodejs에서 일반적으로 사용되는 프로세스, 경로 및 파일 시스템 모듈의 API를 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
관련 권장 사항: "nodejs Tutorial"
Node를 일상적인 개발에 사용할 때 파일 시스템 및 경로 작업과 같은 몇 가지 기본 API를 사용하게 되며 모든 사람이 쉽게 이해하고 직접 사용할 수 있도록 여기에 정리했습니다. .
여기서는 전부가 아닌 가장 일반적으로 사용되는 것만 소개합니다. 더 포괄적인 정보를 보려면 공식 문서를 살펴보세요.
쓸데없는 말을 하지 말고 더 많은 코드를 작성하세요.
먼저 현재 Node 프로세스와 관련된 글로벌 환경 정보를 제공하는 프로세스 모듈을 소개합니다. 이후 API에서 사용됩니다.
// 内置模块,直接使用 const process = require('process');
현재 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
在终端通过 Node 执行命令的时候,通过 process.argv
可以获取传入的命令行参数,返回值是一个数组:
所以,我们只要从 process.argv[2]
开始获取就好了。一般都是这样用:
const args = process.argv.slice(2);
直接获取我们想要的参数。
返回一个对象,存储当前环境相关的所有信息,一般很少直接用到。
一般我们会在 process.env
上挂载一些变量标识当前的环境。比如最常见的用 process.env.NODE_ENV
区分 development
和 production
。在 vue-cli
的源码中也经常会看到 process.env.VUE_CLI_DEBUG
标识当前是不是一 DEBUG
模式。
这里提一个 webpack 的插件 DefinePlugin,在日常的构建流程中,我们经常会通过这个插件来注入不同的全局变量,从而执行不同的构建流程,并且代码中的 process.env.xxx
会被替换成具体的值,在 Terser 压缩阶段会将 deadCode 移除,优化代码体积。
这个用的不多,返回当前系统信息,枚举值如下:
console.log(process.platform); // 'aix' // 'darwin' - macOS // 'freebsd' // 'linux' - linux // 'openbsd' // 'sunos' // 'win32' - windows
// 内置模块,直接使用 const path = require('path');
Node 中几乎路径相关的操作都会使用这个模块。
这里就说 5 个最常用的:
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.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
可选,表示文件扩展名。比如:
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.basename
对应,返回指定 path
console.log(path.basename('scripts/index.js')); // scripts console.log(path.basename('scripts/hook/index.js')); // scripts/hook
process.argv
를 통해 얻을 수 있습니다. 반환값은 배열입니다: 🎜process.argv[2]</code에서만 가져오면 됩니다. > . 🎜보통 이렇게 사용됩니다🎜: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">console.log(path.basename(&#39;scripts/index.js&#39;)); // .js
console.log(path.basename(&#39;README.md&#39;)); // .md</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜원하는 매개변수를 직접 가져옵니다. 🎜<h3 data-id="heading-3">🎜process.env🎜🎜🎜 직접적으로 거의 사용되지 않는 현재 환경과 관련된 모든 정보를 저장하는 객체를 반환합니다. 🎜🎜일반적으로 현재 환경을 식별하기 위해 <code>process.env
에 일부 변수를 마운트합니다. 예를 들어 개발
과 생산
을 구별하기 위해 가장 일반적으로 사용되는 process.env.NODE_ENV
입니다. vue-cli
의 소스 코드에는 현재 모드가 DEBUG
인지 여부를 나타내는 process.env.VUE_CLI_DEBUG
가 자주 표시됩니다. 🎜🎜다음은 웹팩 플러그인 DefinePlugin🎜입니다. , 일일 빌드 프로세스에서 우리는 종종 이 플러그인을 사용하여 다양한 전역 변수를 주입하여 다양한 빌드 프로세스를 실행하며, 코드의 process.env.xxx
는 특정 값인 deadCode로 대체됩니다. 코드 크기를 최적화하기 위해 Terser 압축 단계에서 제거됩니다. 🎜├── scripts │ └── index.js ├── src │ └── index.js ├── package.json ├── README.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);
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
// 内置模块,直接使用 const fs = require('fs');
path.join
임의 개수의 경로에서(예: 🎜const fs = require('fs'); fs.stat('a.js', function(err, stats) { console.log(stats); });
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; // 创建时间 }
path.resolve
의 첫 번째 매개변수가 ./
일 때 바로 이해하고 path.join을 할 수 있습니다. (processs .cwd(), '')
는 일관되게 작동합니다. 🎜path.basename
은 지정된 경로</의 마지막 경로를 반환합니다. code> 이름. 여기서 두 번째 매개변수 <code>ext
는 선택사항이며 파일 확장자를 나타냅니다. 예: 🎜const fs = require('fs'); try { const stats = fs.statSync('a.js'); } catch(e) {}
path.basename
에 해당하고 지정된 경로</를 반환합니다. code> 끝에 경로 이름 앞에 경로가 있습니다. 예: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;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><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><h3 data-id="heading-10"><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')
。
// 内置模块,直接使用 const fs = require('fs');
文件系统相关操作的模块,除了 fs
之外,我们还经常用到 fs-extra
,后面会介绍。
这个模块在平时的 Node 开发中会被大量使用,这里简单列几个,其它的还是看文档哈:nodejs.org/dist/latest…
fs
模块的 API 默认都是异步回调的形式,如果你想使用同步的方法,有两种解决方法:
xxxSync
,也就是在 API 的后面加一个 Sync
后缀,它就是一个同步方法了(具体还是需要查文档哈,是否有提供同步 API)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; // 创建时间 }
一般我们会使用 fs.stat
来取文件的大小,做一些判断逻辑,比如发布的时候可以检测文件大小是否符合规范。在 CLI 中,经常需要获取一个路径下的所有文件,这时候也需要使用 fs.stat
来判断是目录还是文件,如果是目录则继续递归。当然,现在也有更方便的 API 可以完成这个工作。
const fs = require('fs'); try { const stats = fs.statSync('a.js'); } catch(e) {}
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) {}
文件读取的 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) {}
对应着读文件 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!