這篇文章主要講解了“Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用”吧!
十多年的泌陽(yáng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整泌陽(yáng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“泌陽(yáng)網(wǎng)站設(shè)計(jì)”,“泌陽(yáng)網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
1.0、變量作用域
(1)、在瀏覽器端使用var或不使用關(guān)鍵字定義的變量屬于全局作用域,也就是可以使用window對(duì)象訪問。
結(jié)果:
(2)、在Node.js中沒有window對(duì)象
(3)、在Node.js的交互環(huán)境下,定義的變量屬于global,global是類似瀏覽器端的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);
終端輸出:
1.1、模塊概要
早期的javascript版本沒有塊級(jí)作用域、沒有類、沒有包、也沒有模塊,這樣會(huì)帶來(lái)一些問題,如復(fù)用、依賴、沖突、代碼組織混亂等,隨著前端的膨脹,模塊化顯得非常迫切。
前端模塊化規(guī)范如下:
常見的的JavaScript模塊規(guī)范有:CommonJS、AMD、CMD、UMD、原生模塊化。
雖然我們學(xué)習(xí)過ES6的模塊化但是ES6與NodeJS使用不同的模塊化規(guī)范,單獨(dú)學(xué)習(xí)NodeJS的模塊化非常有必要。
模塊化是指解決一個(gè)復(fù)雜問題時(shí),自頂向下逐層把系統(tǒng)劃分成若干模塊的過程。對(duì)于整個(gè)系統(tǒng)來(lái)說,模塊是可組合、分解和更換 的單元。
JavaScript在早期的設(shè)計(jì)中就沒有模塊、包、類的概念,開發(fā)者需要模擬出類似的功能,來(lái)隔離、組織復(fù)雜的JavaScript代碼,我們稱為模塊化。
模塊就是一個(gè)實(shí)現(xiàn)特定功能的文件,有了模塊我們就可以更方便的使用別人的代碼,要用什么功能就加載什么模塊。
模塊化開發(fā)的四點(diǎn)好處:
(1)、 避免變量污染,命名沖突
(2)、提高代碼復(fù)用率
(3)、提高了可維護(hù)性
(4)、方便依賴關(guān)系管理
nodejs中根據(jù)模塊的來(lái)源不同,將模塊分為了3大類,分別是:
內(nèi)置模塊(內(nèi)置模塊是由Node.js官方提供的,例如fs、path、http等)
自定義模塊 (用戶創(chuàng)建的每個(gè) .js文件,都是自定義模塊)
第三方模塊 (由第三方開發(fā)出來(lái)的模塊,并非官方提供的內(nèi)置模塊,也不是用戶創(chuàng)建的自定義模塊,使用前需要先下載)
模塊作用域。
和函數(shù)作用域類似,在自定義模塊中定義的變量、方法等成員,只能在當(dāng)前模塊內(nèi)被訪問,這種模塊級(jí)別的訪問限制,叫做模塊作用域。
模塊作用域的好處:防止了全局變量污染的問題
1.2、CommonJS
CommonJS就是一個(gè)JavaScript模塊化的規(guī)范,該規(guī)范最初是用在let a=100;
b=200;
m2.js
var m11=require("./m1");
console.log(a);
console.log(b);
結(jié)果:
從上面的示例可以看出a在模塊2中是訪問不到的,模塊其實(shí)就是一個(gè)封閉的函數(shù):
m1.js的代碼如下:
console.log("這是模塊m1");
let a=100;
b=200;
//輸出當(dāng)前函數(shù)
console.log(arguments.callee+"");
實(shí)際輸出結(jié)果:
function (exports, require, module, __filename, __dirname) {
console.log("這是模塊m1");
let a=100;
b=200;
//輸出當(dāng)前函數(shù)
console.log(arguments.callee+"");
}
(6)、每個(gè)模塊中都包含如下5個(gè)對(duì)象:
exports:導(dǎo)出對(duì)象,默認(rèn)為{}
require:導(dǎo)入函數(shù),使用該函數(shù)可以實(shí)現(xiàn)模塊的依賴
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;
m2.js
const m1=require("./m1");
console.log(m1);
console.log(m1.a);
console.log(m1.b());
結(jié)果:
(8)、導(dǎo)入模塊內(nèi)容可以結(jié)合結(jié)構(gòu)語(yǔ)法
m1.js
exports.a=100;
exports.b=function(){
return 200;
};
m2.js
const {a,b:fun}=require("./m1");
console.log(a);
console.log(fun());
結(jié)果:
1.3、NodeJS中使用CommonJS模塊管理
CommonJS的核心思想就是通過 require 方法來(lái)同步加載所要依賴的其他模塊,然后通過 exports 或者 module.exports 來(lái)導(dǎo)出需要暴露的接口。
CommonJS API編寫應(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í)說,在瀏覽器環(huán)境下,以前沒有模塊也不是特別大的問題,畢竟網(wǎng)頁(yè)程序的復(fù)雜性有限;但是在服務(wù)器端,一定要有模塊,與操作系統(tǒng)和其他應(yīng)用程序互動(dòng),否則根本沒法編程。NodeJS是CommonJS規(guī)范的實(shí)現(xiàn),webpack 也是以CommonJS的形式來(lái)書寫。
CommonJS定義的模塊分為:{模塊引用(require)} {模塊定義(exports)} {模塊標(biāo)識(shí)(module)}
//require()用來(lái)引入外部模塊;
//exports對(duì)象用于導(dǎo)出當(dāng)前模塊的方法或變量,唯一的導(dǎo)出口;
//module對(duì)象就代表模塊本身。
Nodejs的模塊是基于CommonJS規(guī)范實(shí)現(xiàn)的,通過轉(zhuǎn)換也可以運(yùn)行在瀏覽器端。
特點(diǎn):
1、所有代碼都運(yùn)行在模塊作用域,不會(huì)污染全局作用域。
2、模塊可以多次加載,但是只會(huì)在第一次加載時(shí)運(yùn)行一次,然后運(yùn)行結(jié)果就被緩存了,以后再加載,就直接讀取緩存結(jié)果。要想讓模塊再次運(yùn)行,必須清除緩存。
3、模塊加載的順序,按照其在代碼中出現(xiàn)的順序。
根據(jù)commonJS規(guī)范,一個(gè)單獨(dú)的文件是一個(gè)模塊,每一個(gè)模塊都是一個(gè)單獨(dú)的作用域,也就是說,在該模塊內(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);
在 Node.js 中,創(chuàng)建一個(gè)模塊非常簡(jiǎn)單,如下我們創(chuàng)建一個(gè) 'main.js' 文件,代碼如下:
var hello = require('./hello');
hello.world();
以上實(shí)例中,代碼 require('./hello') 引入了當(dāng)前目錄下的hello.js文件(./ 為當(dāng)前目錄,node.js默認(rèn)后綴為js)。
Node.js 提供了exports 和 require 兩個(gè)對(duì)象,其中 exports 是模塊公開的接口,require 用于從外部獲取一個(gè)模塊的接口,即所獲取模塊的 exports 對(duì)象。
接下來(lái)我們就來(lái)創(chuàng)建hello.js文件,代碼如下:
exports.world = function() {
console.log('Hello World');
}
在以上示例中,hello.js 通過 exports 對(duì)象把 world 作為模塊的訪 問接口,在 main.js 中通過 require('./hello') 加載這個(gè)模塊,然后就可以直接訪 問main.js 中 exports 對(duì)象的成員函數(shù)了。
有時(shí)候我們只是想把一個(gè)對(duì)象封裝到模塊中,格式如下:
module.exports = function() { // ...}
例如:
//hello.js
function Hello() {
varname;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
這樣就可以直接獲得這個(gè)對(duì)象了:
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
模塊接口的唯一變化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用該模塊時(shí),其接口對(duì)象就是要輸出的 Hello 對(duì)象本身,而不是原先的 exports。
加載模塊用require方法,該方法讀取一個(gè)文件并且執(zhí)行,返回文件內(nèi)部的module.exports對(duì)象。
在用require加載自定義模塊期間,可以省略.js這個(gè)后綴名。
myApp.js 模塊依賴
var math=require('./mathLib');
console.log(math.message);
math.add(333,888);
3、測(cè)試運(yùn)行
安裝好node.JS
打開控制臺(tái),可以使用cmd命令,也可以直接在開發(fā)工具中訪問
運(yùn)行
也許你已經(jīng)注意到,我們已經(jīng)在代碼中使用了模塊了。像這樣:
var http = require("http");
...
http.createServer(...);
Node.js中自帶了一個(gè)叫做"http"的模塊,我們?cè)谖覀兊拇a中請(qǐng)求它并把返回值賦給一個(gè)本地變量。
這把我們的本地變量變成了一個(gè)擁有所有 http 模塊所提供的公共方法的對(duì)象。
Node.js 的 require方法中的文件查找策略如下:
由于Node.js中存在4類模塊(原生模塊和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ū)沒有被加載過,則調(diào)用原生模塊的加載方式進(jìn)行加載和執(zhí)行。
從文件加載
當(dāng)文件模塊緩存中不存在,而且不是原生模塊的時(shí)候,Node.js會(huì)解析require方法傳入的參數(shù),并從文件系統(tǒng)中加載實(shí)際的文件,加載過程中的包裝和編譯細(xì)節(jié)在前一節(jié)中已經(jīng)介紹過,這里我們將詳細(xì)描述查找文件模塊的過程,其中,也有一些細(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ù)它們。
在每個(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 提供一組類似 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)。
建議大家是用異步方法,比起同步,異步方法性能更高,速度更快,而且沒有阻塞。
實(shí)例
創(chuàng)建 input.txt 文件,內(nèi)容如下:
foo
創(chuàng)建 filereaddemo.js 文件, 代碼如下:
const fs=require("fs"); //依賴內(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+"");
以上代碼執(zhí)行結(jié)果如下:
接下來(lái),讓我們來(lái)具體了解下 Node.js 文件系統(tǒng)的方法。
2.2、獲取文件信息
以下為通過異步模式獲取文件信息的語(yǔ)法格式:
fs.stat(path, callback)
參數(shù)使用說明如下:
path - 文件路徑。
callback - 回調(diào)函數(shù),帶有兩個(gè)參數(shù)如:(err, stats), stats 是 fs.Stats 對(duì)象。
fs.stat(path)執(zhí)行后,會(huì)將stats類的實(shí)例返回給其回調(diào)函數(shù)??梢酝ㄟ^stats類中的提供方法判斷文件的相關(guān)屬性。例如判斷是否為文件:
const fs=require("fs");
fs.stat("students.txt",(err,stats)=>{
console.log("是文件嗎?"+stats.isFile());
console.log("是目錄嗎?"+stats.isDirectory());
console.log(stats);
});
結(jié)果:
stats類中的方法有:
方法 | 描述 |
---|---|
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中的一種特殊類型的命令管道。 |
stats.isSocket() | 如果是 Socket 返回 true,否則返回 false。 |
接下來(lái)我們創(chuàng)建 file.js 文件,代碼如下所示:
var fs = require("fs");
console.log("準(zhǔn)備打開文件!");
fs.stat('input.txt', function (err, stats) {
if (err) {
return console.error(err);
}
console.log(stats);
console.log("讀取文件信息成功!");
// 檢測(cè)文件類型
console.log("是否為文件(isFile) ? " + stats.isFile());
console.log("是否為目錄(isDirectory) ? " + stats.isDirectory());
});
以上代碼執(zhí)行結(jié)果如下:
$ node file.js
準(zhǔn)備打開文件!
{ 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、寫入文件
以下為異步模式下寫入文件的語(yǔ)法格式:
fs.writeFile(filename, data[, options], callback)
如果文件存在,該方法寫入的內(nèi)容會(huì)覆蓋舊的文件內(nèi)容。
參數(shù)使用說明如下:
path - 文件路徑。
data - 要寫入文件的數(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),在寫入失敗時(shí)返回。
接下來(lái)我們創(chuàng)建 file.js 文件,代碼如下所示:
const fs=require("fs");
fs.writeFile("output1.txt","異步hello","utf-8",function(err){
if(!err){
console.log("異步文件寫入成功!");
}
else{
throw err;
}
});
console.log("---------------");
fs.writeFileSync("output2.txt","同步hello","utf-8");
console.log("同步文件寫入成功");
以上代碼執(zhí)行結(jié)果如下:
2.4、刪除文件
以下為刪除文件的語(yǔ)法格式:
fs.unlink(path, callback)
參數(shù)使用說明如下:
path - 文件路徑。
callback - 回調(diào)函數(shù),沒有參數(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("同步刪除文件成功!");
以上代碼執(zhí)行結(jié)果如下:
2.5、創(chuàng)建目錄
以下為創(chuàng)建目錄的語(yǔ)法格式:
fs.mkdir(path[, mode], callback)
參數(shù)使用說明如下:
path - 文件路徑。
mode - 設(shè)置目錄權(quán)限,默認(rèn)為 0777。
callback - 回調(diào)函數(shù),沒有參數(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)建目錄成功!");
以上代碼執(zhí)行結(jié)果如下:
2.6、讀取目錄
以下為讀取目錄的語(yǔ)法格式:
fs.readdir(path, callback)
參數(shù)使用說明如下:
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));
以上代碼執(zhí)行結(jié)果如下:
2.7、刪除目錄
以下為刪除目錄的語(yǔ)法格式:
fs.rmdir(path, callback)
參數(shù)使用說明如下:
path - 文件路徑。
callback - 回調(diào)函數(shù),沒有參數(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 );
});
});
});
以上代碼執(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ù)沒有參數(shù),但可能拋出異常。 |
fs.ftruncate(fd, len, callback) | 異步 ftruncate().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.ftruncateSync(fd, len) | 同步 ftruncate() |
fs.truncate(path, len, callback) | 異步 truncate().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.truncateSync(path, len) | 同步 truncate() |
fs.chown(path, uid, gid, callback) | 異步 chown().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.chownSync(path, uid, gid) | 同步 chown() |
fs.fchown(fd, uid, gid, callback) | 異步 fchown().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.fchownSync(fd, uid, gid) | 同步 fchown() |
fs.lchown(path, uid, gid, callback) | 異步 lchown().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.lchownSync(path, uid, gid) | 同步 lchown() |
fs.chmod(path, mode, callback) | 異步 chmod().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.chmodSync(path, mode) | 同步 chmod(). |
fs.fchmod(fd, mode, callback) | 異步 fchmod().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.fchmodSync(fd, mode) | 同步 fchmod(). |
fs.lchmod(path, mode, callback) | 異步 lchmod().回調(diào)函數(shù)沒有參數(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ù)沒有參數(shù),但可能拋出異常。 |
fs.linkSync(srcpath, dstpath) | 同步 link(). |
fs.symlink(srcpath, dstpath[, type], callback) | 異步 symlink().回調(diào)函數(shù)沒有參數(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ù)沒有參數(shù),但可能拋出異常。 |
fs.unlinkSync(path) | 同步 unlink(). |
fs.rmdir(path, callback) | 異步 rmdir().回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.rmdirSync(path) | 同步 rmdir(). |
fs.mkdir(path[, mode], callback) | S異步 mkdir(2).回調(diào)函數(shù)沒有參數(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ù)沒有參數(shù),但可能拋出異常。 |
fs.closeSync(fd) | 同步 close(). |
fs.open(path, flags[, mode], callback) | 異步打開文件。 |
fs.openSync(path, flags[, mode]) | 同步 version of fs.open(). |
fs.utimes(path, atime, mtime, callback) | ? |
fs.utimesSync(path, atime, mtime) | 修改文件時(shí)間戳,文件通過指定的文件路徑。 |
fs.futimes(fd, atime, mtime, callback) | ? |
fs.futimesSync(fd, atime, mtime) | 修改文件時(shí)間戳,通過文件描述符指定。 |
fs.fsync(fd, callback) | 異步 fsync.回調(diào)函數(shù)沒有參數(shù),但可能拋出異常。 |
fs.fsyncSync(fd) | 同步 fsync. |
fs.write(fd, buffer, offset, length[, position], callback) | 將緩沖區(qū)內(nèi)容寫入到通過文件描述符指定的文件。 |
fs.write(fd, data[, position[, encoding]], callback) | 通過文件描述符 fd 寫入文件內(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) | 通過文件描述符 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) | 異步寫入文件內(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è)試指定路徑用戶權(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ù)沒有參數(shù),但可能拋出異常。 |
3.0、讀取自定義配置文件數(shù)據(jù)
創(chuàng)立一個(gè) config
目錄并向其中增加一個(gè) config/default.json
文件。這將是默認(rèn)配置文件,并將蘊(yùn)含所有默認(rèn)環(huán)境變量。
在咱們的示例應(yīng)用程序中它應(yīng)該是這樣的:
config/default.json
{
"student":{
"name":"tom",
"age":19
}
}
先依賴模塊config,
npm i config
咱們將在咱們的應(yīng)用程序中通過導(dǎo)入 config
和應(yīng)用 get
辦法拜訪變量來(lái)訪問它。
const config=require("config");
console.log(config.get("student.name"));
console.log(config.get("student.age"));
運(yùn)行結(jié)果:
3.1、讀取package.json配置參數(shù)
用于添加命令行的環(huán)境變量
package.json 可以配置config
腳本中 (see npm-scripts) package.json “config” 字段會(huì)被環(huán)境變量覆蓋
例如,下面的package.json:
代碼中使用 process.env['npm_package_config_xxxxxx'] 獲取配置的內(nèi)容
package.json
{
"name": "demo06",
"config": {
"foo": "123456"
},
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start":"node configtest.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"config": "^3.3.7"
}
}
configtest.js
console.log(process.env.npm_package_config_foo);
直接運(yùn)行(node configtest.js)結(jié)果:
直接在命令行執(zhí)行 node configtest,會(huì)輸出undefined
使用 npm run start,會(huì)輸出 123456
npm 設(shè)置包的config
npm config set foo = 3000 就可以修改默認(rèn)的配置內(nèi)容
然后再執(zhí)行 npm test 會(huì)輸出 3000
3.2、環(huán)境變量的設(shè)置與讀取
文件.env
USER_ID="239482"
USER_KEY="foobar"
NODE_ENV="development"
m3.js
npm i dotenv //依賴模塊
require("dotenv").config();
console.log(process.env.USER_ID);
輸出結(jié)果:
239482
3.3、獲取系統(tǒng)中的環(huán)境變量
命令行下操作環(huán)境變量
輸入 set 即可查看。
輸入 “set 變量名”即可。比如想查看path變量的值,即輸入 set path
注意:所有的在cmd命令行下對(duì)環(huán)境變量的修改只對(duì)當(dāng)前窗口有效,不是永久性的修改。也就是說當(dāng)關(guān)閉此cmd命令行窗口后,將不再起作用。
永久性修改環(huán)境變量的方法有兩種:一種是直接修改注冊(cè)表,另一種是通過我的電腦-〉屬性-〉高級(jí),來(lái)設(shè)置系統(tǒng)的環(huán)境變量(查看詳細(xì))。
輸入 “set 變量名=變量?jī)?nèi)容”即可。比如將path設(shè)置為“d:\nmake.exe”,只要輸入set path="d:\nmake.exe"。
注意,此修改環(huán)境變量是指用現(xiàn)在的內(nèi)容去覆蓋以前的內(nèi)容,并不是追加。比如當(dāng)我設(shè)置了上面的path路徑之后,如果我再重新輸入set path="c",再次查看path路徑的時(shí)候,其值為“c:”,而不是“d:\nmake.exe”;“c”。
如果想將某一變量設(shè)置為空,輸入“set 變量名=”即可。
如“set path=” 那么查看path的時(shí)候就為空。注意,上面已經(jīng)說了,只在當(dāng)前命令行窗口起作用。因此查看path的時(shí)候不要去右擊“我的電腦”——“屬性”........
輸入“set 變量名=%變量名%;變量?jī)?nèi)容”。(不同于3,那個(gè)是覆蓋)。如,為path添加一個(gè)新的路徑,輸入“ set path=%path%;d:\nmake.exe”即可將d:\nmake.exe添加到path中,再次執(zhí)行"set path=%path%;c:",那么,使用set path語(yǔ)句來(lái)查看的時(shí)候,將會(huì)有:d:\nmake.exe;c:,而不是像第3步中的只有c:。
%AllUsersProfile%: 局部 返回所有“用戶配置文件”的位置。 {所有用戶文件目錄 – C:\Documents and Settings\All Users}
%AppData%: 局部 返回默認(rèn)情況下應(yīng)用程序存儲(chǔ)數(shù)據(jù)的位置。 {當(dāng)前用戶數(shù)據(jù)文件夾 – C:\Documents and Settings\wy\Application Data}
%Cd%: 局部 返回當(dāng)前目錄字符串。
%CmdCmdLine%: 局部 返回用來(lái)啟動(dòng)當(dāng)前的 Cmd.exe 的準(zhǔn)確命令行。
%CmdExtVersion%: 系統(tǒng) 返回當(dāng)前的“命令處理程序擴(kuò)展”的版本號(hào)。
%CommonProgramFiles%: {文件通用目錄 – C:\Program Files\Common Files}
%ComputerName%: 系統(tǒng) 返回計(jì)算機(jī)的名稱。 {計(jì)算機(jī)名 – IBM-B63851E95C9}
%ComSpec%: 系統(tǒng) 返回命令行解釋器可執(zhí)行程序的準(zhǔn)確路徑。 C:\WINDOWS\system32\cmd.exe
%Date%: 系統(tǒng) 返回當(dāng)前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關(guān) date 命令的詳細(xì)信息,請(qǐng)參閱 Date。
%ErrorLevel%: 系統(tǒng) 返回最近使用過的命令的錯(cuò)誤代碼。通常用非零值表示錯(cuò)誤。
%HomeDrive%: 系統(tǒng) 返回連接到用戶主目錄的本地工作站驅(qū)動(dòng)器號(hào)?;谥髂夸浿档脑O(shè)置。用戶主目錄是在“本地用戶和組”中指定的。 {當(dāng)前用戶根目錄 – C:}
%HomePath%: 系統(tǒng) 返回用戶主目錄的完整路徑?;谥髂夸浿档脑O(shè)置。用戶主目錄是在“本地用戶和組”中指定的。 {當(dāng)前用戶路徑 – \Documents and Settings\wy}
%HomeShare%: 系統(tǒng) 返回用戶的共享主目錄的網(wǎng)絡(luò)路徑?;谥髂夸浿档脑O(shè)置。用戶主目錄是在“本地用戶和組”中指定的。
%LogonSever%: 局部 返回驗(yàn)證當(dāng)前登錄會(huì)話的域控制器的名稱。
%Number_Of_Processors%: 系統(tǒng) 指定安裝在計(jì)算機(jī)上的處理器的數(shù)目。 {處理器個(gè)數(shù) – 1}
%Os%: 系統(tǒng) 返回操作系統(tǒng)的名稱。Windows 2000 將操作系統(tǒng)顯示為 Windows_NT。 {操作系統(tǒng)名 – Windows_NT}
%Path%: 系統(tǒng) 指定可執(zhí)行文件的搜索路徑。
%PathExt%: 系統(tǒng) 返回操作系統(tǒng)認(rèn)為可執(zhí)行的文件擴(kuò)展名的列表。
%Processor_Architecture%: 系統(tǒng) 返回處理器的芯片體系結(jié)構(gòu)。值: x86,IA64。 {處理器芯片架構(gòu) – x86}
%Processor_Identfier%: 系統(tǒng) 返回處理器說明。
%Processor_Level%: 系統(tǒng) 返回計(jì)算機(jī)上安裝的處理器的型號(hào)。 {處理器型號(hào) – 6}
%Processor_Revision%: 系統(tǒng) 返回處理器修訂號(hào)的系統(tǒng)變量。 {處理器修訂號(hào) – 0905}
%ProgramFiles%: {程序默認(rèn)安裝目錄 – C:\Program Files}
%Prompt%: 局部 返回當(dāng)前解釋程序的命令提示符設(shè)置。由 Cmd.exe 生成。 $P$G
%Random%: 系統(tǒng) 返回 0 到 32767 之間的任意十進(jìn)制數(shù)字。由 Cmd.exe 生成。
%SystemDrive%: 系統(tǒng) 返回包含 Windows XP 根目錄(即系統(tǒng)根目錄)的驅(qū)動(dòng)器。 {系統(tǒng)根目錄 – C:}
%SystemRoot%: 系統(tǒng) 返回 Windows XP 根目錄的位置。 {系統(tǒng)目錄 – C:\WINDOWS}
%Temp%: 系統(tǒng)和用戶 返回對(duì)當(dāng)前登錄用戶可用的應(yīng)用程序所使用的默認(rèn)臨時(shí)目錄。有些應(yīng)用程序需要 TEMP,而其它應(yīng)用程序則需要 TMP。 {當(dāng)前用戶臨時(shí)文件夾 – C:\DOCUME~1\wy\LOCALS~1\Temp}
%Time%: 系統(tǒng) 返回當(dāng)前時(shí)間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。9:16:25.05
%UserDomain%: 局部 返回包含用戶帳戶的域的名稱。 {包含用戶帳號(hào)的域 – IBM-B63851E95C9}
%UserName%: 局部 返回當(dāng)前登錄的用戶的名稱。 {當(dāng)前用戶名 – wy}
%UserProfile%: 局部 返回當(dāng)前用戶的配置文件的位置。 {當(dāng)前用戶目錄 – C:\Documents and Settings\wy}
%WinDir%: 系統(tǒng) 返回操作系統(tǒng)目錄的位置。 {系統(tǒng)目錄 – C:\WINDOWS}
假定當(dāng)前的系統(tǒng)環(huán)境變量定義如下,注意JAVA_HOME:
m3.js
console.log(process.env.JAVA_HOME);
輸出:
a,b在系統(tǒng)中已定義好
注意當(dāng)前的終端是cmd,不是powershell
這里a輸出123的原因是修改成888后沒有重啟電腦。
感謝各位的閱讀,以上就是“Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!