国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[譯] node.js 中的 module.exports 與 exports

sunsmell / 3554人閱讀

摘要:接下來(lái)我們將對(duì)和在中的使用有一個(gè)更好地了解。這篇文章包括了中的使用。這看起來(lái)似乎有些困惑,請(qǐng)記住和引用的是同一對(duì)象。重點(diǎn)返回一個(gè),該對(duì)象引用了的值。我們將中公開(kāi)的方法賦值給變量。總結(jié)和模塊在中是一個(gè)隨處可見(jiàn)的任務(wù)。

理解 node.js 中的 module.exports 與 exports

原文鏈接

作為一個(gè)開(kāi)發(fā)者,我們經(jīng)常會(huì)遇到需要使用不熟悉的代碼的情況。
在這個(gè)過(guò)程中遇到一個(gè)問(wèn)題:我需要花費(fèi)多少時(shí)間去理解這些代碼,明白如何使用?
一個(gè)典型的回答就是:先讓我可以開(kāi)始coding,等到時(shí)間允許再去做深入研究。
接下來(lái)我們將對(duì) module.exports 和 exports 在 node.js中的使用有一個(gè)更好地了解。

Note: 這篇文章包括了 node 中 module 的使用。如果你想了解瀏覽器內(nèi)部 modules 的使用,可以參考這面這篇文章:
Understanding JavaScript Modules: Bundling & Transpiling

What is a Module?

一個(gè)模塊就是將文件中相關(guān)的代碼封裝為一個(gè)代碼塊。
創(chuàng)建一個(gè)module,可以理解為將所有相關(guān)的方法挪到一個(gè)文件中。
我們使用一個(gè)node.js的應(yīng)用程序來(lái)說(shuō)明一下這個(gè)觀點(diǎn)。
創(chuàng)建一個(gè)名叫 greetings.js 的文件,其中包含下面兩個(gè)方法:

// greetings.js
sayHelloInEnglish = function() {
  return "Hello";
};

sayHelloInSpanish = function() {
  return "Hola";
};
Exporting a Module

為了 greetings.js 公共邏輯增加的時(shí)候,其封裝的代碼可以在其他文件中使用。所以我們
重構(gòu)一下 greetings.js 來(lái)達(dá)到這個(gè)目的。為了更好地理解這個(gè)過(guò)程,我們分為3步:

1) 想象一下有這么一行代碼在 greetings.js 的第一行:

// greetings.js
var exports = module.exports = {};

2) 把greetings.js中的方法賦值給exports對(duì)象在其他文件中使用:

// greetings.js
// var exports = module.exports = {};
        
exports.sayHelloInEnglish = function() {
  return "HELLO";
};
   
exports.sayHelloInSpanish = function() {
  return "Hola";
};

在上面的代碼中,我們可以使用 module.exports 替換 exports達(dá)到相同的結(jié)果。
這看起來(lái)似乎有些困惑,請(qǐng)記住:exports 和 module.exports引用的是同一對(duì)象。

3) 此時(shí) module.exports 是這樣的:

module.exports = {
  sayHelloInEnglish: function() {
    return "HELLO";
  },
       
  sayHelloInSpanish: function() {
    return "Hola";
  }
};
Importing a Module

我們?cè)?main.js 中 require greetings.js 的公開(kāi)接口。這個(gè)過(guò)程有以下三個(gè)步驟:

1)關(guān)鍵詞 require 在 node.js 中用于導(dǎo)入模塊,即所獲取模塊的 exports 對(duì)象。
我們可以想到它是這么定義的:

var require = function(path) {

  // ...

  return module.exports;
};

2) 在 main.js 中 require greetings.js

// main.js
var greetings = require("./greetings.js");

上面的代碼等同于:

// main.js
var greetings = {
  sayHelloInEnglish: function() {
    return "HELLO";
  },
       
  sayHelloInSpanish: function() {
    return "Hola";
  }
};

3) 現(xiàn)在我們可以在 main.js 中使用greetings訪問(wèn) greetings.js 中公開(kāi)的方法就像獲取它的屬性一樣。

// main.js
var greetings = require("./greetings.js");

// "Hello"
greetings.sayHelloInEnglish();
        
// "Hola"  
greetings.sayHelloInSpanish();
Salient Points 重點(diǎn)

require 返回一個(gè) object ,該對(duì)象引用了 module.exports 的值。
如果開(kāi)發(fā)者無(wú)意或有意的將 module.exports 賦值給另外一個(gè)對(duì)象,
或者賦予不同的數(shù)據(jù)結(jié)構(gòu),這樣會(huì)導(dǎo)致原來(lái)的 module.exports 對(duì)象
所包含的屬性失效。

看一個(gè)復(fù)雜的示例去說(shuō)明這個(gè)觀點(diǎn)。

// greetings.js
// var exports = module.exports = {};

exports.sayHelloInEnglish = function() {
  return "HELLO";
};

exports.sayHelloInSpanish = function() {
  return "Hola";
};

/* 
 * this line of code re-assigns  
 * module.exports
 */
module.exports = "Bonjour";

在 main.js 中require greetings.js

// main.js
var greetings = require("./greetings.js");

此時(shí),和之前并沒(méi)有任何變化。我們將greetings.js中公開(kāi)的方法
賦值給greetings變量。

當(dāng)我們?cè)噲D調(diào)用sayHelloInEnglish和sayHelloInSpanish結(jié)果顯示為
module.exports 重新賦值給一個(gè)新的不同于默認(rèn)值的數(shù)據(jù)格式。

// main.js
// var greetings = require("./greetings.js");
    
/*
 * TypeError: object Bonjour has no 
 * method "sayHelloInEnglish"
 */
greetings.sayHelloInEnglish();
        
/* 
 * TypeError: object Bonjour has no 
 * method "sayHelloInSpanish"
 */
greetings.sayHelloInSpanish();

為了清楚地知道這個(gè)錯(cuò)誤原因,我們將greetings的結(jié)果打印出來(lái):

// "Bonjour"
console.log(greetings);

在這個(gè)點(diǎn)上,我們?cè)囍?module.exports 拋出來(lái)的字符串"Bonjour" 去調(diào)用 sayHelloInEnglish 和 sayHelloInSpanish
方法,換句話說(shuō),我們永遠(yuǎn)也不會(huì)引用到 module.exports 默認(rèn)輸出object里面的方法。

Conclusion 總結(jié)

importing 和 exporting 模塊在 node.js 中是一個(gè)隨處可見(jiàn)的任務(wù)。
我希望 exports 和 module.exports之間的差異更加清晰。
此外,如果將來(lái)你遇到調(diào)用公共方法錯(cuò)誤的時(shí)候,我希望你可以對(duì)這些
錯(cuò)誤的原因有一個(gè)更好地理解。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/90940.html

相關(guān)文章

  • []你并不知道Node

    摘要:?jiǎn)栴}什么是調(diào)用棧并且它是的一部分么調(diào)用棧當(dāng)然是的一部分。為什么理解是重要的因?yàn)槟阍诿總€(gè)進(jìn)程中只能獲取一個(gè)調(diào)用棧。它是一個(gè)從事件隊(duì)列中跳去事件的循環(huán)并且將它們的回調(diào)壓入到調(diào)用棧中。當(dāng)調(diào)用棧為空的時(shí)候,事件循環(huán)可以決定下一步執(zhí)行哪一個(gè)。 你并不知道Node 原文:You don’t know Node 譯者:neal1991 welcome to star my articles-tra...

    miqt 評(píng)論0 收藏0
  • []JavaScript ES6模塊指南

    摘要:模塊可以導(dǎo)入和導(dǎo)出各種類型的變量,如函數(shù),對(duì)象,字符串,數(shù)字,布爾值,等等。所以這可能會(huì)導(dǎo)致一些不符合預(yù)期的行為。可變的基本類型值在導(dǎo)入一些基本類型的值如數(shù)字,布爾值或字符串時(shí),可能會(huì)產(chǎn)生一個(gè)有趣的副作用。 前言 ECMAScript 2015(又稱ES6)提供了一個(gè)前端JavaScript缺失已久的特性 —— 模塊。ES2015中的模塊參考了CommonJS規(guī)范(目前Node.js的...

    yimo 評(píng)論0 收藏0
  • Node.js 前端開(kāi)發(fā)指南

    摘要:定時(shí)器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時(shí)器的一個(gè)重要的事情是,我們提供的延遲不代表在這個(gè)時(shí)間之后回調(diào)就會(huì)被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒(méi)有其它具有更高優(yōu)先級(jí)的定時(shí)器,將在此時(shí)間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開(kāi)發(fā)人員。我這里不專注于語(yǔ)言本身...

    CntChen 評(píng)論0 收藏0
  • 保護(hù) Node.js 項(xiàng)目的源代碼

    摘要:而對(duì)于應(yīng)用越來(lái)越廣泛的而言,運(yùn)行的則是源代碼。通過(guò)查閱的相關(guān)代碼,可以發(fā)現(xiàn)字節(jié)碼的頭部保存著這些信息其中第項(xiàng)就是源代碼長(zhǎng)度。本文同時(shí)發(fā)表于作者個(gè)人博客保護(hù)項(xiàng)目的源代碼 SaaS(Software as a Service,軟件即服務(wù)),是一種通過(guò)互聯(lián)網(wǎng)提供軟件服務(wù)的模式。服務(wù)提供商會(huì)全權(quán)負(fù)責(zé)軟件服務(wù)的搭建、維護(hù)和管理,使得他們的客戶從這些繁瑣的工作中解放出來(lái)。對(duì)于許多中小型企業(yè)而言,S...

    Steven 評(píng)論0 收藏0
  • []Webpack的奇妙世界

    摘要:相反,解釋背后的原理是什么使他比一個(gè)構(gòu)造器更加強(qiáng)大。仍然是構(gòu)造器類似這樣的工具存在的主要原因之一就是解決依賴問(wèn)題。是一個(gè)模塊構(gòu)造器,就是前文所說(shuō)的。 Webpack是一個(gè)JavaScript模塊構(gòu)造器。 這是適合它功能的名稱。 但是,我想在本文中展現(xiàn)Webpack的真正功能。 本文將不講解如何使用Webpack。 相反,解釋背后的原理:是什么使他比一個(gè)構(gòu)造器更加強(qiáng)大。 Webpack仍...

    enali 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<