Node.js 模組系統入門
在程式設計領域中,模組是自包含的功能單元,可以跨專案共享和重用。它們使開發人員的生活更加輕鬆,因為我們可以使用它來增加應用程式的功能,而不必親自編寫這些功能。它還讓我們可以組織和解耦程式碼,從而使應用程式更容易理解、除錯和維護。
在本文中,我們來探究如何使用 Node.js 中的模組,主要介紹如何匯出和匯入。
不同的模組格式
由於JavaScript 最初沒有模組的概念,隨著時間的推移出現了各種相互競爭的格式。以下是主流的幾種格式:
- Asynchronous Module Definition (AMD)格式, 用於瀏覽器端,使用
define
函式定義模組。 - CommonJS (CJS) 格式,用於 Node.js,使用
require
module.exports
定義依賴和模組。 - ES Module (ESM) 格式。從 ES6 (ES2015)開始,JavaScript 支援原生模組格式。它使用
export
關鍵字匯出模組的公開 API,並用import
關鍵字匯入。 - System.register 格式被設計用於在ES5 中 支援 ES6 模組。
- Universal Module Definition (UMD) 格式,在瀏覽器和 Node.js 中都可以使用。當模組需要被多種模組載入程式匯入時,這個很有用。
請注意,本文只討論 CommonJS 格式,它是Node.js 中的標準格式。如果你想深入瞭解其他格式,我推薦你閱讀這篇文章,作者是 SitePoint 的 Jurgen Van de Moere。
載入模組
Node.js 有一系列的內建模組,我們在程式碼中無需安裝即可使用。為此,我們需要使用require
關鍵字載入這個模組,並把它賦值給一個變數。這樣就可以呼叫模組暴露的任何方法了。
例如,要列出目錄的內容,你可以使用檔案系統模組 的 readdir
方法:
const fs = require('fs'); const folderPath = '/home/jim/Desktop/'; fs.readdir(folderPath, (err, files) => { files.forEach(file => { console.log(file); }); });
注意,在 CommonJS 裡,模組是按照出現的順序同步載入和處理的。
建立和匯出模組
現在我們來看看如何建立模組並匯出,以便在程式的其他地方使用。先建立一個 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}.`
);
如你所料,這會輸出日誌:
Jim was born on 12.01.1982.
匯出預設值
在上面的例子中,我們分別匯出了函式和值。這對於整個應用程式都需要的輔助函式來說是很方便的,但是當你的模組只匯出單個物件時,通常使用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, '[email protected]');
console.log(jim.getUserStats());
上面的程式碼輸出日誌:
Name: Jim
Age: 37
Email: [email protected]
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}.`
);
輸出日誌如下:
Jim was born on 12.01.1982.
那麼, 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
屬性。讓我們再加點東西:
// 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
變數將被忽略。
如果你想了解更多,我推薦你閱讀 這篇文章。
總結
模組已經成為 JavaScript 生態系統不可分割的一部分,它讓我們能用更小的部分組成大型程式。我希望本文為你在 Node.js 中使用模組做了良好介紹,以及幫助你瞭解模組語法。
作者:James Hibbard
來源:SitePoint
翻譯:1024譯站
更多前端技術乾貨盡在微信公眾號:1024譯站
相關推薦
Node.js 模組系統入門
在程式設計領域中,模組是自包含的功能單元,可以跨專案共享和重用。它們使開發人員的生活更加輕鬆,因為我們可以使用它來增加應用程式的功能,而不必親自編寫這些功能。它還讓我們可以組織和解耦程式碼,從而使應用程式更容易理解、除錯和維護。 在本文中,我們來探究如何使用 Node.js 中的模組,主要介紹如何匯出和匯
Node.js-檔案系統之使用第三方模組操作目錄
7. 第三方模組操作目錄 例子: npm install 包名 安裝 // =======第三方建立目錄包make-dir======== const madkDir = require('mak
WebSocket+Node.js+dGram+Vue 入門級小系統
scope connected list webgis vue buffer chang tint host 接了個基於UDP信號的實時可視化WebGIS系統項目,框架先搭起來: 一 udp和dgram npm安裝下面兩個包: const StringDecoder =
Node.js的學習入門(一、module.exports與exports)
user clas ret class script say req 引用 ole /*User.js*/ exports.userName = ‘Tom‘; exports.sayHello = function () { return ‘wwwwww‘ } /
Node.js API快速入門
Node.js API 快速入門 一、事件EventEmitter const EventEmitter = require('events'); class MyEmitter extends EventEmitter{} const eventEmitter = new MyEmitt
node.js模組--formidable
formidable模組實現了上傳和編碼圖片和視訊。它支援GB級上傳資料處理,支援多種客戶端資料提交。有極高的測試覆蓋率,非常適合在生產環境中使用。 安裝方法 這是一個低版本的包,如果在開發中使用高版本的框架(如Express),formidable模組已經包含在框架中。具體用法參考:討論。
Node.js模組與npm item3—各種前端build工具
各種前端build工具 Node, NPM, Grunt, Gulp, Bower, Webpack, Browserify, Yeoman, Brunch…… 前端目前有很多很多名詞,看著這些感覺永遠也學不完。 不要被這些名詞嚇唬住,這些工具出現的目的是讓我們的工作更加簡單。
Node.js模組與npm item2—NPM使用
NPM使用 Node Packaged Modules 簡稱NPM,是Node.js的包管理器。Node本身提供了一些基本API模組,但是這些基本模組難以滿足開發者需求。Node需要通過使用NPM來管理開發者自我研發的一些模組,並使其能夠共用與其他開發者。簡單來說,NPM就是Nod
2018年Node.js零基礎入門實戰39講視訊教程
2018年Node.js零基礎入門實戰39講視訊教程 https://pan.baidu.com/s/1p4cPuo_t70Eh0D_dzfJq2Q ----------------------課程目錄------------------------------ 2018年Node.js
[JavaScript] 2018年Node.js零基礎入門實戰39講視訊教程
2018年Node.js零基礎入門實戰39講視訊教程 https://pan.baidu.com/s/1p4cPuo_t70Eh0D_dzfJq2Q ----------------------課程目錄------------------------------ 2018年Node.js
Node.js 日誌系統 log4js 介紹
Node.js 日誌系統 log4js 介紹 關於 log4js ,此處不做過多介紹,你如果有關注過日誌系統,那就應該聽說過類似 log4cpp、log4net、log4j、log4p 等名詞。是的,log4xxx 是 Apache 提供的開源日誌框架,它可以將日誌資訊按指定的格式、
Node.js模組匯入匯出
這篇文章本來是想模組匯入匯出和事件迴圈一起寫的,但是感覺一起寫的話會太長了,所以就分開兩篇文章寫吧。下一篇會重點介紹一下js中的事件迴圈,js程式碼到底是以何種順序去執行的呢?我相信你看懂了事件迴圈再去看node對你的幫助是非常大的。 講模組系統之前先認識一下node.js中的全域性物件。 node.js的全
node.js模組化思想初探
系統模組(核心模組):node本身自帶,可以直接require的模組 自定義模組:自己寫的,以及在npm上下載的模組 一部分常用的系統模組的作用(印象) Crypto 加密 Events 事件 Net 網路操作 OS 作業系統資訊 Path 處理檔案路徑 S
node——12-模組系統-基本規則
模組匯出——僅物件 main.js var fooExports = require('./foo'); // ReferenceError: foo is not defined // consol
Node.js 模組之【mongoose】MongoDB操作模組
1. 安裝mongoose npm i mongoose --save-dev 2. 引入mongoose const mongoose = require('mongoose'); 3. 連線資料庫 mongoose.Promis
[快速掌握]Node.js模組封裝及本地使用以及釋出
一、Node.js模組封裝 .建立一個名為資料夾如(mynodejs)。 在censorify下建立3個檔案censortext.js、package.json、README.md檔案。在cens
node.js模組中on emit off的封裝
好好學習 ,天天向上。Are you ready? 事件繫結一個事件名稱對應多個事件的函式,因此它們的關係是一對多的關係,資料型別採用物件的形式 key:val //因為函式有多個 所以 val選用陣列 需要一個事件倉庫 eventList = {
【Node.js Koa框架入門】(一)Koa 框架介紹以及環境搭建、簡單使用
一、框架介紹 Koa -- 基於 Node.js 平臺的下一代 web 開發框架 koa是由 Express 原班人馬打造的,致力於成為一個更小、更富有表現力、更健壯的 Web 框架。 使用 koa 編寫 web 應用,可以免除重複繁瑣的回撥函式巢狀, 並極大地提升錯誤
Node.js模組引入
由於工作需要,用到了nodejs,怎麼解釋nodejs呢,說它是一門語言吧,它是基於javascript語言的,說它是一個框架吧,又包含了很多框架,只能這樣稱呼它,一個執行javascript的平臺,一個新的生態圈。 node可以做很多事情,伺服器端程式,命令列工具,圖形桌
Node.js:Express 入門和基礎知識
put hub con esp ces red uri 輸出 download Express 是一個自身功能極簡,完全是由路由和中間件構成一個的 web 開發框架:從本質上來說,一個 Express 應用就是在調用各種中間件。 初始化 新建一個目錄myapp,項目初始化