在這篇文章中,我將介紹如何在 Node.js 中使用模塊,重點是如何導出和消費它們。 由于 JAVAScript 最初沒有模塊的概念,因此隨著時間的推移,出現了各種相互競爭的格式。下面列出了需要注意的主要格式: 請注意,本文僅涉及 Node.js 的標準 Node.js帶來了一系列內置模塊,這樣我們就可以直接在代碼中使用而不需要安裝它們。要使用它們,我們需要使用 舉個例子,要羅列出目錄下的內容,可以使用文件系統模塊,以及該模塊的 請注意,在 CommonJS 中,模塊是同步加載的,并按照模塊出現的順序進行處理。 現在,讓我們看看如何創建自己的模塊并導出它。創建 然后在同一文件夾下創建 使用 發生了啥?好吧,如果你查看 我們可以用同樣的方式導出多個方法和值: 在 上述代碼的產出是: 注意我們給導出的 我還應該提到,可以在導出過程中導出方法和值,而不僅僅是在文件末尾導出。 舉個例子: 多虧了解構賦值,我們可以挑選想要導入的方法: 上面的示例中,我們單獨導出了函數和值。這對于整個應用程序都可能需要的輔助函數來說非常方便,但當你有一個只導出一樣東西的模塊時,使用 在 代碼輸出如下: 在開源世界里,你可以會遇到下列語法: 在這里,我們將想要導出的函數和值分配給 那么, 有點,但不完全是…… 為了闡明我的意思,我們更改 輸出如下: 正如你看到的, 輸出如下: 為 由于 這段代碼將導致模塊的導出對象為 不過,有一個注意事項。無論你將什么賦值給 那么,請看下面的內容: 這樣只會導出一個匿名函數。 模塊已成為 JavaScript 生態系統不可或缺的一部分,它使我們能夠將較小的部分組成大型程序。我希望本文能為你介紹如何在 Node.js 中使用模塊,并幫助你揭開模塊語法的神秘面紗。 以上就是本文的全部內容,如果對你有所幫助,歡迎點贊、收藏、轉發~ Asynchronous Module Definition (AMD):https://en.wikipedia.org/wiki/Asynchronous_module_definition CommonJS (CJS):https://en.wikipedia.org/wiki/CommonJS System.register:https://Github.com/systemjs/systemjs/blob/master/docs/system-register.md Universal Module Definition (UMD):https://riptutorial.com/javascript/example/16339/universal-module-definition--umd-各種模塊格式
define
函數來定義模塊。require
和module.exports
來定義依賴和模塊。npm 生態系統就是基于這種格式構建的。ES Module (ESM)
格式。從 ES6(ES2015)開始,JavaScript 支持原生模塊格式。它使用 export
關鍵字導出模塊的公共 API,使用 import
關鍵字導入模塊。CommonJS
格式。引入模塊
require
關鍵字引入模塊,并賦值給變量。然后就可以用它來調用模塊公開的任何方法。readdir
方法:
const fs = require('fs');
const folderPath = '/home/jim/Desktop/';
fs.readdir(folderPath, (err, files) => {
files.forEach(file => {
console.log(file);
});
});
創建并導出模塊
user.js
文件并添加下列代碼:
const getName = () => {
return 'Jim';
};
exports.getName = getName;
index.js
,并添加下列代碼:
const user = require('./user');
console.log(`User: ${user.getName()}`);
node index.js
運行代碼,你會在終端上看到下列輸出:
User: Jim
user.js
文件,你會注意到我們定義了一個getName
函數,然后使用exports
關鍵字讓它在任意導入的地方可用。在index.js
中,我們導入了該函數并執行了它。還需要注意require
語句,該模型名稱有著./
前綴,意味著它是本地文件。還要注意的是,此處不需要添加文件擴展名。導出多個方法和值
const getName = () => {
return 'Jim';
};
const getLocation = () => {
return 'Munich';
};
const dateOfBirth = '12.01.1982';
exports.getName = getName;
exports.getLocation = getLocation;
exports.dob = dateOfBirth;
index.js
中這么使用:
const user = require('./user');
console.log(
`${user.getName()} lives in ${user.getLocation()} and was born on ${user.dob}.`
);
Jim lives in Munich and was born on 12.01.1982.
dateOfBirth
變量起的名字可以是任何我們喜歡的名字(本例中為 dob
)。它不必與原始變量名相同。語法的變化
exports.getName = () => {
return 'Jim';
};
exports.getLocation = () => {
return 'Munich';
};
exports.dob = '12.01.1982';
const { getName, dob } = require('./user');
console.log(
`${getName()} was born on ${dob}.`
);
導出默認值
module.exports
會更常見:
class User {
constructor(name, age, emAIl) {
this.name = name;
this.age = age;
this.email = email;
}
getUserStats() {
return `
Name: ${this.name}
Age: ${this.age}
Email: ${this.email}
`;
}
}
module.exports = User;
index.js
中:
const User = require('./user');
const jim = new User('Jim', 37, 'jim@example.com');
console.log(jim.getUserStats());
Name: Jim
Age: 37
Email: jim@example.com
module.exports和exports的區別
module.exports = {
getName: () => {
return 'Jim';
},
getLocation: () => {
return 'Munich';
},
dob: '12.01.1982',
};
module
上的 exports
屬性,當然,這樣做效果很好:
const { getName, dob } = require('./user');
console.log(
`${getName()} was born on ${dob}.`
);
module.exports
和exports
的不同之處是什么?一個只是另一個的別名嗎?index.js
中的代碼,打印module
的值:
console.log(module);
Module {
id: '.',
exports: {},
parent: null,
filename: '/home/jim/Desktop/index.js',
loaded: false,
children: [],
paths:
[ '/home/jim/Desktop/node_modules',
'/home/jim/node_modules',
'/home/node_modules',
'/node_modules' ] }
module
有一個exports
屬性。在exports
上添加一些東西:
// index.js
exports.foo = 'foo';
console.log(module);
Module {
id: '.',
exports: { foo: 'foo' },
...
exports
分配的屬性也會將它們添加到 module.exports
。這是因為(至少最初)exports
是對 module.exports
的引用。應該用哪個
module.exports
和 exports
都指向同一個對象,因此使用哪個通常并不重要。例如:
exports.foo = 'foo';
module.exports.bar = 'bar';
{ foo: 'foo', bar: 'bar' }
。module.exports
,都將從你的模塊中導出什么。
exports.foo = 'foo';
module.exports = () => { console.log('bar'); };
foo
變量將被忽略。總結
參考資料