摘要:接下來我們將對和在中的使用有一個更好地了解。這篇文章包括了中的使用。這看起來似乎有些困惑,請記住和引用的是同一對象。重點返回一個,該對象引用了的值。我們將中公開的方法賦值給變量。總結和模塊在中是一個隨處可見的任務。
理解 node.js 中的 module.exports 與 exports
原文鏈接
作為一個開發者,我們經常會遇到需要使用不熟悉的代碼的情況。
在這個過程中遇到一個問題:我需要花費多少時間去理解這些代碼,明白如何使用?
一個典型的回答就是:先讓我可以開始coding,等到時間允許再去做深入研究。
接下來我們將對 module.exports 和 exports 在 node.js中的使用有一個更好地了解。
Note: 這篇文章包括了 node 中 module 的使用。如果你想了解瀏覽器內部 modules 的使用,可以參考這面這篇文章:
Understanding JavaScript Modules: Bundling & Transpiling
一個模塊就是將文件中相關的代碼封裝為一個代碼塊。
創建一個module,可以理解為將所有相關的方法挪到一個文件中。
我們使用一個node.js的應用程序來說明一下這個觀點。
創建一個名叫 greetings.js 的文件,其中包含下面兩個方法:
// greetings.js sayHelloInEnglish = function() { return "Hello"; }; sayHelloInSpanish = function() { return "Hola"; };Exporting a Module
為了 greetings.js 公共邏輯增加的時候,其封裝的代碼可以在其他文件中使用。所以我們
重構一下 greetings.js 來達到這個目的。為了更好地理解這個過程,我們分為3步:
1) 想象一下有這么一行代碼在 greetings.js 的第一行:
// greetings.js var exports = module.exports = {};
2) 把greetings.js中的方法賦值給exports對象在其他文件中使用:
// greetings.js // var exports = module.exports = {}; exports.sayHelloInEnglish = function() { return "HELLO"; }; exports.sayHelloInSpanish = function() { return "Hola"; };
在上面的代碼中,我們可以使用 module.exports 替換 exports達到相同的結果。
這看起來似乎有些困惑,請記住:exports 和 module.exports引用的是同一對象。
3) 此時 module.exports 是這樣的:
module.exports = { sayHelloInEnglish: function() { return "HELLO"; }, sayHelloInSpanish: function() { return "Hola"; } };Importing a Module
我們在 main.js 中 require greetings.js 的公開接口。這個過程有以下三個步驟:
1)關鍵詞 require 在 node.js 中用于導入模塊,即所獲取模塊的 exports 對象。
我們可以想到它是這么定義的:
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) 現在我們可以在 main.js 中使用greetings訪問 greetings.js 中公開的方法就像獲取它的屬性一樣。
// main.js var greetings = require("./greetings.js"); // "Hello" greetings.sayHelloInEnglish(); // "Hola" greetings.sayHelloInSpanish();Salient Points 重點
require 返回一個 object ,該對象引用了 module.exports 的值。
如果開發者無意或有意的將 module.exports 賦值給另外一個對象,
或者賦予不同的數據結構,這樣會導致原來的 module.exports 對象
所包含的屬性失效。
看一個復雜的示例去說明這個觀點。
// 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");
此時,和之前并沒有任何變化。我們將greetings.js中公開的方法
賦值給greetings變量。
當我們試圖調用sayHelloInEnglish和sayHelloInSpanish結果顯示為
module.exports 重新賦值給一個新的不同于默認值的數據格式。
// 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();
為了清楚地知道這個錯誤原因,我們將greetings的結果打印出來:
// "Bonjour" console.log(greetings);
在這個點上,我們試著在 module.exports 拋出來的字符串"Bonjour" 去調用 sayHelloInEnglish 和 sayHelloInSpanish
方法,換句話說,我們永遠也不會引用到 module.exports 默認輸出object里面的方法。
importing 和 exporting 模塊在 node.js 中是一個隨處可見的任務。
我希望 exports 和 module.exports之間的差異更加清晰。
此外,如果將來你遇到調用公共方法錯誤的時候,我希望你可以對這些
錯誤的原因有一個更好地理解。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90940.html
摘要:問題什么是調用棧并且它是的一部分么調用棧當然是的一部分。為什么理解是重要的因為你在每個進程中只能獲取一個調用棧。它是一個從事件隊列中跳去事件的循環并且將它們的回調壓入到調用棧中。當調用棧為空的時候,事件循環可以決定下一步執行哪一個。 你并不知道Node 原文:You don’t know Node 譯者:neal1991 welcome to star my articles-tra...
摘要:模塊可以導入和導出各種類型的變量,如函數,對象,字符串,數字,布爾值,等等。所以這可能會導致一些不符合預期的行為。可變的基本類型值在導入一些基本類型的值如數字,布爾值或字符串時,可能會產生一個有趣的副作用。 前言 ECMAScript 2015(又稱ES6)提供了一個前端JavaScript缺失已久的特性 —— 模塊。ES2015中的模塊參考了CommonJS規范(目前Node.js的...
摘要:定時器在和瀏覽器中的表現形式是相同的。關于定時器的一個重要的事情是,我們提供的延遲不代表在這個時間之后回調就會被執行。它的真正含義是,一旦主線程完成所有操作包括微任務并且沒有其它具有更高優先級的定時器,將在此時間之后執行回調。 眾成翻譯 原文鏈接 關于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發人員。我這里不專注于語言本身...
摘要:而對于應用越來越廣泛的而言,運行的則是源代碼。通過查閱的相關代碼,可以發現字節碼的頭部保存著這些信息其中第項就是源代碼長度。本文同時發表于作者個人博客保護項目的源代碼 SaaS(Software as a Service,軟件即服務),是一種通過互聯網提供軟件服務的模式。服務提供商會全權負責軟件服務的搭建、維護和管理,使得他們的客戶從這些繁瑣的工作中解放出來。對于許多中小型企業而言,S...
摘要:相反,解釋背后的原理是什么使他比一個構造器更加強大。仍然是構造器類似這樣的工具存在的主要原因之一就是解決依賴問題。是一個模塊構造器,就是前文所說的。 Webpack是一個JavaScript模塊構造器。 這是適合它功能的名稱。 但是,我想在本文中展現Webpack的真正功能。 本文將不講解如何使用Webpack。 相反,解釋背后的原理:是什么使他比一個構造器更加強大。 Webpack仍...
閱讀 3195·2021-11-10 11:35
閱讀 1303·2019-08-30 13:20
閱讀 1124·2019-08-29 16:18
閱讀 2137·2019-08-26 13:54
閱讀 2163·2019-08-26 13:50
閱讀 964·2019-08-26 13:39
閱讀 2480·2019-08-26 12:08
閱讀 1956·2019-08-26 10:37