node模組化(commonjs規範)
1.nodejs開發中的模組
nodejs採用commonjs規範實現了模組系統
2.什麼是commonjs規範?
commonjs規範規定了如何定義乙個模組,如何匯出模組中的資料以及如何使用定義好的模組
2.1在commonjs規範中,乙個檔案就是乙個模組
2.2在commonjs規範中,每個檔案中的資料都是私有地,對其他檔案不可見
2.3在commonjs規範中,每個檔案中的資料,必須通過exports匯出之後,其他檔案才可以使用
2.4在commonjs規範中,要想使用其他檔案暴露的資料,必須通過require匯入模組後才可以使用
3.node模組化中暴露資料的幾種方式
有三中匯出資料的方式,但無論使用哪種方式匯出,使用時都必須先用require匯入
3.1 exports.*** = ***
let name =
'andy'
;function
sum(a,b)
exports.str = name;
exports.fn = sum;
//exports是乙個物件,暴露資料的過程就是給exports物件新增屬性的過程
let amodule =
require
('./a.js');
console.
log(amodule.str)
;//andy
amodule.fn(
10,20)
;//30
3.2 module.exports.*** = ***
let name =
'andy'
;function
sum(a,b)
module.exports.str = name;
module.exports.fn = sum;
let amodule =
require
('./a.js');
console.
log(amodule.str)
;//andy
amodule.fn(
10,20)
;//30
或者直接給module.exports賦值
function
sum(a,b)
module.exports = sum;
const sum =
require
('./a.js');
sum(10,
20);
3.3 global.*** = ***(不符合commonjs規範,一般不使用這種方式)
let name =
'andy'
;function
sum(a,b)
global.str = name;
global.fn = sum;
//global為node中的全域性物件,模擬js中的window
let amodule =
require
('./a.js');
console.
log(global.str)
;//andy
global.fn(
10,20)
;//30
exports和module.exports的區別?
不能直接給exports賦值,但是可以直接給module.exports賦值
(在開發中無論哪種方式都不要直接賦值,這種情況只會出現在面試題中)?
let name =
'andy'
;exports = name;
//這種方式匯入後拿不到資料,是個空物件
module.exports = name;
//這種方式匯入後能拿到資料,『andy』
//兩者的區別在於:不能直接給exports賦值,但是可以直接給module.exports賦值
require注意點
1.1require匯入模組時可以不新增匯入模組的型別
如果沒有指定匯入模組的型別, 那麼會依次查詢.js .json .node檔案
無論是三種型別中的哪一種, 匯入之後都會轉換成js物件返回給我們
1.2匯入自定義模組時必須指定路徑
require可以匯入"自定義模組(檔案模組)"、「系統模組(核心模組)」、「第三方模組」
匯入"自定義模組"模組時前面必須加上路徑
匯入"系統模組"和"第三方模組"是不用新增路徑
1.3匯入"系統模組"和"第三方模組"是不用新增路徑的原因
如果是"系統模組"直接到環境變數配置的路徑中查詢
如果是"第三方模組"會按照module.paths陣列中的路徑依次查詢
es6模組化
es6模組化的第一種方式
匯出資料:export ;
匯入資料:import from 『path』
注意點:
1.如果是通過export 的方式匯出資料,那麼在匯入接受資料的時候,接收的變數名必須和匯出的變數名保持一致,
如果不一致則拿不到變數,究其原因,是因為在匯入的時候的本質是es6的解構賦值
//回顧解構賦值
let obj =
;let
= obj;
console.
log(name)
;console.
log(age)
;
2.如果是通過export 的方式匯出資料,又想在匯入資料的時候修改接收的變數名稱,那麼可以使用as來修改,但是如果通過as修改了接收的變數名稱,那麼原有的的變數名稱就會失效
let name =
'zs'
;export
;
import
from
'./a.js'
console.
log(name)
;import
from
'./a.js'
console.
log(str)
;//使用str時name失效
es6模組化的第二種方式
匯出資料:export default ***;
匯入資料:import *** from 『path』
注意點:
1.如果是通過export default *** 匯出資料,那麼接收的變數名可以和匯出的變數名不一致
2.如果是通過export default *** 匯出資料,那麼在模組中只能使用一次export default
let name =
'zs'
;export
default name;
import name from
'./b.js'
import str from
'./b.js'
;console.
log(name)
;console.
log(str)
;//可以直接使用不同與匯出時的變數名來接收
es6模組化的結合使用
let name =
'ted'
;let age =12;
function
say(
)class
person
}export
;export
default person;
import person,
from '.
/c.js
let p =
newperson()
;console.
log(p)
;console.
log(str)
;console.
log(age)
;say()
;
前端模組化
前端模組化解決什麼問題?有了模組,我就可以很方便的使用別人的 想要什麼功能,就用載入什麼模組。但是,這樣做需要有乙個前提,那就是大家必須以同樣的方式編寫模組,否則就亂套了。所以組內需要有一套統一的模組規範。如何實現模組?1 物件字面量的變體 2 js設計模式的模組模式 3 採用成熟的庫檔案。前兩種方...
前端模組化
定義 具有相同屬性和行為的事物的集合 在前端中 將一些屬性比較類似和行為比較類似的內容放在同乙個js檔案裡面,把這個js檔案稱為模組 目的 為了每個js檔案只關注與自身有關的事情,讓每個js檔案各行其職 模組化 指的就是遵守commonjs規範,解決不同js模組之間相互呼叫問題 commonjs a...
前端模組化
當多人開發同一專案時,很容易就會產生命名衝突的問題,尤其是js檔案,任何的js引入順序的打亂都可能導致專案執行失敗,為了解決命名衝突的問題,在es6之前,可以使用函式閉包來解決這個問題。即可能像這樣 function 這樣雖然可以解決命名衝突的問題,但也使得 的復用性變得極差,因為其它的檔案將無法再...