摘要:接下來(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
一個(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里面的方法。
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
摘要:?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...
摘要:模塊可以導(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的...
摘要:定時(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ǔ)言本身...
摘要:而對(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...
摘要:相反,解釋背后的原理是什么使他比一個(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仍...
閱讀 3190·2021-11-10 11:35
閱讀 1295·2019-08-30 13:20
閱讀 1117·2019-08-29 16:18
閱讀 2131·2019-08-26 13:54
閱讀 2155·2019-08-26 13:50
閱讀 955·2019-08-26 13:39
閱讀 2473·2019-08-26 12:08
閱讀 1951·2019-08-26 10:37