溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

發(fā)布時(shí)間:2022-12-29 09:56:09 來(lái)源:億速云 閱讀:95 作者:iii 欄目:web開(kāi)發(fā)

這篇文章主要講解了“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)用”吧!

一、Node.js模塊化

1.0、變量作用域

(1)、在瀏覽器端使用var或不使用關(guān)鍵字定義的變量屬于全局作用域,也就是可以使用window對(duì)象訪問(wèn)。

    <script>
     var a = 100;

     (function () {
       b = 200;
     })();

     console.log(window.a, a);
     console.log(window.b, b);
   </script>

結(jié)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

(2)、在Node.js中沒(méi)有window對(duì)象

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

(3)、在Node.js的交互環(huán)境下,定義的變量屬于global,global是類似瀏覽器端的window對(duì)象

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

(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);

終端輸出:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

1.1、模塊概要

早期的javascript版本沒(méi)有塊級(jí)作用域、沒(méi)有類、沒(méi)有包、也沒(méi)有模塊,這樣會(huì)帶來(lái)一些問(wèn)題,如復(fù)用、依賴、沖突、代碼組織混亂等,隨著前端的膨脹,模塊化顯得非常迫切。

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

前端模塊化規(guī)范如下:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

常見(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)有模塊、包、類的概念,開(kāi)發(fā)者需要模擬出類似的功能,來(lái)隔離、組織復(fù)雜的JavaScript代碼,我們稱為模塊化。

模塊就是一個(gè)實(shí)現(xiàn)特定功能的文件,有了模塊我們就可以更方便的使用別人的代碼,要用什么功能就加載什么模塊。

模塊化開(kāi)發(fā)的四點(diǎn)好處:

 ?。?)、 避免變量污染,命名沖突

  (2)、提高代碼復(fù)用率

 ?。?)、提高了可維護(hù)性

 ?。?)、方便依賴關(guān)系管理

nodejs中根據(jù)模塊的來(lái)源不同,將模塊分為了3大類,分別是:

  • 內(nèi)置模塊(內(nèi)置模塊是由Node.js官方提供的,例如fs、path、http等)

  • 自定義模塊 (用戶創(chuàng)建的每個(gè) .js文件,都是自定義模塊)

  • 第三方模塊 (由第三方開(kāi)發(fā)出來(lái)的模塊,并非官方提供的內(nèi)置模塊,也不是用戶創(chuàng)建的自定義模塊,使用前需要先下載)

模塊作用域。

和函數(shù)作用域類似,在自定義模塊中定義的變量、方法等成員,只能在當(dāng)前模塊內(nèi)被訪問(wèn),這種模塊級(jí)別的訪問(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í)作用域,在其它模塊中不能直接訪問(wèn)

m1.js:

console.log("這是模塊m1");
let a=100;
b=200;

m2.js

var m11=require("./m1");
console.log(a);
console.log(b);

結(jié)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

從上面的示例可以看出a在模塊2中是訪問(wèn)不到的,模塊其實(shí)就是一個(gè)封閉的函數(shù):

m1.js的代碼如下:

console.log("這是模塊m1");
let a=100;
b=200;
//輸出當(dāng)前函數(shù)
console.log(arguments.callee+"");

實(shí)際輸出結(jié)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

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)為{}

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

require:導(dǎo)入函數(shù),使用該函數(shù)可以實(shí)現(xiàn)模塊的依賴

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

module:模塊信息,用于記錄當(dāng)前模塊的所有信息

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

__filename:當(dāng)前模塊的文件全路徑,含文件名

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

__dirname:當(dāng)前模塊的文件路徑不含文件名

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yī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é)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

(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é)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

1.3、NodeJS中使用CommonJS模塊管理

CommonJS的核心思想就是通過(guò) require 方法來(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ì)象就代表模塊本身。

Nodejs的模塊是基于CommonJS規(guī)范實(shí)現(xiàn)的,通過(guò)轉(zhuǎn)換也可以運(yùn)行在瀏覽器端。

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

特點(diǎn):

1、所有代碼都運(yùn)行在模塊作用域,不會(huì)污染全局作用域。

2、模塊可以多次加載,但是只會(huì)在第一次加載時(shí)運(yùn)行一次,然后運(yùn)行結(jié)果就被緩存了,以后再加載,就直接讀取緩存結(jié)果。要想讓模塊再次運(yùn)行,必須清除緩存。

3、模塊加載的順序,按照其在代碼中出現(xiàn)的順序。

1.3.1、模塊定義

根據(jù)commonJS規(guī)范,一個(gè)單獨(dú)的文件是一個(gè)模塊,每一個(gè)模塊都是一個(gè)單獨(dú)的作用域,也就是說(shuō),在該模塊內(nèi)部定義的變量,無(wú)法被其他模塊讀取,除非為global對(duì)象的屬性。

模塊擁有像函數(shù)一樣的函數(shù)級(jí)作用域:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

  • 每個(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 是模塊公開(kāi)的接口,require 用于從外部獲取一個(gè)模塊的接口,即所獲取模塊的 exports 對(duì)象。

接下來(lái)我們就來(lái)創(chuàng)建hello.js文件,代碼如下:

exports.world = function() {
 console.log('Hello World');
}

在以上示例中,hello.js 通過(guò) exports 對(duì)象把 world 作為模塊的訪 問(wèn)接口,在 main.js 中通過(guò) require('./hello') 加載這個(gè)模塊,然后就可以直接訪 問(wèn)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。

1.3.2、模塊依賴

加載模塊用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

打開(kāi)控制臺(tái),可以使用cmd命令,也可以直接在開(kāi)發(fā)工具中訪問(wèn)

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

運(yùn)行

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

1.3.3、內(nèi)置模塊加載

也許你已經(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í)也各自不同。如下圖所示:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

從文件模塊緩存中加載

盡管原生模塊與文件模塊的優(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)的信息

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

每個(gè)模塊內(nèi)部,module變量代表當(dāng)前模塊
module變量是一個(gè)對(duì)象,它的exports屬性(即module.exports)是對(duì)外的接口
加載某個(gè)模塊,其實(shí)是加載該模塊的module.exports屬性。require()方法用于加載模塊。

二、Node.js 文件系統(tǒng)

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)。

建議大家是用異步方法,比起同步,異步方法性能更高,速度更快,而且沒(méi)有阻塞。

實(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é)果如下:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

接下來(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類的實(shí)例返回給其回調(diào)函數(shù)??梢酝ㄟ^(guò)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é)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

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)備打開(kāi)文件!");
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)備打開(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ě)入成功");

以上代碼執(zhí)行結(jié)果如下:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

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("同步刪除文件成功!");

以上代碼執(zhí)行結(jié)果如下:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

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)建目錄成功!");

以上代碼執(zhí)行結(jié)果如下:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

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));

以上代碼執(zhí)行結(jié)果如下:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

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 );
     });
  });
});

以上代碼執(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è)試指定路徑用戶權(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ù),但可能拋出異常。

三、參數(shù)與環(huán)境變量

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)用程序中通過(guò)導(dǎo)入 config 和應(yīng)用 get 辦法拜訪變量來(lái)訪問(wèn)它。

const config=require("config");
console.log(config.get("student.name"));
console.log(config.get("student.age"));

運(yùn)行結(jié)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

3.1、讀取package.json配置參數(shù)

用于添加命令行的環(huán)境變量

package.json 可以配置config
腳本中 (see npm-scripts) package.json “config” 字段會(huì)被環(huán)境變量覆蓋
<name>[@<version>]:<key>
例如,下面的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é)果:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

直接在命令行執(zhí)行 node configtest,會(huì)輸出undefined

使用 npm run start,會(huì)輸出 123456

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

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

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

3.3、獲取系統(tǒng)中的環(huán)境變量

命令行下操作環(huán)境變量

3.3.1、查看當(dāng)前所有可用的環(huán)境變量

輸入 set 即可查看。

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

3.3.2、查看某個(gè)環(huán)境變量

輸入 “set 變量名”即可。比如想查看path變量的值,即輸入 set path

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

3.3.3、修改環(huán)境變量

注意:所有的在cmd命令行下對(duì)環(huán)境變量的修改只對(duì)當(dāng)前窗口有效,不是永久性的修改。也就是說(shuō)當(dāng)關(guān)閉此cmd命令行窗口后,將不再起作用。

永久性修改環(huán)境變量的方法有兩種:一種是直接修改注冊(cè)表,另一種是通過(guò)我的電腦-〉屬性-〉高級(jí),來(lái)設(shè)置系統(tǒng)的環(huán)境變量(查看詳細(xì))。

1、修改環(huán)境變量

輸入 “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”。

2、設(shè)置為空:

如果想將某一變量設(shè)置為空,輸入“set 變量名=”即可。

如“set path=” 那么查看path的時(shí)候就為空。注意,上面已經(jīng)說(shuō)了,只在當(dāng)前命令行窗口起作用。因此查看path的時(shí)候不要去右擊“我的電腦”——“屬性”........

3、給變量追加內(nèi)容

輸入“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:。

3.3.4、一些常用的環(huán)境變量

  • %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) 返回最近使用過(guò)的命令的錯(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) 返回處理器說(shuō)明。

  • %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:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

m3.js

console.log(process.env.JAVA_HOME);

輸出:

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

a,b在系統(tǒng)中已定義好

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

注意當(dāng)前的終端是cmd,不是powershell

Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用

這里a輸出123的原因是修改成888后沒(méi)有重啟電腦。

感謝各位的閱讀,以上就是“Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Node中的模塊化、文件系統(tǒng)與環(huán)境變量怎么應(yīng)用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI