日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在這篇文章中,我將介紹如何在 Node.js 中使用模塊,重點是如何導出和消費它們。

各種模塊格式

由于 JAVAScript 最初沒有模塊的概念,因此隨著時間的推移,出現了各種相互競爭的格式。下面列出了需要注意的主要格式:

  • Asynchronous Module Definition (AMD)[1]格式用于瀏覽器,使用define函數來定義模塊。
  • CommonJS (CJS)[2]格式用于Node.js,使用requiremodule.exports來定義依賴和模塊。npm 生態系統就是基于這種格式構建的。
  • ES Module (ESM)格式。從 ES6(ES2015)開始,JavaScript 支持原生模塊格式。它使用 export 關鍵字導出模塊的公共 API,使用 import 關鍵字導入模塊。
  • System.register[3]格式用于支持 ES5 中的 ES6 模塊。
  • Universal Module Definition (UMD)[4]格式可以用于瀏覽器和Node.js。當一個模塊需要被多個不同的模塊加載器導入時,它就會非常有用。

請注意,本文僅涉及 Node.js 的標準 CommonJS格式。

引入模塊

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

導出默認值

上面的示例中,我們單獨導出了函數和值。這對于整個應用程序都可能需要的輔助函數來說非常方便,但當你有一個只導出一樣東西的模塊時,使用 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.exportsexports的不同之處是什么?一個只是另一個的別名嗎?

有點,但不完全是……

為了闡明我的意思,我們更改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 變量將被忽略。

總結

模塊已成為 JavaScript 生態系統不可或缺的一部分,它使我們能夠將較小的部分組成大型程序。我希望本文能為你介紹如何在 Node.js 中使用模塊,并幫助你揭開模塊語法的神秘面紗。

  • 本文譯自:https://www.sitepoint.com/understanding-module-exports-exports-node-js/

以上就是本文的全部內容,如果對你有所幫助,歡迎點贊、收藏、轉發~

參考資料

[1]

Asynchronous Module Definition (AMD):https://en.wikipedia.org/wiki/Asynchronous_module_definition

[2]

CommonJS (CJS):https://en.wikipedia.org/wiki/CommonJS

[3]

System.register:https://Github.com/systemjs/systemjs/blob/master/docs/system-register.md

[4]

Universal Module Definition (UMD):https://riptutorial.com/javascript/example/16339/universal-module-definition--umd-

 

分享到:
標簽:module
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定