前端包管理器争端,只不过是构建工具的牙缝菜

广告位招租
扫码页面底部二维码联系

前端的争端越来越多,就像如今这个创业当职【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。业的社会一样,一个工具出来,还没有成熟,未经授权,禁止复制转载。未经授权,禁止复制转载。它的替代品就已经抢占风头,比如grunt【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net和gulp,比如npm和yarn,各个公【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。司都有自己的风格,发布自己的工具,吸取前著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。人的成果,实现自己的抱负。前端包管理器也【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。是争端不断,虽然npm大有一统天下的趋势【本文首发于唐霜的博客】【本文受版权保护】,但是非常明显,npm的模式非常容易复制著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】,yarn只需要做更多的宣传推广工作,完本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。全就可以取代它。实际上,作为开发者,往往【本文首发于唐霜的博客】未经授权,禁止复制转载。希望一个稳定的工具,同时又可以在它基础上本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net不断发展,用自己想用,避自己想避。

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

前端包管理器的主要目的,是为了解决包依赖【未经授权禁止转载】【原创不易,请尊重版权】问题。这里面涉及一些概念,一个一个阐述。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【本文受版权保护】

包管理器及其江湖【作者:唐霜】

【未经授权禁止转载】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。

所谓包管理器,就是一个可以对开发者发布的著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】包进行管理的工具而已,评判这个工具的好坏【原创内容,转载请注明出处】【转载请注明来源】,应该是以这个工具能否解决对应的管理问题原创内容,盗版必究。【原创不易,请尊重版权】,而非网上很多人讨论的社区、托管平台等一【转载请注明来源】著作权归作者所有,禁止商业用途转载。系列附加问题。

【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。

目前比较流行的有npm, bower, 【关注微信公众号:wwwtangshuangnet】【本文受版权保护】component等,我看了下知乎,国内本文作者:唐霜,转载请注明出处。原创内容,盗版必究。还可推荐有spm3,其他的管理器知名度不【版权所有】唐霜 www.tangshuang.net【本文受版权保护】大,或许还处于公司内部自己好用的层面。f原创内容,盗版必究。本文作者:唐霜,转载请注明出处。acebook的东西给我感觉总是带着公司【转载请注明来源】转载请注明出处:www.tangshuang.net内部需求的设计,比如react nati【未经授权禁止转载】【原创内容,转载请注明出处】ve和yarn,感觉都是它公司内的产品需本文作者:唐霜,转载请注明出处。【作者:唐霜】求衍生的项目,结果后来没有上线产品,或者本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net自己玩着觉得爽,就发布出来。但是不管怎么【本文受版权保护】未经授权,禁止复制转载。样,我的理念是:有更多的选择总是好事,物要各尽其能【转载请注明来源】。这一点上我喜欢gulp插件建议里面写的原创内容,盗版必究。【原创不易,请尊重版权】,说“一个插件只做一件事,不要做别人已经【转载请注明来源】【版权所有,侵权必究】做过的重复的事,或者不要做几件事,拆分开著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net就可以了”。一个东西完成一件事,不一定需【转载请注明来源】【作者:唐霜】要天天更新版本,能在关键位置物尽其能就好【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

所以我不希望看到npm一统天下的局面,不【本文首发于唐霜的博客】【未经授权禁止转载】过从现在前端的发展来看,一统天下几乎是不【作者:唐霜】【作者:唐霜】可能的,没有哪家公司只用某一个公司的产品【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。或者把命根寄托在一个东西上。npm和bo著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】wer我接触的比较多,所以就发表一下对他【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。们的看法。

【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。【原创内容,转载请注明出处】

npm最令我欣喜的功能,是它的scrip【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】t功能,相反,它的树状依赖结构我并不喜欢【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】,虽然它这样可以很好的解决依赖版本问题。原创内容,盗版必究。转载请注明出处:www.tangshuang.net对于一个项目而言,同时依赖多个版本,意味【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。着要把这几个版本都打包进去,这就可能会产未经授权,禁止复制转载。未经授权,禁止复制转载。生冲突,比如大家都挂了一个属性在wind【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.netow上。但是npm实际更多的是承担nod【本文受版权保护】本文版权归作者所有,未经授权不得转载。e的模块管理,而非前端包管理。在node【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。的代码里,require的时候路径不一样【版权所有】唐霜 www.tangshuang.net【作者:唐霜】,引用的模块也不一样,而且每一次requ【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。ire的时候,都会去执行,并不是说你前面【未经授权禁止转载】【作者:唐霜】require了,后面require同一原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】个东西就直接读内存里上次require的【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。,所以当某个包依赖一个低版本的包时,并不【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。影响其他依赖相同包但版本更高的情况。可是【原创不易,请尊重版权】【未经授权禁止转载】运行在浏览器端的情况完全不同,jquer转载请注明出处:www.tangshuang.net原创内容,盗版必究。y多个版本一起运行时,后面的方法会把前面原创内容,盗版必究。原创内容,盗版必究。的覆盖掉,window上绑定的东西,会在【转载请注明来源】【关注微信公众号:wwwtangshuangnet】第二次jquery加载时替换掉。所以这个【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。版本不可能像node那样树状结构。

本文版权归作者所有,未经授权不得转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

而bower则是基于这种思想,即你依赖的本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】包,必须选出一个来用,如果库里面有多个版【版权所有】唐霜 www.tangshuang.net【作者:唐霜】本,你依赖的包里也有不同包依赖不同版本的【版权所有】唐霜 www.tangshuang.net【转载请注明来源】情况,那么bower甚至会强制你选择其中【转载请注明来源】未经授权,禁止复制转载。一个版本来用。这种情况下,如果高版本的包【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】对低版本不具备兼容性,那么那个依赖低版本【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net的包,就会出现问题。一旦出现这种问题,作【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。为开发者是没有办法解决的,除非去改bow【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】er包的源码,让包依赖高版本。当然,不会著作权归作者所有,禁止商业用途转载。【本文受版权保护】有人去这样做。

【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【作者:唐霜】转载请注明出处:www.tangshuang.net

包≠组件【转载请注明来源】

【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。

我要推的,是组件的概念。我们传统意义的前原创内容,盗版必究。本文作者:唐霜,转载请注明出处。端是在浏览器端滚动的关注html, cs【原创内容,转载请注明出处】【原创不易,请尊重版权】s, js的开发,而现在的前端,其实最终【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。也是要回到浏览器,只不过开发模式已经更新【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。了一个世纪。趴在桌子上盯着屏幕一个像素一【作者:唐霜】原创内容,盗版必究。个像素的调样式的前端还在努力,这部分人并本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】没有减少,传统的写好html、css、j未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】s的工作模式仍然在很多公司流行。即使在这【本文首发于唐霜的博客】未经授权,禁止复制转载。个层面的前端工作里,也有非常多新奇的想法未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】,比如前后端分离,模块化等等,他们并没有未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net构建工具,但仍然不亦乐乎。但是,当前端程著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】序员开始使用构建工具的时候,前端猿类就开转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。始向前端人类进化,使用工具让现在的前端跟【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。以前的前端工作模式完全不同,现在讨论包管【原创不易,请尊重版权】【原创不易,请尊重版权】理器、构建工具远超出单点技术的探讨。

本文版权归作者所有,未经授权不得转载。【转载请注明来源】本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【作者:唐霜】

而组件,就是在构建工具出现之后被迫提升的未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。。在以前的前端开发中,我们听到更多的是“【原创不易,请尊重版权】【本文受版权保护】插件”,一个好的插件,就像一个非常好的黑原创内容,盗版必究。【未经授权禁止转载】箱,有良好可控的接口,实现漂亮的功能。使本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】用npm和bower的起初,会误以为这中【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】东西,无非是把插件统一管理起来,可以一下【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。子下载到自己本地使用,这样的想法不止我一【未经授权禁止转载】【未经授权禁止转载】个人有过。

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】

包并不一定是黑箱,它还有可能是锤子,是工【转载请注明来源】【原创内容,转载请注明出处】具,比如underscore,你说它是插转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net件,可是它没有非常明确的要实现什么功能,【本文首发于唐霜的博客】【本文首发于唐霜的博客】特别是在浏览器界面效果上,啥功能?类似的本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】很多包,它们更多的是提供算法,或优化服务【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】。所以npm对应的是package.js【本文受版权保护】【版权所有】唐霜 www.tangshuang.neton,它可以管理包,而这些包,更多的是为【原创不易,请尊重版权】转载请注明出处:www.tangshuang.netnode提供特定的功能,别人写好的功能,本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。你直接require进来,就可以用,很爽著作权归作者所有,禁止商业用途转载。【作者:唐霜】

【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】

不过在浏览器端还有一种情况,就是它仅实现【作者:唐霜】【原创不易,请尊重版权】某些效果的特定部分,比如渐隐渐现,你也可著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。以把它做成一个插件,用的时候调用接口。但【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】是,如果你使用构建工具来build代码,本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。你很难说这个插件什么时候用,要不要包含在【转载请注明来源】【转载请注明来源】你最终的代码里面。就举个简单的例子,你可转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。以说slider是一个插件,但是slid【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.neter里面有一个功能是touch slid【作者:唐霜】【本文首发于唐霜的博客】e,我只需要这个功能在我的代码里,是否可【本文受版权保护】【未经授权禁止转载】以把这部分代码独立出来,你slider也【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net可以用,我自己的代码里面也可以用?这个功【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。能就是一个独立的未被构建的包,就是我所说【原创不易,请尊重版权】原创内容,盗版必究。的组件。

【作者:唐霜】【本文受版权保护】【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】

组件的特征有两点:1. 没有被构建,也就本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net是说肯定会被别人require进去,别人【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net在build时候才用你;2. 功能独立,【关注微信公众号:wwwtangshuangnet】【本文受版权保护】模块小,复用和扩展都很方便。

著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【本文首发于唐霜的博客】【作者:唐霜】

在构建之前它叫组件,构建好之后,它就在你【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net的产品里消失了。就拿上面那个touch 【原创内容,转载请注明出处】【原创不易,请尊重版权】slide的组件来说,在你做好自己的插件未经授权,禁止复制转载。【作者:唐霜】之前,它是独立存在的,被你require【未经授权禁止转载】【转载请注明来源】进来,但是当你build完自己的插件发布【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。之后,你根本不需要告诉别人touch s【原创不易,请尊重版权】【未经授权禁止转载】lide是什么,而只需要告诉别人怎么用你【本文受版权保护】【版权所有】唐霜 www.tangshuang.net的插件。

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】原创内容,盗版必究。【作者:唐霜】

npm的包天生是用来被require的,【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。但是这些包大部分是运行在node环境里面原创内容,盗版必究。【本文受版权保护】,不需要构建过程,所以实际上也只是包,谈【原创内容,转载请注明出处】【版权所有,侵权必究】不上组件。而bower则是实实在在的组件转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】,bower的specs里面说,bower.json is used f未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】or configuring packa著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。ges that can be used本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。 as a dependency of 本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。another package,它们是用来build的时候的用的。所以著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。包括bootstrap在内的一些遵守这个未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】规则的bower component都是【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】为别人构建做准备的。而像很多人想的那样,本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net把dist目录下的build好的文件当做原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】bower component的入口,其【版权所有,侵权必究】未经授权,禁止复制转载。实是不对的。不过bower并未强行规定,转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】这种误解导致bower饱受诟病。假如np本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】m将来顶替bower在component本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】上走上述老路的话,势必也会遇到相同的问题未经授权,禁止复制转载。未经授权,禁止复制转载。

【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】原创内容,盗版必究。转载请注明出处:www.tangshuang.net

构建【作者:唐霜】

【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【作者:唐霜】转载请注明出处:www.tangshuang.net

由于这种误解把component的概念暴【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。露的太过,以至于有些人试图回避compo【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】nent,直接将它隐含在构建过程中。前端本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net大神TJ是componentjs的作者,未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】componentjs的想法,是将com【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】ponent的管理,使用和构建统一于一体【本文受版权保护】【原创内容,转载请注明出处】。你可以使用componentjs像bo原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】wer一样从componentjs自己的【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net库下载组件备用,还可以在开发完后自己做b【本文受版权保护】【原创不易,请尊重版权】uild。但随着webpack等工具的火【未经授权禁止转载】本文作者:唐霜,转载请注明出处。热,componentjs停止维护了。维【转载请注明来源】本文作者:唐霜,转载请注明出处。护者们发现webpack超级好,完全顶替转载请注明出处:www.tangshuang.net【作者:唐霜】了componentjs的很大一部分,所【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net以就放弃了继续开发。

【本文受版权保护】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

这里的componentjs和webpa未经授权,禁止复制转载。【本文首发于唐霜的博客】ck就是构建工具,componentjs【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。不能说是纯粹的构建工具,因为它最初其实是转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。以包管理器的身份亮相的。

【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。

构建工具,也就是做build的工具,将你【本文受版权保护】【版权所有,侵权必究】按照模块化组织好的代码,通过构建之后,得【转载请注明来源】【原创内容,转载请注明出处】到非模块化的单一成品。这个成品可以是任何【作者:唐霜】【版权所有】唐霜 www.tangshuang.net形式,比如是一个库或一个插件,也可以是一【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】个新的组件。

【作者:唐霜】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net

构建是现代化前端的必要过程,也得益于此,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】html, css, js再次被大整个,【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】这并不是倒退,在开发过程中,他们还是分开转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net的,只不过在最终的结果中,它们表现为杂糅著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。在一起。特别是angular, reac【本文首发于唐霜的博客】【本文首发于唐霜的博客】t这样的库,它们上来就要求js和html【未经授权禁止转载】转载请注明出处:www.tangshuang.net的杂糅。

【版权所有,侵权必究】【本文受版权保护】【本文受版权保护】本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

接下来要讨论的,是component和构【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】建的关系。在构建中,任何一个被引入进来的【版权所有】唐霜 www.tangshuang.net【转载请注明来源】包,都应该被称为组件,因为在最终的结果中【未经授权禁止转载】转载请注明出处:www.tangshuang.net,你并不需要将使用了哪些组件暴露出来。构未经授权,禁止复制转载。【原创不易,请尊重版权】建出来一个插件就是一个插件,构建出来一个【转载请注明来源】【转载请注明来源】应用就是一个应用。

【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

构建工具超级杂乱,几乎所有的公司都有自己【未经授权禁止转载】转载请注明出处:www.tangshuang.net的构建工具,webpack只是其中最优秀【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】的一只。之所以这么乱,是因为构建没有规范【原创内容,转载请注明出处】【未经授权禁止转载】,大家都在讨论哪个build工具,打包工【版权所有,侵权必究】【本文首发于唐霜的博客】具好用,却并不打算推行构建工具遵循的原则本文版权归作者所有,未经授权不得转载。【转载请注明来源】。而webpack也更愿意把自己定位为一【版权所有】唐霜 www.tangshuang.net【转载请注明来源】个工具,而非规范的构建者,这也会导致后来著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net必定有新工具代替它。但若它建立了一套规范本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net,那么后来者只会完善它,而不会想再造轮子本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。。也正因没有大家公认的规范,一旦一个工具【转载请注明来源】未经授权,禁止复制转载。退隐,所有以往通过该工具构建的应用,就不未经授权,禁止复制转载。【未经授权禁止转载】能不面临升级问题,因为按照该工具的规则进未经授权,禁止复制转载。【本文受版权保护】行构建而写的代码,在后来新用的工具中不兼未经授权,禁止复制转载。【本文受版权保护】容。比如之前用component构建,现【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】在用webpack就得想办法使之兼容。

【本文首发于唐霜的博客】【本文首发于唐霜的博客】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】

构建工具有简单也有复杂,复杂如webpa本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。ck,简单如babel,babel一个命本文版权归作者所有,未经授权不得转载。【转载请注明来源】令把你之前用es6写的代码转换为es5,【版权所有】唐霜 www.tangshuang.net【转载请注明来源】但不会打乱原来的代码组织结构。用grun【本文首发于唐霜的博客】【原创内容,转载请注明出处】t gulp之类的流程管理工具配合一些插【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。件,也可以生产出自己的构建工具,比如gu著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】lp-uglify gulp-sass 本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】gulp-cssmin等插件,都是为我们转载请注明出处:www.tangshuang.net【本文受版权保护】构建服务的。正是这种便捷性,我也开发了自转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。己的构建工具componer著作权归作者所有,禁止商业用途转载。,而本文就是在写componer的过程中著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】思考而写的。

【转载请注明来源】著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。

以组件为包的构建原则原创内容,盗版必究。

本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【原创不易,请尊重版权】

在npm和bower的体系里,大家把重点本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】争论放在谁解决依赖性问题更好一点,都说b【本文受版权保护】著作权归作者所有,禁止商业用途转载。ower过时了,这些论断都是从一些侧面去未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。说的,比如bower都没人维护了,说明它【作者:唐霜】【转载请注明来源】过时了,或者说看到bower和npm上都【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】可以下载类似jQuery这样的库,感觉也【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】就是个插件托管器,没啥特别。这些说法都没【转载请注明来源】著作权归作者所有,禁止商业用途转载。有抓住实质,bower的包目录名是bow著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。er_components,npm的包目【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】录名是node_modules,这其实已本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】经非常说明问题了。component和m【转载请注明来源】未经授权,禁止复制转载。odule在一些方面是有些重合的,但是显本文作者:唐霜,转载请注明出处。【未经授权禁止转载】然,module并不需要用来build,转载请注明出处:www.tangshuang.net【作者:唐霜】而component这个词本身就意味着应【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。该用来build。

【作者:唐霜】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【原创内容,转载请注明出处】【本文首发于唐霜的博客】

还有一个问题,就是为什么要有包管理器,如【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net果仅仅是个托管服务或者插件下载器,那确实【原创内容,转载请注明出处】【未经授权禁止转载】没啥用,但是它要解决依赖问题。非常哲学的【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】思考是,为什么它要解决依赖问题?因为它要本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。为build做准备,只有在考虑build【版权所有】唐霜 www.tangshuang.net【转载请注明来源】的时候才需要解决依赖问题,不build,【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】不需要思考这个问题。在bower和npm【版权所有】唐霜 www.tangshuang.net【转载请注明来源】之间,npm其实是一种回避式的解决问题方【本文受版权保护】【版权所有】唐霜 www.tangshuang.net式,因为npm是树状结构的依赖关系,也就本文作者:唐霜,转载请注明出处。【本文受版权保护】是说同一个组件可以在目录里有很多很多份,著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。主要看它的主版本是不是内部模块依赖的。但【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】是bower就不同,它要求你自己决定使用【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】哪一个版本,这种管理是主动出击式的,但是【未经授权禁止转载】【本文首发于唐霜的博客】问题就是对于开发者而已,又更加麻烦了,而本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net且有的时候这个依赖问题本来就不好解决。所【本文首发于唐霜的博客】【未经授权禁止转载】以就目前而言,npm确实比bower更加【版权所有,侵权必究】【版权所有,侵权必究】优越的解决了依赖问题。但是同样的,有优势著作权归作者所有,禁止商业用途转载。【本文受版权保护】就会有代价,代价就是在做build的时候本文作者:唐霜,转载请注明出处。【本文受版权保护】,相同代码可能会被使用多次,导致最终结果著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】的代码冗余。

转载请注明出处:www.tangshuang.net【本文受版权保护】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。

解决这个问题,其实应该回到组件本身。以j原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netQuery为例,jQuery一次性将自己【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】所有模块都放在自己的源码里,开发者一旦依著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。赖于前一个版本,就会把它打包到自己的应用【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】中,但是如果应用中的其他组件依赖高版本,未经授权,禁止复制转载。【未经授权禁止转载】那么就不得不面临两个选择,一个是手动解决【版权所有,侵权必究】【版权所有,侵权必究】依赖,另一个是把两个版本都打包进去。就n【本文受版权保护】【本文首发于唐霜的博客】pm体系而言,后者是常见的选择。因此,对本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】于组件本身而言,最好在版本之间做出一个抉【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】择,把大组件拆分为小组件,build过程【作者:唐霜】【转载请注明来源】中尽量不依赖版本,而只需要知道是不是需要【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】这个组件而已。因此,在componer.【转载请注明来源】【原创内容,转载请注明出处】json中,我根本不会要求开发者填写de【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netpendences的版本号。从这点上,我【作者:唐霜】本文作者:唐霜,转载请注明出处。follow的,是bower的包管理思想【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。

本文版权归作者所有,未经授权不得转载。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】

一个component不应该自己执行某些【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net动作,比如在window上挂载一些方法。【本文首发于唐霜的博客】【转载请注明来源】组件应该在被require之后再去被调用著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。。以jQuery为例,不应该在内部已经在【关注微信公众号:wwwtangshuangnet】【转载请注明来源】window上挂好$,应该在代码中req转载请注明出处:www.tangshuang.net【转载请注明来源】uire后使用。但是这给测试带来了一些问原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net题,测试需要写更多实现代码。但我认为这无转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。可厚非。

本文作者:唐霜,转载请注明出处。【本文受版权保护】【作者:唐霜】【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】

目前而言,webpack和npm基本上是【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】一家,它们联合起来,给build埋下了我未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net上文提到的这些坑,webpack如果用在【未经授权禁止转载】【作者:唐霜】build应用的时候,往往会在不同模块之【版权所有,侵权必究】【本文首发于唐霜的博客】间共享一个同名模块,但如果一旦这个模块被原创内容,盗版必究。转载请注明出处:www.tangshuang.net依赖的版本不同,那么就坑了。

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】未经授权,禁止复制转载。

以组件为包的思想,我更赞赏bower,因【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】为它在specs里写的非常清楚,main【版权所有,侵权必究】转载请注明出处:www.tangshuang.net这个字段就是为了build做为入口的文件原创内容,盗版必究。未经授权,禁止复制转载。列表。

原创内容,盗版必究。原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【转载请注明来源】

除了保持这种为了build而制作组件的思【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net想外,我觉得组件还应该具备两个基础特征:本文作者:唐霜,转载请注明出处。【未经授权禁止转载】1. 封闭性。组件虽然给外面去做buil著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】d,但内部应该极其稳定,不受到任何外部变【本文受版权保护】【原创内容,转载请注明出处】量的影响,无论你外部怎么运行,遇到什么b【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netug,跟我组件没有半毛关系。2. 扩展性转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】。组件意味着提供特定的接口给外部使用,对【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。于外部的使用者而言,组件可能满足了大部分【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net需求外,却又少数一些情况无法满足,需要开本文作者:唐霜,转载请注明出处。【转载请注明来源】发者在组件基础上进行扩展,或者写个方法进【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。行覆盖。所以以class的形式写组件比较著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】好,这样可以使用extends对它进行扩【原创内容,转载请注明出处】【未经授权禁止转载】展。

【本文受版权保护】未经授权,禁止复制转载。【未经授权禁止转载】【转载请注明来源】【版权所有,侵权必究】

组件的依赖应该写在dependencie著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】s里面,但是不应该把依赖代码build进【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。组件的最终成品中去,这样非常不友好。co原创内容,盗版必究。【本文受版权保护】mponent本身是提供build素材的【未经授权禁止转载】原创内容,盗版必究。,而非plugin提供直接使用的成品。说【未经授权禁止转载】原创内容,盗版必究。到这里,需要补充一下,bower中使用一【作者:唐霜】【原创内容,转载请注明出处】个component的时候,并不应该直接未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。在浏览器里面引用它,包括jQuery和b【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】ootstrap这两个非常流行的库,在b【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.netower中,它们是component,而【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。不应该直接在浏览器中使用script或l【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】ink引入到页面中。但是在测试的时候,依【本文首发于唐霜的博客】【版权所有,侵权必究】赖又必须被使用,这就麻烦了,如果所有的依【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net赖和你的组件都是遵循一个构建规则还好办,【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net把依赖包们都用同样的构建工具build好著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】,再引入即可,抑或测试的时候把test目转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】标文件作为app整个build出来。我个未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。人推荐第二种,把test当做一个实例化的【作者:唐霜】【版权所有,侵权必究】app来跑。但是如果你依赖的组件构建规则【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。跟你正在使用的工具不同,那么就麻烦了,你【版权所有,侵权必究】【原创内容,转载请注明出处】没法直接build它们。所以,不管你用什【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】么工具,一个相对统一的构建规则在这里极其本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net重要。

【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】原创内容,盗版必究。

这个统一的规则第一条就是“入口文件”和“【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。模块化规范”。

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【作者:唐霜】【本文受版权保护】【关注微信公众号:wwwtangshuangnet】

构建规则【本文首发于唐霜的博客】

【作者:唐霜】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。

入门文件,就是你在做build的时候,构转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】建工具以哪一个文件作为entrypoin著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】t,一般会在这个文件中import或re【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。quire组件内的其他文件,最终提供对外【作者:唐霜】【原创不易,请尊重版权】的统一接口。对于js而言,使用webpa未经授权,禁止复制转载。【作者:唐霜】ck打包,可以在js里面直接requir原创内容,盗版必究。转载请注明出处:www.tangshuang.nete样式、字体、图片等文件,这非常棒,使得本文版权归作者所有,未经授权不得转载。【本文受版权保护】一个组件的静态资源可以直接作为变量放到内原创内容,盗版必究。【原创不易,请尊重版权】存中,但代价就是组件会消耗比较多的内存,【本文受版权保护】著作权归作者所有,禁止商业用途转载。以至于浏览器崩溃。

著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。

package.json中的main只能转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net是字符串,一般而言应该只能使用js,因为【本文受版权保护】【原创不易,请尊重版权】require是为了加载模块而诞生的,诞转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】生webpack把它扩展了。对于webp【转载请注明来源】【版权所有,侵权必究】ack而言,package.json中的本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】main字段没有意义,你需要自己给web原创内容,盗版必究。【原创内容,转载请注明出处】pack的配置项entry中传入自定义的未经授权,禁止复制转载。【转载请注明来源】入口文件。诞生对于bower而言,他们则【本文受版权保护】本文作者:唐霜,转载请注明出处。不这么想。bower.json中的mai【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】n字段就是规定入口文件的。所以对于bow【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.neter而言,它并不限定你遵循什么模块化规范本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】,它让你暴露你的入口文件,这样你的构建工【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】具就会顺着入口文件,把你的所有代码都bu原创内容,盗版必究。【原创内容,转载请注明出处】ild到自己的产品中。

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【转载请注明来源】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。

但是你会发现,你怎么知道bower co【版权所有,侵权必究】【未经授权禁止转载】mponent内部是以什么方式相互引用的【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】呢?虽然我们想象中大部分情况都是采用re【关注微信公众号:wwwtangshuangnet】【转载请注明来源】quire,但是说实话,这并不确定,我遇【原创内容,转载请注明出处】【原创不易,请尊重版权】到过并不是用require的情况,他们在本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。window上注册了一个特定的属性,然后原创内容,盗版必究。原创内容,盗版必究。提供一些方法,特别是register方法【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】,这样内部的小模块都可以注册到这个属性中未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】,整个组件就依靠这个属性实现相互引用。这【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。种情况你该怎么办?目前我还没有看到一个可本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。以通过window中的某个属性找到对应的【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。文件的build工具。所以说,这种对mo【版权所有】唐霜 www.tangshuang.net【本文受版权保护】dules规范不加规定的敞开式原则,会导【原创不易,请尊重版权】【原创内容,转载请注明出处】致非常严重的兼容性问题。bower的这一【原创内容,转载请注明出处】未经授权,禁止复制转载。点饱受诟病,或许是因为Twitter没有【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。发布一个构建工具来解决这个问题而导致的,【作者:唐霜】【原创不易,请尊重版权】但也很可能是因为他们确实就看到了,构建这【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】种工具可能根本是不可能的。

本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【转载请注明来源】

不知道你读到这里的时候有没有感觉到一点,【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。就是“bower因为没有解决其modul著作权归作者所有,禁止商业用途转载。【转载请注明来源】es的build工具而逐渐被开发者抛弃,【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。相反,npm因为有webpack的强力支原创内容,盗版必究。【转载请注明来源】撑而大行其道”。是的,没有构建工具支撑的【作者:唐霜】原创内容,盗版必究。包管理器注定会遇到障碍,因为这里面的本质【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】原因是,包管理器是为构建提供素材(组件)的【原创内容,转载请注明出处】,也就是说,没有一个构建工具使用包管理器【作者:唐霜】著作权归作者所有,禁止商业用途转载。管理的包,那么它的这些包都是一些没有用的未经授权,禁止复制转载。【原创内容,转载请注明出处】资源。

本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。

CommonJS在server端被广泛使【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】用,而浏览器端AMD则是一种解决方案。E【原创不易,请尊重版权】未经授权,禁止复制转载。S6绕过了这两种相对成熟的模块化规范,标【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】准开发者们相信,有更加高效的module【转载请注明来源】本文作者:唐霜,转载请注明出处。s解决方案。而在ES标准中,requir本文版权归作者所有,未经授权不得转载。【本文受版权保护】e还是没有被囊括,这说明他们不承认Com【原创不易,请尊重版权】【未经授权禁止转载】monJS的成就,认为它可能只是个临时的本文作者:唐霜,转载请注明出处。原创内容,盗版必究。解决方案,一旦未来所有环境支持ES6的m【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。odules,那么CommonJS的历史【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】使命就结束了,那个时候,如果webpac【转载请注明来源】本文作者:唐霜,转载请注明出处。k和npm还在的话,不得不面临一个重大问【作者:唐霜】本文版权归作者所有,未经授权不得转载。题:是升级后兼容老的CommonJS,还原创内容,盗版必究。【版权所有,侵权必究】是被新的支持ES6 modules的新包【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net管理器及构建工具代替,最终退出历史舞台。【转载请注明来源】【本文受版权保护】一旦在这条路上走的越远,最终的结果往往是【本文受版权保护】本文作者:唐霜,转载请注明出处。后者。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【未经授权禁止转载】

我理想中的包及构建应该是怎样的?首先,c【原创内容,转载请注明出处】【作者:唐霜】omponent应该有怎样的入口,依赖应【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。该怎么定义,内部应该遵循什么模块化规范,【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net应该怎么构建和发布?其次,用这些comp【作者:唐霜】本文版权归作者所有,未经授权不得转载。onent的构建工具,应该怎样使用它们的【未经授权禁止转载】未经授权,禁止复制转载。入口文件,如何组织单个组件和组件群的依赖未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net,输出的结果应该遵循什么原则?最后,作为【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】component的开发者和作为使用co【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。mponent的开发者各自应该注意些什么【原创内容,转载请注明出处】【作者:唐霜】

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

先解决component的内部矛盾。著作权归作者所有,禁止商业用途转载。

【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net

我认为bower式的入口指定非常好,这种著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。思想让component本身的定位非常清【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net晰,就是为了给别人build的,所以只需【转载请注明来源】未经授权,禁止复制转载。要提供入口文件,包括js和scss/le【原创不易,请尊重版权】【原创不易,请尊重版权】ss,甚至不需要bundle,只需要源码未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net。依赖问题上,我也更倾向于bower这种【原创不易,请尊重版权】【未经授权禁止转载】扁平的结构,树状结构确实很好可以解决版本【转载请注明来源】原创内容,盗版必究。问题,但是往往只有扁平结构才能降低代码重【未经授权禁止转载】本文作者:唐霜,转载请注明出处。复率和文件大小问题,而且版本问题其实是一【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】个隐性问题,我认为一个组件升级到一个大版【本文受版权保护】未经授权,禁止复制转载。本,应该是以新的组件出现,就像docke【作者:唐霜】本文作者:唐霜,转载请注明出处。r的image一样,是单独的,而非对上一未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net个版本的覆盖,用户可以自己选择用哪一个版本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。本,或者两个一起用,但是不应该强迫一起用【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】。bower比较坑的地方是没有规定com未经授权,禁止复制转载。原创内容,盗版必究。ponent内部应该遵循什么模块化规则,著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。对我而言,目前我所遵循的模块化规范只有ES6开始的im【作者:唐霜】【原创内容,转载请注明出处】port/export规范。由于这是标准,不同的建构工具可以自己去【作者:唐霜】本文作者:唐霜,转载请注明出处。写解析器,比如babel可以解析为req【本文受版权保护】【未经授权禁止转载】uire/module.exports,【转载请注明来源】【原创内容,转载请注明出处】未来一定会有构建工具直接支持标准,目前来【原创不易,请尊重版权】原创内容,盗版必究。看,只有babel可以解析,但大部分构建未经授权,禁止复制转载。【本文受版权保护】工具都可以支持babel插件。

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】

组件本身可能也需要构建,但是也可以不用构转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】建,如果内部遵循的规范和外部使用的构建工【原创不易,请尊重版权】【版权所有,侵权必究】具遵循的规范一致,就可以不用,比如com原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。ponent内部使用require,那么【本文首发于唐霜的博客】【作者:唐霜】webpack就可以直接使用它。我觉得U【原创内容,转载请注明出处】【原创不易,请尊重版权】MD也是一个可选的方案,componen【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。t内部全部采用UMD实现模块间的引用,那原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。么在外部工具去使用component时,【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。只要能够支持UMD所支持的其中一种模式,【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net都可以搞定component。

【作者:唐霜】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。未经授权,禁止复制转载。

一旦遵循了这些原则,使用bower比使用【作者:唐霜】【版权所有,侵权必究】npm更符合我们的预期。毕竟npm还是更【原创内容,转载请注明出处】【版权所有,侵权必究】适合做一个更加稳定和优化的node模块管本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。理器。
【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net 再说说构建工具(builder)。未经授权,禁止复制转载。

【作者:唐霜】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】

这里我又要重新提到componentjs本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】,因为它是最早拥有构建component【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。思想的工具。当你使用componentj【转载请注明来源】本文版权归作者所有,未经授权不得转载。s的时候,首先要从它的registry下本文作者:唐霜,转载请注明出处。原创内容,盗版必究。载组件,下载下来的组件总是拥有compo未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。nent.json,这个文件里我们主要讨【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】dependencies(依赖)、tem转载请注明出处:www.tangshuang.net【未经授权禁止转载】plates(html模板,可以是han【作者:唐霜】【本文受版权保护】dlebars这样的模板)、script未经授权,禁止复制转载。【本文受版权保护】s(脚本,可以是js,或者coffee之转载请注明出处:www.tangshuang.net原创内容,盗版必究。类的)、styles(可以是css,也可【原创内容,转载请注明出处】【本文受版权保护】以是scss、less之类的)。这几个字【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net段非常好的给定了入口和依赖,比如脚本的入【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。口,没有styles这个字段就表示没有样【本文受版权保护】转载请注明出处:www.tangshuang.net式入口。在bower中直接使用一个mai【本文受版权保护】本文作者:唐霜,转载请注明出处。n字段把后三者全部囊括进去这反而感觉不是著作权归作者所有,禁止商业用途转载。【转载请注明来源】太好,分开可能更清晰的指出我们想要的。

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【转载请注明来源】

接下来是依赖问题。转载请注明出处:www.tangshuang.net

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】原创内容,盗版必究。未经授权,禁止复制转载。

前面提过了,component内部是不包【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。含依赖的,这也就是说必须由构建工具来决定【作者:唐霜】【原创内容,转载请注明出处】依赖是否应该打包进bundle,以及以什著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net么形式。这一点webpack就很好,所有【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】的依赖不会出现第二次,代码重复率很低,除【未经授权禁止转载】转载请注明出处:www.tangshuang.net非有人故意将代码放在component里【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】面。bower这种扁平化的结构,相对来说【转载请注明来源】著作权归作者所有,禁止商业用途转载。更好解决依赖问题,因为路径非常明确,也没转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。有版本衍生问题。

转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net

当构建工具在面对依赖时,应该考虑一个问题【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】,你的构建结果是什么?如果是packag原创内容,盗版必究。【原创不易,请尊重版权】e,那就是要复合commonjs,如果还【本文受版权保护】原创内容,盗版必究。是一个component,那就应该符合上【转载请注明来源】著作权归作者所有,禁止商业用途转载。面我所说的一个component的特征,【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。而如何是一个plugin,那就按插件的形【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】式来好了,如果是一个库就应该提供不同情况【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。下的不同版本,而如果是一个完整的应用呢?【本文受版权保护】【作者:唐霜】那就应该提供一个在浏览器端完整执行的bu原创内容,盗版必究。本文作者:唐霜,转载请注明出处。ndle文件。

【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。

所以,实际上,对于构建工具而言,更难搭建未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】。如果不带着解决某类问题去开发一个构建工【本文首发于唐霜的博客】【版权所有,侵权必究】具,而是想搞一个大而全通用性极强的构建工【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】具,会考虑一大堆不同情况,而且性能还很差转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。。构建工具的两端,一端是组件,但是组件像【转载请注明来源】著作权归作者所有,禁止商业用途转载。上文指出的那样,各自不同,builder本文作者:唐霜,转载请注明出处。【转载请注明来源】应该规定一种规范或者兼容性规则,而在另一【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】端,则是产品,也是形式多种多样。我更喜欢【原创不易,请尊重版权】【作者:唐霜】那种专注一种的,componentjs就本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】很好,送入的是component,出来的【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】也是component。而相对而言,we【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。bpack更像是打包一个SPA类型的应用【版权所有,侵权必究】原创内容,盗版必究。

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net

gulp其实是一个基础的构建工具框架,它【未经授权禁止转载】【未经授权禁止转载】只是提供了管道,一端进一端出,基于gul【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】p可以开发自己的构建工具,在管道中搞定自【本文受版权保护】【版权所有】唐霜 www.tangshuang.net己想要的功能。

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【原创不易,请尊重版权】

结语【原创不易,请尊重版权】

转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【原创内容,转载请注明出处】

这篇文章没想到写那么多,这仅是我在开发c【转载请注明来源】本文版权归作者所有,未经授权不得转载。omponer过程中的一些想法。comp【版权所有,侵权必究】【原创内容,转载请注明出处】oner就是遵循上述规则的构建工具,它其原创内容,盗版必究。【转载请注明来源】实也是输入component输出comp【作者:唐霜】【本文首发于唐霜的博客】onent的工具,输入的和bower包很【作者:唐霜】【作者:唐霜】像,所有输出的component遵循同一著作权归作者所有,禁止商业用途转载。【本文受版权保护】套规则,从而保证使用它们的framewo【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】rk只要接受这些规则,就可以直接使用它们本文作者:唐霜,转载请注明出处。原创内容,盗版必究。

未经授权,禁止复制转载。【作者:唐霜】【作者:唐霜】

最后,包管理器的争端真的没有必要,因为真著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。正有价值值得完善的,是构建工具。

【转载请注明来源】未经授权,禁止复制转载。【作者:唐霜】

2016-12-21 5994 , , ,

为价值买单,打赏一杯咖啡

本文价值59.94RMB
已有1条评论
  1. […] 前端包管理器争端,只不过是构建工具的牙缝菜 […]