有關Node模組化

2022-10-09 04:36:11 字數 4745 閱讀 5835

1、模組呼叫

我們先建立乙個模組,module.js

1 console.log("我是乙個模組。");

2var x = 10;

3var y = 20;

接著在另外乙個main.js檔案中呼叫這個模組。引入module.js需要require()函式

該函式需要被引入模組檔案的路徑作為引數,函式的返回值是乙個代表被引模組的物件

var md = require("./module.js");

其中引數路徑分為絕對路徑和相對路徑。在使用相對路徑時務必是 . 或 .. 開頭。這裡的兩個檔案在同一資料夾下

其中引數的 .js可以不寫

在命令列輸入node main.js,輸出我是乙個模組

這表示模組呼叫成功

此時我們想看看返回值md這個物件裡面有什麼,於是我們修改main.js

1

var md = require("./module.js");

2 console.log(md);

在命令列輸入node main.js,輸出

我是乙個模組

{}這個結果與我們所期待的,顯示出x和y不一樣

我們再試一次,修改main.js

1

var md = require("./module.js");

2console.log(md.x);

3 console.log(md.y);

在命令列輸入node main.js,輸出

我是乙個模組

undefined

undefined

這表示呼叫模組中的屬性失敗

2、要想使用被引用模組中的屬性或方法,必須在被引用模組的屬性或方法前加上exports

於是修改module.js

1 console.log("我是乙個模組");

2 exports.x = 10;

3var y = 20;

在命令列輸入node main.js,輸出

我是乙個模組

10undefined

以上屬於檔案模組,即使用者自己建立的模組拿來呼叫;另一類被稱為核心模組,它是node引擎提供的模組,不需要註明路徑。如

var fs = require("fs");

1、有關「隱藏的」函式

在module.js中,我們看到的幾行**是在全域性作用域下執行的,其實不然!

1 console.log("我是乙個模組");

2 exports.x = 10;

3var y = 20;

事實上有乙個」隱藏的「函式包含著這幾行**。這與上面提到的----"必須在被引用模組的屬性或方法前加上exports"照應。(本文最後我們會看到這件事)

即我們不能直接獲取md.x,而是通過exports.x獲取

現在在module.js中新增一行**,為的是使我們更直觀地理解「隱藏的函式」這件事

1 console.log("我是乙個模組");

2 exports.x = 10;

3var y = 20;

45 console.log(arguments.callee + "");

在命令列輸入node module.js,輸出

1

我是一塊模組

2function

(exports, require, module, __filename, __dirname)

不難看出加上的這句

console.log(arguments.callee + "");

產生了這樣的效果

1

function

(exports, require, module, __filename, __dirname)

我們一點點來看加上的這句。不妨先將module.js改為

1 console.log("我是乙個模組");

2 exports.x = 10;

3var y = 20;

45 console.log(arguments);

在命令列輸入node module.js,輸出

1

我是乙個模組

2[arguments] ,

4 '1': [function: require] ,

6main: module ,

15 extensions: [object: null

prototype] ,

20 cache: [object: null

prototype]

23},

24 '2': module ,

28 filename: 'd:\\前端\\node.js\\demo\\module.js',

29 loaded: false,30

children: ,

31paths: [

32 'd:\\前端\\node.js\\demo\\node_modules',

33 'd:\\前端\\node.js\\node_modules',

34 'd:\\前端\\node_modules',

35 'd:\\node_modules'36]

37},

38 '3': 'd:\\前端\\node.js\\demo\\module.js',

39 '4': 'd:\\前端\\node.js\\demo'

40 }

這裡的arguments是乙個偽陣列物件,用來封裝函式的實參

那麼是哪個函式呢?arguments的屬性callee可以幫助我們看到

該屬性儲存的是當前執行的函式物件

於是將module.js改為

1 console.log("我是乙個模組");

2 exports.x = 10;

3var y = 20;

45 console.log(arguments.callee);

在命令列輸入node module.js,輸出

1

我是乙個模組

2 [function (anonymous)]

其中anonymous意為匿名的

為了看到該函式的結構,我們再對它進行拼串操作

於是將module.js改為

1 console.log("我是乙個模組");

2 exports.x = 10;

3var y = 20;

45 console.log(arguments.callee + "");

就看到最開始的結果

1

我是乙個模組

2function

(exports, require, module, __filename, __dirname)

現在我們看到確實有乙個隱藏的函式存在,要呼叫模組必須使用require()和呼叫其中的屬性必須設定exports.x似乎也變得合理

該函式共有5個引數,你可以使用console.log()自行檢視,這裡不作演示

更多細節我們之後再說...

2、變數的作用域

在node中有乙個全域性變數global,在全域性中建立的變數都會作為 global 的屬性儲存,在全域性中建立的函式都會作為 global 的方法儲存

所謂全域性變數在建立時不加var即可

結合上面提到的x和y,我們修改module.js

1 console.log("我是乙個模組");

2 exports.x = 10;

3var y = 20;

4 z = 30;56

該行是不合法的

7console.log(y);

8console.log(z);

9console.log(global.x);

10console.log(global.y);

11 console.log(global.z);

在命令列輸入node module.js,輸出

1

我是乙個模組

2 20

3 30

4undefined

5undefined

6 30

這表明只有z是全域性變數

我們再來修改呼叫模組的main.js

1

var md = require("./module.js");

2 console.log("\n");

3console.log(md.x);

4console.log(md.y);

5console.log(md.z);67

該行是不合法的8//

console.log(y);該行是不合法的

9 console.log(z);

在命令列輸入node main.js,輸出

1

我是乙個模組

2 20

3 30

4undefined

5undefined

6 3078

9 10

10undefined

11undefined

12 30

node的模組化 2

模組化規範 amd cmd commonjs node.js 採用的就是 commonjs 的規範 自定義模組 根據自己的功能來實現的模組 第三方模組 npm 內建模組event fshttp 可以實現伺服器間的資料互動 urlquerystring stream path api 文件使用層級 1...

node初體驗 模組化

node遵循的是commonjs 規範。模組匯入匯出 匯出 module.exprots or exprots.a 10 exprots.b 匯入 require module const require module node modules 在node modules下的模組引入的時候可以直接寫...

node 模組化匯出匯入的方式

第一種 module.exports commonjs的寫法 匯出const age 15 module.exports age 匯入 此處的age 與匯出的 age 可以不一樣 const age require action.js console.log age 這種寫法也可以 const ag...