module 和 component 的区别
看到有人在扯 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)。