1. 程式人生 > >Node.js 模組系統入門

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。這是因為exportsmodule.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,項目初始化