本篇文章帶大家深入了解Node中的模塊化、文件系統(tǒng)與環(huán)境變量,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。
一、Node.js模塊化
1.0、變量作用域
(1)、在瀏覽器端使用var或不使用關(guān)鍵字定義的變量屬于全局作用域,也就是可以使用window對(duì)象訪(fǎng)問(wèn)?!鞠嚓P(guān)教程推薦:nodejs視頻教程、編程教學(xué)】
<script> var a = 100; (function () { b = 200; })(); console.log(window.a, a); console.log(window.b, b); </script>
登錄后復(fù)制
結(jié)果:
(2)、在Node.js中沒(méi)有window對(duì)象
(3)、在Node.js的交互環(huán)境下,定義的變量屬于global,global是類(lèi)似瀏覽器端的window對(duì)象
(4)、在模塊中(文件中)有g(shù)lobal對(duì)象,使用關(guān)鍵字var,let,const定義的成員不屬于global對(duì)象,僅在當(dāng)前模塊中有效,而不使用關(guān)鍵字定義的對(duì)象屬于global對(duì)象。
var a=100; b=200; let c=300; const d=400; console.log(global); console.log(global.a); console.log(global.b); console.log(global.c); console.log(global.d);
登錄后復(fù)制
終端輸出:
1.1、模塊概要
早期的javascript版本沒(méi)有塊級(jí)作用域、沒(méi)有類(lèi)、沒(méi)有包、也沒(méi)有模塊,這樣會(huì)帶來(lái)一些問(wèn)題,如復(fù)用、依賴(lài)、沖突、代碼組織混亂等,隨著前端的膨脹,模塊化顯得非常迫切。
前端模塊化規(guī)范如下:
常見(jiàn)的的JavaScript模塊規(guī)范有:CommonJS、AMD、CMD、UMD、原生模塊化。
雖然我們學(xué)習(xí)過(guò)ES6的模塊化但是ES6與NodeJS使用不同的模塊化規(guī)范,單獨(dú)學(xué)習(xí)NodeJS的模塊化非常有必要。
模塊化是指解決一個(gè)復(fù)雜問(wèn)題時(shí),自頂向下逐層把系統(tǒng)劃分成若干模塊的過(guò)程。對(duì)于整個(gè)系統(tǒng)來(lái)說(shuō),模塊是可組合、分解和更換 的單元。
JavaScript在早期的設(shè)計(jì)中就沒(méi)有模塊、包、類(lèi)的概念,開(kāi)發(fā)者需要模擬出類(lèi)似的功能,來(lái)隔離、組織復(fù)雜的JavaScript代碼,我們稱(chēng)為模塊化。
模塊就是一個(gè)實(shí)現(xiàn)特定功能的文件,有了模塊我們就可以更方便的使用別人的代碼,要用什么功能就加載什么模塊。
模塊化開(kāi)發(fā)的四點(diǎn)好處:
?。?)、 避免變量污染,命名沖突
(2)、提高代碼復(fù)用率
?。?)、提高了可維護(hù)性
?。?)、方便依賴(lài)關(guān)系管理
nodejs中根據(jù)模塊的來(lái)源不同,將模塊分為了3大類(lèi),分別是:
- 內(nèi)置模塊(內(nèi)置模塊是由Node.js官方提供的,例如fs、path、http等)
- 自定義模塊 (用戶(hù)創(chuàng)建的每個(gè) .js文件,都是自定義模塊)
- 第三方模塊 (由第三方開(kāi)發(fā)出來(lái)的模塊,并非官方提供的內(nèi)置模塊,也不是用戶(hù)創(chuàng)建的自定義模塊,使用前需要先下載)
模塊作用域。
和函數(shù)作用域類(lèi)似,在自定義模塊中定義的變量、方法等成員,只能在當(dāng)前模塊內(nèi)被訪(fǎng)問(wèn),這種模塊級(jí)別的訪(fǎng)問(wèn)限制,叫做模塊作用域。
模塊作用域的好處:防止了全局變量污染的問(wèn)題
1.2、CommonJS
CommonJS就是一個(gè)JavaScript模塊化的規(guī)范,該規(guī)范最初是用在服務(wù)器端NodeJS中,前端的webpack也是對(duì)CommonJS原生支持的。
根據(jù)這個(gè)規(guī)范
(1)、每一個(gè)文件就是一個(gè)模塊,其內(nèi)部定義的變量是屬于這個(gè)模塊的,不會(huì)對(duì)外暴露,也就是說(shuō)不會(huì)污染全局變量。
(2)、導(dǎo)入自定義的模塊時(shí)路徑需要以./或../開(kāi)始,同一路徑下也不能省略。
(3)、如果反復(fù)多次require模塊,只加載一次。
(4)、require引入模塊時(shí),后綴名.js可以省略
(5)、每個(gè)模塊文件都是一個(gè)獨(dú)立的函數(shù)級(jí)作用域,在其它模塊中不能直接訪(fǎng)問(wèn)
m1.js:
console.log("這是模塊m1"); let a=100; b=200;
登錄后復(fù)制
m2.js
var m11=require("./m1"); console.log(a); console.log(b);
登錄后復(fù)制
結(jié)果:
從上面的示例可以看出a在模塊2中是訪(fǎng)問(wèn)不到的,模塊其實(shí)就是一個(gè)封閉的函數(shù):
m1.js的代碼如下:
console.log("這是模塊m1"); let a=100; b=200; //輸出當(dāng)前函數(shù) console.log(arguments.callee+"");
登錄后復(fù)制
實(shí)際輸出結(jié)果:
function (exports, require, module, __filename, __dirname) { console.log("這是模塊m1"); let a=100; b=200; //輸出當(dāng)前函數(shù) console.log(arguments.callee+""); }
登錄后復(fù)制
(6)、每個(gè)模塊中都包含如下5個(gè)對(duì)象:
exports:導(dǎo)出對(duì)象,默認(rèn)為{}
require:導(dǎo)入函數(shù),使用該函數(shù)可以實(shí)現(xiàn)模塊的依賴(lài)
module:模塊信息,用于記錄當(dāng)前模塊的所有信息
__filename:當(dāng)前模塊的文件全路徑,含文件名
__dirname:當(dāng)前模塊的文件路徑不含文件名
(7)、使用exports或module.exports對(duì)象可以將當(dāng)前模塊中需要導(dǎo)出的內(nèi)容暴露出去。
m1.js
let a=100; let b=()=>{ return 200; }; exports.a=a; exports.b=b;
登錄后復(fù)制
m2.js
const m1=require("./m1"); console.log(m1); console.log(m1.a); console.log(m1.b());
登錄后復(fù)制
結(jié)果:
(8)、導(dǎo)入模塊內(nèi)容可以結(jié)合結(jié)構(gòu)語(yǔ)法
m1.js
exports.a=100; exports.b=function(){ return 200; };
登錄后復(fù)制
m2.js
const {a,b:fun}=require("./m1"); console.log(a); console.log(fun());
登錄后復(fù)制
結(jié)果:
1.3、NodeJS中使用CommonJS模塊管理
CommonJS的核心思想就是通過(guò) require 方法來(lái)同步加載所要依賴(lài)的其他模塊,然后通過(guò) exports 或者 module.exports 來(lái)導(dǎo)出需要暴露的接口。
CommonJS API編寫(xiě)應(yīng)用程序,然后這些應(yīng)用可以運(yùn)行在不同的JavaScript解釋器和不同的主機(jī)環(huán)境中。
2009年,美國(guó)程序員Ryan Dahl創(chuàng)造了node.js項(xiàng)目,將javascript語(yǔ)言用于服務(wù)器端編程。這標(biāo)志"Javascript模塊化編程"正式誕生。因?yàn)槔蠈?shí)說(shuō),在瀏覽器環(huán)境下,以前沒(méi)有模塊也不是特別大的問(wèn)題,畢竟網(wǎng)頁(yè)程序的復(fù)雜性有限;但是在服務(wù)器端,一定要有模塊,與操作系統(tǒng)和其他應(yīng)用程序互動(dòng),否則根本沒(méi)法編程。NodeJS是CommonJS規(guī)范的實(shí)現(xiàn),webpack 也是以CommonJS的形式來(lái)書(shū)寫(xiě)。
CommonJS定義的模塊分為:{模塊引用(require)} {模塊定義(exports)} {模塊標(biāo)識(shí)(module)} //require()用來(lái)引入外部模塊; //exports對(duì)象用于導(dǎo)出當(dāng)前模塊的方法或變量,唯一的導(dǎo)出口; //module對(duì)象就代表模塊本身。
登錄后復(fù)制
Nodejs的模塊是基于CommonJS規(guī)范實(shí)現(xiàn)的,通過(guò)轉(zhuǎn)換也可以運(yùn)行在瀏覽器端。
特點(diǎn):
1.3.1、模塊定義
根據(jù)commonJS規(guī)范,一個(gè)單獨(dú)的文件是一個(gè)模塊,每一個(gè)模塊都是一個(gè)單獨(dú)的作用域,也就是說(shuō),在該模塊內(nèi)部定義的變量,無(wú)法被其他模塊讀取,除非為global對(duì)象的屬性。
模塊擁有像函數(shù)一樣的函數(shù)級(jí)作用域:
-
每個(gè)模塊內(nèi)部,module變量代表當(dāng)前模塊
-
module變量是一個(gè)對(duì)象,它的exports屬性(即module.exports)是對(duì)外的接口
-
加載某個(gè)模塊,其實(shí)是加載該模塊的module.exports屬性。require()方法用于加載模塊。
模塊只有一個(gè)出口,module.exports對(duì)象,我們需要把模塊希望輸出的內(nèi)容放入該對(duì)象。
mathLib.js模塊定義
var message="Hello CommonJS!"; module.exports.message=message; module.exports.add=(m,n)=>console.log(m+n);
登錄后復(fù)制
在 Node.js 中,創(chuàng)建一個(gè)模塊非常簡(jiǎn)單,如下我們創(chuàng)建一個(gè) 'main.js' 文件,代碼如下:
var hello = require('./hello'); hello.world();
登錄后復(fù)制
以上實(shí)例中,代碼 require('./hello') 引入了當(dāng)前目錄下的hello.js文件(./ 為當(dāng)前目錄,node.js默認(rèn)后綴為js)。
Node.js 提供了exports 和 require 兩個(gè)對(duì)象,其中 exports 是模塊公開(kāi)的接口,require 用于從外部獲取一個(gè)模塊的接口,即所獲取模塊的 exports 對(duì)象。
接下來(lái)我們就來(lái)創(chuàng)建hello.js文件,代碼如下:
exports.world = function() { console.log('Hello World'); }
登錄后復(fù)制
在以上示例中,hello.js 通過(guò) exports 對(duì)象把 world 作為模塊的訪(fǎng) 問(wèn)接口,在 main.js 中通過(guò) require('./hello') 加載這個(gè)模塊,然后就可以直接訪(fǎng) 問(wèn)main.js 中 exports 對(duì)象的成員函數(shù)了。
有時(shí)候我們只是想把一個(gè)對(duì)象封裝到模塊中,格式如下:
module.exports = function() { // ...}
登錄后復(fù)制
例如:
//hello.js function Hello() { varname; this.setName = function(thyName) { name = thyName; }; this.sayHello = function() { console.log('Hello ' + name); }; }; module.exports = Hello;
登錄后復(fù)制
這樣就可以直接獲得這個(gè)對(duì)象了:
//main.js var Hello = require('./hello'); hello = new Hello(); hello.setName('BYVoid'); hello.sayHello();
登錄后復(fù)制
模塊接口的唯一變化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用該模塊時(shí),其接口對(duì)象就是要輸出的 Hello 對(duì)象本身,而不是原先的 exports。
1.3.2、模塊依賴(lài)
加載模塊用require方法,該方法讀取一個(gè)文件并且執(zhí)行,返回文件內(nèi)部的module.exports對(duì)象。
在用require加載自定義模塊期間,可以省略.js這個(gè)后綴名。
myApp.js 模塊依賴(lài)
var math=require('./mathLib'); console.log(math.message); math.add(333,888);
登錄后復(fù)制
3、測(cè)試運(yùn)行
安裝好node.JS
打開(kāi)控制臺(tái),可以使用cmd命令,也可以直接在開(kāi)發(fā)工具中訪(fǎng)問(wèn)
運(yùn)行
1.3.3、內(nèi)置模塊加載
也許你已經(jīng)注意到,我們已經(jīng)在代碼中使用了模塊了。像這樣:
var http = require("http"); ... http.createServer(...);
登錄后復(fù)制
Node.js中自帶了一個(gè)叫做"http"的模塊,我們?cè)谖覀兊拇a中請(qǐng)求它并把返回值賦給一個(gè)本地變量。
這把我們的本地變量變成了一個(gè)擁有所有 http 模塊所提供的公共方法的對(duì)象。
Node.js 的 require方法中的文件查找策略如下:
由于Node.js中存在4類(lèi)模塊(原生模塊和3種文件模塊),盡管require方法極其簡(jiǎn)單,但是內(nèi)部的加載卻是十分復(fù)雜的,其加載優(yōu)先級(jí)也各自不同。如下圖所示:
從文件模塊緩存中加載
盡管原生模塊與文件模塊的優(yōu)先級(jí)不同,但是都不會(huì)優(yōu)先于從文件模塊的緩存中加載已經(jīng)存在的模塊。
從原生模塊加載
原生模塊的優(yōu)先級(jí)僅次于文件模塊緩存的優(yōu)先級(jí)。require方法在解析文件名之后,優(yōu)先檢查模塊是否在原生模塊列表中。以http模塊為例,盡管在目錄下存在一個(gè)http/http.js/http.node/http.json文件,require("http")都不會(huì)從這些文件中加載,而是從原生模塊中加載。
原生模塊也有一個(gè)緩存區(qū),同樣也是優(yōu)先從緩存區(qū)加載。如果緩存區(qū)沒(méi)有被加載過(guò),則調(diào)用原生模塊的加載方式進(jìn)行加載和執(zhí)行。
從文件加載
當(dāng)文件模塊緩存中不存在,而且不是原生模塊的時(shí)候,Node.js會(huì)解析require方法傳入的參數(shù),并從文件系統(tǒng)中加載實(shí)際的文件,加載過(guò)程中的包裝和編譯細(xì)節(jié)在前一節(jié)中已經(jīng)介紹過(guò),這里我們將詳細(xì)描述查找文件模塊的過(guò)程,其中,也有一些細(xì)節(jié)值得知曉。
require方法接受以下幾種參數(shù)的傳遞:
- http、fs、path等,原生模塊。
- ./mod或../mod,相對(duì)路徑的文件模塊。
- /pathtomodule/mod,絕對(duì)路徑的文件模塊。
- mod,非原生模塊的文件模塊。
node_modules文件夾用來(lái)存放所有已安裝到項(xiàng)目中的包。require()導(dǎo)入第三方包時(shí),就是從這個(gè)目錄中查找并加載包。
package-lock.json配置文件用來(lái)記錄node_modules目錄下的每一個(gè)包的下載信息,例如包的名字、版本號(hào)、下載地址等。
注意:不要手動(dòng)修改node_modules或package-lock.json文件中的任何代碼,npm包管理工具會(huì)自動(dòng)維護(hù)它們。
1.3.4、module對(duì)象
在每個(gè).js自定義模塊中都有一個(gè)module對(duì)象,它里面存儲(chǔ)了和當(dāng)前模塊有關(guān)的信息
每個(gè)模塊內(nèi)部,module變量代表當(dāng)前模塊
module變量是一個(gè)對(duì)象,它的exports屬性(即module.exports)是對(duì)外的接口
加載某個(gè)模塊,其實(shí)是加載該模塊的module.exports屬性。require()方法用于加載模塊。
二、Node.js 文件系統(tǒng)
Node.js 提供一組類(lèi)似 UNIX(POSIX)標(biāo)準(zhǔn)的文件操作API。 Node 導(dǎo)入文件系統(tǒng)模塊(fs)語(yǔ)法如下所示:
var fs = require("fs")
2.1、異步和同步
Node.js 文件系統(tǒng)(fs 模塊)模塊中的方法均有異步和同步版本,例如讀取文件內(nèi)容的函數(shù)有異步的 fs.readFile() 和同步的 fs.readFileSync()。
異步的方法函數(shù)最后一個(gè)參數(shù)為回調(diào)函數(shù),回調(diào)函數(shù)的第一個(gè)參數(shù)包含了錯(cuò)誤信息(error)。
建議大家是用異步方法,比起同步,異步方法性能更高,速度更快,而且沒(méi)有阻塞。
實(shí)例
創(chuàng)建 input.txt 文件,內(nèi)容如下:
foo
創(chuàng)建 filereaddemo.js 文件, 代碼如下:
const fs=require("fs"); //依賴(lài)內(nèi)置模塊fs,用于文件管理 //異步讀取文件students.txt,設(shè)置讀取成功時(shí)的回調(diào)函數(shù),err表示錯(cuò)誤信息,data表示數(shù)據(jù) fs.readFile("students.txt",function(err,data){ if(err) throw err; console.log("異步:"+data+""); }); console.log("---------------"); //同步讀取 let data=fs.readFileSync("students.txt"); console.log("同步:"+data+"");
登錄后復(fù)制
以上代碼執(zhí)行結(jié)果如下:
接下來(lái),讓我們來(lái)具體了解下 Node.js 文件系統(tǒng)的方法。
2.2、獲取文件信息
以下為通過(guò)異步模式獲取文件信息的語(yǔ)法格式:
fs.stat(path, callback)
參數(shù)使用說(shuō)明如下:
-
path – 文件路徑。
-
callback – 回調(diào)函數(shù),帶有兩個(gè)參數(shù)如:(err, stats), stats 是 fs.Stats 對(duì)象。
fs.stat(path)執(zhí)行后,會(huì)將stats類(lèi)的實(shí)例返回給其回調(diào)函數(shù)??梢酝ㄟ^(guò)stats類(lèi)中的提供方法判斷文件的相關(guān)屬性。例如判斷是否為文件:
const fs=require("fs"); fs.stat("students.txt",(err,stats)=>{ console.log("是文件嗎?"+stats.isFile()); console.log("是目錄嗎?"+stats.isDirectory()); console.log(stats); });
登錄后復(fù)制
結(jié)果:
stats類(lèi)中的方法有:
方法 | 描述 |
---|---|
stats.isFile() | 如果是文件返回 true,否則返回 false。 |
stats.isDirectory() | 如果是目錄返回 true,否則返回 false。 |
stats.isBlockDevice() | 如果是塊設(shè)備返回 true,否則返回 false。 |
stats.isCharacterDevice() | 如果是字符設(shè)備返回 true,否則返回 false。 |
stats.isSymbolicLink() | 如果是軟鏈接返回 true,否則返回 false。 |
stats.isFIFO() | 如果是FIFO,返回true,否則返回 false。FIFO是UNIX中的一種特殊類(lèi)型的命令管道。 |
stats.isSocket() | 如果是 Socket 返回 true,否則返回 false。 |
接下來(lái)我們創(chuàng)建 file.js 文件,代碼如下所示:
var fs = require("fs"); console.log("準(zhǔn)備打開(kāi)文件!"); fs.stat('input.txt', function (err, stats) { if (err) { return console.error(err); } console.log(stats); console.log("讀取文件信息成功!"); // 檢測(cè)文件類(lèi)型 console.log("是否為文件(isFile) ? " + stats.isFile()); console.log("是否為目錄(isDirectory) ? " + stats.isDirectory()); });
以上代碼執(zhí)行結(jié)果如下:
$ node file.js 準(zhǔn)備打開(kāi)文件! { dev: 16777220, mode: 33188, nlink: 1, uid: 501, gid: 20, rdev: 0, blksize: 4096, ino: 40333161, size: 61, blocks: 8, atime: Mon Sep 07 2015 17:43:55 GMT+0800 (CST), mtime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST), ctime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST) } 讀取文件信息成功! 是否為文件(isFile) ? true 是否為目錄(isDirectory) ? false
2.3、寫(xiě)入文件
以下為異步模式下寫(xiě)入文件的語(yǔ)法格式:
fs.writeFile(filename, data[, options], callback)
如果文件存在,該方法寫(xiě)入的內(nèi)容會(huì)覆蓋舊的文件內(nèi)容。
參數(shù)使用說(shuō)明如下:
-
path – 文件路徑。
-
data – 要寫(xiě)入文件的數(shù)據(jù),可以是 String(字符串) 或 Buffer(流) 對(duì)象。
-
options – 該參數(shù)是一個(gè)對(duì)象,包含 {encoding, mode, flag}。默認(rèn)編碼為 utf8, 模式為 0666 , flag 為 'w'
-
callback – 回調(diào)函數(shù),回調(diào)函數(shù)只包含錯(cuò)誤信息參數(shù)(err),在寫(xiě)入失敗時(shí)返回。
接下來(lái)我們創(chuàng)建 file.js 文件,代碼如下所示:
const fs=require("fs"); fs.writeFile("output1.txt","異步hello","utf-8",function(err){ if(!err){ console.log("異步文件寫(xiě)入成功!"); } else{ throw err; } }); console.log("---------------"); fs.writeFileSync("output2.txt","同步hello","utf-8"); console.log("同步文件寫(xiě)入成功");
登錄后復(fù)制
以上代碼執(zhí)行結(jié)果如下:
2.4、刪除文件
以下為刪除文件的語(yǔ)法格式:
fs.unlink(path, callback)
參數(shù)使用說(shuō)明如下:
-
path – 文件路徑。
-
callback – 回調(diào)函數(shù),沒(méi)有參數(shù)。
接下來(lái)我們創(chuàng)建 file.js 文件,代碼如下所示:
const fs=require("fs"); fs.unlink("output1.txt",function(err){ if(err){ throw err; } else{ console.log("異步刪除文件成功!"); } }); console.log("--------------------"); fs.unlinkSync("output2.txt"); console.log("同步刪除文件成功!");
登錄后復(fù)制
以上代碼執(zhí)行結(jié)果如下:
2.5、創(chuàng)建目錄
以下為創(chuàng)建目錄的語(yǔ)法格式:
fs.mkdir(path[, mode], callback)
參數(shù)使用說(shuō)明如下:
-
path – 文件路徑。
-
mode – 設(shè)置目錄權(quán)限,默認(rèn)為 0777。
-
callback – 回調(diào)函數(shù),沒(méi)有參數(shù)。
接下來(lái)我們創(chuàng)建mkdirfile.js 文件,代碼如下所示:
const fs=require("fs"); fs.mkdir("dir1",function(err){ if(err){ throw err; } else{ console.log("異步創(chuàng)建目錄成功!"); } }); console.log("---------------------"); fs.mkdirSync("dir2"); console.log("同步創(chuàng)建目錄成功!");
登錄后復(fù)制
以上代碼執(zhí)行結(jié)果如下:
2.6、讀取目錄
以下為讀取目錄的語(yǔ)法格式:
fs.readdir(path, callback)
參數(shù)使用說(shuō)明如下:
-
path – 文件路徑。
-
callback – 回調(diào)函數(shù),回調(diào)函數(shù)帶有兩個(gè)參數(shù)err, files,err 為錯(cuò)誤信息,files 為 目錄下的文件數(shù)組列表。
接下來(lái)我們創(chuàng)建 file.js 文件,代碼如下所示:
const fs=require("fs"); fs.readdir("dir1",(err,files)=>{ if(err) {throw err;} else{ console.log("異步獲取目錄下的文件成功!"); files.forEach(file=>console.log(file)); } }); console.log("-----------------------"); let files=fs.readdirSync("dir2"); console.log("同步獲取目錄下的文件成功!"); files.forEach(file=>console.log(file));
登錄后復(fù)制
以上代碼執(zhí)行結(jié)果如下:
2.7、刪除目錄
以下為刪除目錄的語(yǔ)法格式:
fs.rmdir(path, callback)
參數(shù)使用說(shuō)明如下:
-
path – 文件路徑。
-
callback – 回調(diào)函數(shù),沒(méi)有參數(shù)。
接下來(lái)我們創(chuàng)建 file.js 文件,代碼如下所示:
var fs = require("fs"); console.log("準(zhǔn)備刪除目錄 /tmp/test"); fs.rmdir("/tmp/test",function(err){ if (err) { return console.error(err); } console.log("讀取 /tmp 目錄"); fs.readdir("/tmp/",function(err, files){ if (err) { return console.error(err); } files.forEach( function (file){ console.log( file ); }); }); });
登錄后復(fù)制
以上代碼執(zhí)行結(jié)果如下:
$ node file.js 準(zhǔn)備刪除目錄 /tmp/test input.out output.out test test.txt 讀取 /tmp 目錄 ……
2.8、文件模塊方法參考手冊(cè)
以下為 Node.js 文件模塊相同的方法列表:
方法 | 描述 |
---|---|
fs.rename(oldPath, newPath, callback) | 異步 rename().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.ftruncate(fd, len, callback) | 異步 ftruncate().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.ftruncateSync(fd, len) | 同步 ftruncate() |
fs.truncate(path, len, callback) | 異步 truncate().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.truncateSync(path, len) | 同步 truncate() |
fs.chown(path, uid, gid, callback) | 異步 chown().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.chownSync(path, uid, gid) | 同步 chown() |
fs.fchown(fd, uid, gid, callback) | 異步 fchown().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.fchownSync(fd, uid, gid) | 同步 fchown() |
fs.lchown(path, uid, gid, callback) | 異步 lchown().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.lchownSync(path, uid, gid) | 同步 lchown() |
fs.chmod(path, mode, callback) | 異步 chmod().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.chmodSync(path, mode) | 同步 chmod(). |
fs.fchmod(fd, mode, callback) | 異步 fchmod().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.fchmodSync(fd, mode) | 同步 fchmod(). |
fs.lchmod(path, mode, callback) | 異步 lchmod().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。Only available on Mac OS X. |
fs.lchmodSync(path, mode) | 同步 lchmod(). |
fs.stat(path, callback) | 異步 stat(). 回調(diào)函數(shù)有兩個(gè)參數(shù) err, stats,stats 是 fs.Stats 對(duì)象。 |
fs.lstat(path, callback) | 異步 lstat(). 回調(diào)函數(shù)有兩個(gè)參數(shù) err, stats,stats 是 fs.Stats 對(duì)象。 |
fs.fstat(fd, callback) | 異步 fstat(). 回調(diào)函數(shù)有兩個(gè)參數(shù) err, stats,stats 是 fs.Stats 對(duì)象。 |
fs.statSync(path) | 同步 stat(). 返回 fs.Stats 的實(shí)例。 |
fs.lstatSync(path) | 同步 lstat(). 返回 fs.Stats 的實(shí)例。 |
fs.fstatSync(fd) | 同步 fstat(). 返回 fs.Stats 的實(shí)例。 |
fs.link(srcpath, dstpath, callback) | 異步 link().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.linkSync(srcpath, dstpath) | 同步 link(). |
fs.symlink(srcpath, dstpath[, type], callback) | 異步 symlink().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 type 參數(shù)可以設(shè)置為 'dir', 'file', 或 'junction' (默認(rèn)為 'file') 。 |
fs.symlinkSync(srcpath, dstpath[, type]) | 同步 symlink(). |
fs.readlink(path, callback) | 異步 readlink(). 回調(diào)函數(shù)有兩個(gè)參數(shù) err, linkString。 |
fs.realpath(path[, cache], callback) | 異步 realpath(). 回調(diào)函數(shù)有兩個(gè)參數(shù) err, resolvedPath。 |
fs.realpathSync(path[, cache]) | 同步 realpath()。返回絕對(duì)路徑。 |
fs.unlink(path, callback) | 異步 unlink().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.unlinkSync(path) | 同步 unlink(). |
fs.rmdir(path, callback) | 異步 rmdir().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.rmdirSync(path) | 同步 rmdir(). |
fs.mkdir(path[, mode], callback) | S異步 mkdir(2).回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 mode defaults to 0777. |
fs.mkdirSync(path[, mode]) | 同步 mkdir(). |
fs.readdir(path, callback) | 異步 readdir(3). 讀取目錄的內(nèi)容。 |
fs.readdirSync(path) | 同步 readdir().返回文件數(shù)組列表。 |
fs.close(fd, callback) | 異步 close().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.closeSync(fd) | 同步 close(). |
fs.open(path, flags[, mode], callback) | 異步打開(kāi)文件。 |
fs.openSync(path, flags[, mode]) | 同步 version of fs.open(). |
fs.utimes(path, atime, mtime, callback) | ? |
fs.utimesSync(path, atime, mtime) | 修改文件時(shí)間戳,文件通過(guò)指定的文件路徑。 |
fs.futimes(fd, atime, mtime, callback) | ? |
fs.futimesSync(fd, atime, mtime) | 修改文件時(shí)間戳,通過(guò)文件描述符指定。 |
fs.fsync(fd, callback) | 異步 fsync.回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |
fs.fsyncSync(fd) | 同步 fsync. |
fs.write(fd, buffer, offset, length[, position], callback) | 將緩沖區(qū)內(nèi)容寫(xiě)入到通過(guò)文件描述符指定的文件。 |
fs.write(fd, data[, position[, encoding]], callback) | 通過(guò)文件描述符 fd 寫(xiě)入文件內(nèi)容。 |
fs.writeSync(fd, buffer, offset, length[, position]) | 同步版的 fs.write()。 |
fs.writeSync(fd, data[, position[, encoding]]) | 同步版的 fs.write(). |
fs.read(fd, buffer, offset, length, position, callback) | 通過(guò)文件描述符 fd 讀取文件內(nèi)容。 |
fs.readSync(fd, buffer, offset, length, position) | 同步版的 fs.read. |
fs.readFile(filename[, options], callback) | 異步讀取文件內(nèi)容。 |
fs.readFileSync(filename[, options]) | |
fs.writeFile(filename, data[, options], callback) | 異步寫(xiě)入文件內(nèi)容。 |
fs.writeFileSync(filename, data[, options]) | 同步版的 fs.writeFile。 |
fs.appendFile(filename, data[, options], callback) | 異步追加文件內(nèi)容。 |
fs.appendFileSync(filename, data[, options]) | The 同步 version of fs.appendFile. |
fs.watchFile(filename[, options], listener) | 查看文件的修改。 |
fs.unwatchFile(filename[, listener]) | 停止查看 filename 的修改。 |
fs.watch(filename[, options][, listener]) | 查看 filename 的修改,filename 可以是文件或目錄。返回 fs.FSWatcher 對(duì)象。 |
fs.exists(path, callback) | 檢測(cè)給定的路徑是否存在。 |
fs.existsSync(path) | 同步版的 fs.exists. |
fs.access(path[, mode], callback) | 測(cè)試指定路徑用戶(hù)權(quán)限。 |
fs.accessSync(path[, mode]) | 同步版的 fs.access。 |
fs.createReadStream(path[, options]) | 返回ReadStream 對(duì)象。 |
fs.createWriteStream(path[, options]) | 返回 WriteStream 對(duì)象。 |
fs.symlink(srcpath, dstpath[, type], callback) | 異步 symlink().回調(diào)函數(shù)沒(méi)有參數(shù),但可能拋出異常。 |