看到有人在扯 module 和 component 的區別,於是我也來插一句。對於 Web 前端項目而言,它們沒有任何區別!所有對它們區別的高談闊論都是瞎逼逼!為何 npm 的組件安裝目錄就叫 node_modules?而 bower 組件的安裝目錄叫做 bower_components 呢?
其實 npm 安裝和 bower 安裝是一樣的,很多人就是喜歡用 npm 不喜歡用 bower,於是整個項目就全是 node_modules。很多 bower 的包在 npm 中也能找到。所以說 module 和 component 只是個名字而已,「組件」和「模塊」的概念如今已經模糊地融合在一起了 —— 即使它們曾經是不同的。
然而在開完地圖炮之后我就要開始瞎逼逼了!
其實「組件」和「模塊」本身是不同的東西,我強調的只是在 Web 前端這個氛圍中它們是等價的而已。以前做 VB 的時候里面也有「組件」(當時叫「部件」)和「模塊」。里面的組件和模塊的區別就是黑盒和白盒的區別。組件是可以單獨編譯成一個動態鏈接庫引入的,而模塊通常是代碼模塊,只是提供一個代碼片段(VB 中還有類模塊,專門提供一個類)。
以上這個解釋顯然帶有微軟色彩的,還可以用更抽象的語言來描述它。所謂組件就是可以在運行時加載的東西,而模塊則是直接被引入到代碼中編譯的東西。這就是它們最初的本質區別。
到了 Web 前端,一切就變得曖昧起來。因為前端代碼本來就只有運行時沒有編譯時。或者即使有編譯時也是人為加上的,和項目的打包規則有關。比如用 webpack 單入口模式打包,那么所有的東西都是模塊而沒有組件。如果是想 jQuery 插件那樣直接通過 SCRIPT 標簽加載腳本來增加插件,那么就屬於組件(雖然一般稱為 plugin 而不是 component)。