第一個決定學習的javascript框架為React,沒什麼特別的原因,就是想先把React學起來,不過看到FaceBook的Document開頭就傻了:
Using React from npm
We recommend using React with a CommonJS module system like browserify or webpack. Use thereact
and react-dom
npm packages.npm還有稍微使用的經驗,但是CommonJS、browserify和webpack又是什麼工具,完全陌生,「工欲善其事,必先利其器。」這回可是活生生的體會了,更何況連學習器具的先決條件都沒有,決定把webpack瞭解一下。
一般來說,沒有將Javascript的檔案放在模組化管理的話,內嵌在檔案裡的方法會是這樣的:
<script src="module1.js"></script>
<script src="module2.js"></script>
<script src="libraryA.js"></script>
<script src="module3.js"></script>
通通包在script的tag裡,我現在用的也是這種方法,常見的問題有:
- 在全域的物件上面可能會互相衝突。
- 讀取的順序會非常重要。
- 開發者必須解決模組或是函式庫的相依問題。
- 在開發大項目的時候,script的tag會極長,而且如此一來,非常難以管理。
再來就是CommonJS的方式,CommonJS用同步的require方法去讀取一個文件,並回傳一個已輸出的對象。而一個模組能用將屬性加到exports物件的方式或者是直接設定一個值到module.exports裡面來指定輸出。
這是用node.js於伺服器端的流程。
好處:
- 伺服器端的模組可以重複使用。
- 目前已經有很多模組在CommonJS的方法裡面(npm)。
- 相對簡單
- 不太適用在瀏覽器端,伺服器需要讀取的模組都已經存在本地的硬碟裡了,所以載入不用考慮同步或非同步的問題。
- 多個模組沒辦法平行要求。
於是於是有了AMD的解決方案。
AMD可以說是CommonJS的非同步版:
require(["module", "../file"], function(module, file) { /* ... */ });
define("mymodule", ["dep1", "dep2"], function(d1, d2) {
return someExportedValue;
});
好處(幾乎就是克服CommonJS的缺口XD):
- 可以用非同步的方式在瀏覽器端request。
- 平行載入多個模組。
壞處(也相對了增加CommonJS沒有的劣勢):
- 需要經常性的維護,不管是讀或是寫代碼都會難上許多。
- 這種方式會感覺很像某種無法根本解決,但是可以透過避開而讓代碼順利運行的狀況。
PS.感覺變成在翻譯官方文件,不過發現或許以前看文件的時候,漏掉了很多東西。