摘要:今天的內(nèi)容涉及的原理運(yùn)行機(jī)制和的內(nèi)容,會(huì)有點(diǎn)沉悶,也會(huì)有點(diǎn)困難,建議像我一樣做一些筆記。這個(gè)變量就是這個(gè)模塊與外界的一個(gè)出口。中,變量就是在中暴露的函數(shù)。具體原因同樣涉及到的內(nèi)部處理。有興趣的同學(xué)可以參考上面的那篇文章。
今天的內(nèi)容涉及Node的原理、運(yùn)行機(jī)制和CommonJS的內(nèi)容,會(huì)有點(diǎn)沉悶,也會(huì)有點(diǎn)困難,建議像我一樣做一些筆記。模塊
在開發(fā)大型應(yīng)用的時(shí)候,我們常常會(huì)用到全局變量,例如:var s="Hello"。但是,當(dāng)我們的應(yīng)用越來(lái)越大時(shí),我們可能會(huì)不小心重復(fù)用了幾個(gè)相同的變量或者函數(shù)名,這就會(huì)給我們的應(yīng)用造成麻煩。為了解決這個(gè)困難,于是提出了模塊的概念。模塊是一種代碼的組織形式,就是把實(shí)現(xiàn)不同功能的JS代碼分開來(lái)寫,把相同名字的函數(shù)或變量存在不同的模塊中,這樣就可以避免相同名的函數(shù)或變量發(fā)生沖突了。
同時(shí),模塊還可以提高代碼的可維護(hù)性。因?yàn)槟阒灰P(guān)心寫好當(dāng)前的模塊,而不必?fù)?dān)心會(huì)污染或影響到別的模塊,模塊之間都是隔離的。
在上一節(jié)的例子中,我們編寫了一個(gè)hello.js的代碼。在這里,我們把它修改一下:
"use strict"; var s="Hello"; function greet(name){ console.log(s + "," + name + "!"); } module.exports=greet;
這里,我們用module.exports向外輸出了一個(gè)變量。這個(gè)變量就是這個(gè)模塊與外界的一個(gè)出口。這個(gè)變量可以是函數(shù)、對(duì)象、數(shù)組。
既然有輸出,就要有接口。我們?cè)賱?chuàng)建一個(gè)main.js:
"use strict"; //引入hello模塊: var heat=require("./hello"); var s="Michael"; heat(s); //Hello,Michael!
這里,我們用require函數(shù)引入了hello模塊。main.js中,變量heat就是在hello.js中暴露的greet函數(shù)。接下來(lái)heat(s)`就是直接使用它了。
Commonjs規(guī)范和Node的內(nèi)部運(yùn)行這種模塊加載的方式被稱為Commonjs規(guī)范,除了這種規(guī)范之外,還有ES6、AMD、CMD,這里不細(xì)談,我也還沒學(xué)到,這里只談?wù)凜ommonjs和以前學(xué)的閉包知識(shí)。
在上文中,我們提到了全局變量的沖突。正如我們?cè)谏厦娴睦又校瑑蓚€(gè)js文件都聲明了變量s,但是并沒有發(fā)生沖突,仍然是按照我們的意愿來(lái)執(zhí)行的,這就是Node實(shí)行了模塊的隔離。
隔離的原理Node能夠?qū)崿F(xiàn)模塊和變量的隔離,是因?yàn)殚]包。
JS是一種函數(shù)式編程語(yǔ)言,它支持閉包,如果我們用函數(shù)把某個(gè)變量包起來(lái),這個(gè)變量就變成了函數(shù)內(nèi)部的局部變量了。而我們知道,閉包中只要這個(gè)函數(shù)的生命周期沒有結(jié)束,這個(gè)變量也就可以一直存在,而不會(huì)受到其他函數(shù)外的其他變量的影響。
我們以上面的例子來(lái)解釋,在hello模塊中,s="hello"被保存了起來(lái),只對(duì)外開了一個(gè)口:module.exports=greet,在函數(shù)greet中,包含有變量s,所以”s=hello”能一直被保存起來(lái),直到greet在main模塊中被引用。
這里有一個(gè)問(wèn)題,我們說(shuō)需要一個(gè)函數(shù)才能形成閉包,但是我們的代碼并沒有這個(gè)函數(shù)呀?這就是Node做的工作了,Node幫我們?cè)趦?nèi)部包裝了hello模塊:
(function(){ var s="Hello"; function greet(name){ console.log(s + "," + name + "!"); } })()
因此,s就變成了匿名函數(shù)的內(nèi)部局部變量,后來(lái)加載的其他模塊中即使也有s變量,也不會(huì)影響到這個(gè)s變量。
模塊的輸出在Node中有一個(gè)module對(duì)象,讓我們來(lái)看看模塊的輸出過(guò)程:
var module={ id:"hello", exports:{} }; var load=function(module){ //讀取的hello.js代碼 function greet(name){ console.log( "Hello," + name + "!"); } module.exports=greet; //hello.js代碼結(jié)束 return module.exports; }; var exported=load(module); //保存module save(module,exported);
在我們的hello模塊中,我們通過(guò)module.exports=greet把一個(gè)變量傳給了Node,而module實(shí)際上是Node準(zhǔn)備階段的一個(gè)變量,而且也是作為load函數(shù)的一個(gè)參數(shù)被保存了下來(lái)。每當(dāng)我們使用module.exports時(shí),Node就把一條module按模塊分類存了起來(lái),這些module都被保存在了一起。
當(dāng)我們?cè)趍ain模塊中想要用到hello模塊時(shí),我們又使用require()來(lái)讓Node幫我們?cè)谡业絠d為hello的module傳遞給我們。這樣,我們就拿到了hello的模塊輸出。
Node的運(yùn)行參考了模塊—廖雪峰的官方網(wǎng)站,實(shí)在看的我也有點(diǎn)繞,不過(guò)Node處理模塊的運(yùn)行原理我們現(xiàn)在看個(gè)大概暫時(shí)就夠了,等學(xué)完主體內(nèi)容再來(lái)細(xì)細(xì)分析。兩種輸出方式
我們可以通過(guò)兩種方式輸出模塊:
方法一:module.exports={ hello:hello, greet:greet }方法二:
exports.hello=hello; exports.greet=greet;
但是你不能直接對(duì)exports賦值:
exports={ hello:hello, greet:greet }
實(shí)踐證明,使用module.exports=xxx的方式賦值更好。具體原因同樣涉及到Node的內(nèi)部處理。有興趣的同學(xué)可以參考上面的那篇文章。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/107205.html
摘要:例如現(xiàn)在的入門學(xué)習(xí)手記系列。收到粉絲留言和打賞的喜悅。安裝上一篇入門學(xué)習(xí)手記一,主要是介紹了的核心概念,是整個(gè)學(xué)習(xí)過(guò)程的基礎(chǔ)知識(shí)。新生成的類似如下入門學(xué)習(xí)手記因?yàn)樯傻膬?nèi)容過(guò)多,我直接省略掉了。 showImg(https://segmentfault.com/img/bVbk5Nd?w=1150&h=599); 本人微信公眾號(hào):前端修煉之路,歡迎關(guān)注。 最近開始想要維護(hù)一個(gè)個(gè)人的公眾...
摘要:更多資源請(qǐng)文章轉(zhuǎn)自月份前端資源分享的作用數(shù)組元素隨機(jī)化排序算法實(shí)現(xiàn)學(xué)習(xí)筆記數(shù)組隨機(jī)排序個(gè)變態(tài)題解析上個(gè)變態(tài)題解析下中的數(shù)字前端開發(fā)筆記本過(guò)目不忘正則表達(dá)式聊一聊前端存儲(chǔ)那些事兒一鍵分享到各種寫給剛?cè)腴T的前端工程師的前后端交互指南物聯(lián)網(wǎng)世界的 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfr...
摘要:而則可制定個(gè)人需求的一套解決方案僅安裝需要的插件。迫不及待的你已經(jīng)等不及安裝使用了吧。安裝及使用一般是結(jié)合自動(dòng)化工具使用,如果要單獨(dú)使用可以安裝,這里我先對(duì)的安裝使用講解下。接下來(lái)說(shuō)點(diǎn)實(shí)際的,如何利用結(jié)合自動(dòng)化工作在項(xiàng)目中使用。 PostCSS介紹 PostCSS是一個(gè)利用JS插件來(lái)對(duì)CSS進(jìn)行轉(zhuǎn)換的工具,這些插件非常強(qiáng)大,強(qiáng)大到無(wú)所不能。其中,Autoprefixer就是眾多Post...
摘要:本節(jié)將學(xué)習(xí)是如何利用形成一套完整的前端工作流模式的。你也可以使用下面命令來(lái)強(qiáng)制安裝所有模塊,不管該模塊之前是否安裝過(guò)由于國(guó)內(nèi)墻的原因,使用安裝會(huì)非常緩慢,慢到想切,不過(guò)還好,我們可以使用淘寶提供的國(guó)內(nèi)鏡像進(jìn)行下載。 本節(jié)將學(xué)習(xí) Laravel 是如何利用 Sass, NPM, Gulp形成一套完整的前端工作流模式的。 一、句法強(qiáng)大的樣式表Sass Sass 是一種可用于編寫CSS的語(yǔ)言...
摘要:樣式通過(guò)標(biāo)簽包裹,默認(rèn)是影響全局的,如需定義作用域只在該組件下起作用,需在標(biāo)簽上加,如要引入外部文件,首先需給項(xiàng)目安裝依賴包,打開,進(jìn)入項(xiàng)目目錄,輸入回車。 showImg(https://segmentfault.com/img/remote/1460000013235090); (一)安裝node.js 首先需要安裝node環(huán)境,可以直接到中文官網(wǎng)http://nodejs.cn/...
閱讀 2645·2021-09-13 10:26
閱讀 1907·2021-09-03 10:28
閱讀 1977·2019-08-30 15:44
閱讀 794·2019-08-29 14:07
閱讀 386·2019-08-29 13:12
閱讀 2144·2019-08-26 11:44
閱讀 2337·2019-08-26 11:36
閱讀 2003·2019-08-26 10:19