webpack這個js模塊管理器(module bundler)怎麼樣?
工具主頁:webpack
它有一個亮點看上去挺吸引人的,就是能解決代碼分割(code splitting)的問題For big web apps it』s not efficient to put all code into a single file. Especially if some blocks of code are only required under some circumstances. webpack has a feature to split your codebase into 「chunks」 which are loaded on demand. Some other bundlers call them 「layers」, 「rollups」, or 「fragments」. This feature is called 「code splitting」.
It』s an opt-in feature. You can define split points in your code base. webpack cares for the dependencies, output files and runtime stuff.
大的項目如果用requirejs或browserify管理,把所有的js都打包在一起會很臃腫,webpack似乎能解決這個問題?
(個人理解:AMD或commonJS似乎解決的是延遲載入的問題,在網路不好的情況,最理想的會不會是延遲下載或按需下載,即與其下載一個體積很大的包含所有模塊的打包(bundled and minified)文件,還不如只下載所需的模塊即可)大家有沒有用過這個工具,這個工具用起來坑多嗎?
首先對趙同學說的『如果上線後還是一堆零散的文件,這個依賴管理工具還是趁早別做了...』不贊同,對於很多應用而言,首屏的js只佔全部js的很小一部分,如果只合併首屏js,對於其它的js做動態載入帶來的展示上的提速很明顯;另一個原因是一些庫文件極少更新,而業務文件更新頻率比較高,如果把庫文件和業務文件拆開,在客戶端也能利用上瀏覽器緩存。拆模塊不僅僅是為了開發時的方便與效率,對線上優化同樣有一定作用。
回到webpack,這確實是一個非常優秀的工具,能想到的一些功能(node端與瀏覽器端共用代碼,模塊依賴管理,代碼拆分,通過插件載入其它類型資源)webpack都有,以前我想過一個東西叫OJOC(one javascript file one component,js文件里包含組件需要的一切),webpack的loader搞搞很輕鬆就做到了。
說個意外的小坑,如果package.json格式錯誤,打包時會報 ERROR in Entry module not found: Error: Cannot resolve "file" or "directory",讓人很摸不著頭腦,添加參數 --display-error-details 才知道是package.json解析錯誤,別的坑暫時還沒有遇到。
推薦玩一玩看了其他人的答案,來講個不一樣的!
開發可維護的js代碼與css代碼
css模塊化;
以需求來代入:大家在開發中是否經常會有這樣的困擾,在css的命名、復用上找不到好的解決方案。比如有一個系統中有這樣兩個列表頁面(list),包含需要展示的內容是大體上一樣的,但是布局展示樣式切是要求不一樣的。比如:平常做法
我們平時的做法是,做命名兩種css.list-1{
.....}.image-1{....}--------------------------------------------------------------------.list-2{.........}.image-2{
........}這樣做可以滿足我們的需求,但是你需要為每套布局想一個【樣式名稱】,而且我們平時寫css代碼一般放在同一個頁面內,後續不好維護。
webpack的做法(1)解決樣式命名,為單獨的某塊寫一個css文件,通過require的形式引入樣式。如下:兩個css文件內的樣式可以重名,webpack打包的時候生成的樣式名是 模塊名_css_隨機字元(可以自定義規則)。這樣來確保兩個樣式是獨立的。如下,我們定義css名稱為.item-btn,webpack打包後,在瀏覽器下生成的樣式名如下:
js內的具體調用如下:
(2)解決樣式復用。你可以用css模塊化裡面的compose來處理 js模塊化:es6想必大家已經都已躍躍一試,無奈瀏覽器支持太少了。想想es6的(promise、=&>、let ......) 大家都去試一下吧,越來越像服務端語言了。webpack打包時,通過調用babel的配置可以將我們的es6代碼轉化為es5代碼,實現瀏覽器的全兼容。
這個requirejs應該實現不了吧!也許很快我們就看不到requirejs了吧!webpack與react了解過react的同學,可能就會有體會了。webpack對react來說可謂開發神器。說打包後的尺寸的話,Webpack打包的大概比requirejs的小几K吧,因為沒了require.js本身。
延遲載入與webpack並不衝突,你做N個entry然後自己處理後續載入就好,不過因為沒有了require.js或sea.js這類的依賴管理,所以得自己再實現個依賴管理或模塊管理機制。
理論上說,應該可以requirejs和webpack一起用的,先requirejs封裝再用webpack打包整合非js文件,畢竟webpack里有些工具是純粹的依賴管理庫很難做到的。
總得來說就是,工具可以去玩,但基礎還是不能落下的,基礎打好了,什麼工具有什麼好處能怎麼整合這些都不在話下。GitHub - xiaoyu2er/awesome-webpack: webpack 資料整理
這裡有比較詳細的webpack介紹和教程,希望可以給你幫助!鏈接:https://github.com/wangning0/Autumn_Ning_Blog/blob/master/blogs/3-12/webpack.md
打包在一起是為了減少 request 數量從而能並發更多請求,提升總體載入速度,所以臃腫的一個文件本來就是目的而非副作用。如果要解決調試問題可以使用 Source Map。
所謂的代碼分割,說白了就是模塊劃分,把大文件 breakdown 的同時還能進行依賴管理,降低開發和維護的成本,而這個的好處是體現在開發時而非上線後的,如果上線後還是一堆零散的文件,這個依賴管理工具還是趁早別做了...
這個工具本身就是一個同時支持 CommonJS 和 AMD 的模塊管理實現,瀏覽器中使用的話,release 之前還是要進行 pack 的。所以你說的那個亮點...所有的模塊管理工具都是必備功能之一...真的不亮...這兩天好好研究了下webpack。
個人感覺,如果是做單頁面應用,或者項目比較小的情況,用一下一點問題都沒有。但是如果做一個比較大的網站。頁面有幾十個的項目。我覺得用這個很不爽,很不爽,很不爽。1.配置入口文件 每個頁面的入口文件都需要配置,如果有懶載入的,需要單配置。另外如果需要等頁面載入完畢再載入業務js的,需要通過common.js插件方式,將common.js引入到頁面,在調用webpack的jsapi。 這個我要吐槽下,很不爽。配置入口,出口很不爽。到時候這個webpack.config.js會很大。不好維護。而且我要讀配置文件才能知道我的真正源代文件在哪兒。當然我們可以約定(呵呵,又多了條不可控約束)2.配置出口。我擦。這個要說一下。只能配置在一個文件夾下。難道項目不用分路徑的么?不分層級的么?如果可以將輸出路徑跟源文件路徑一致,這樣就好了,我不知道怎麼配置啊,知道的麻煩告訴我。3.同時開發多個項目。啟動一個webpack-dev-server 監聽一個項目。我有倆呢?多個呢?來回切吧。這個問題到是好解決。先寫三條吧。不過如果寫單頁面,頁面只有一個入口文件,就好玩多了。
很欣賞他的那麼多loader。把browserify和webpack的loader 然後在加上gulp ,自己在express服務。就好玩多了。我想告訴你的是
直接看幫忙文檔就好了學習技術最好的方式無非是看幫忙文檔而且官方的文檔又寫得那麼好這裡只有強烈安利一下我這個項目了GitHub - bodyno/react-starter-kit: 完美使用 React, Redux, and React-Router!用了之後 你就會發現 你什麼都懂了講真,確實折騰起來是個無底洞,不過功能上還是很豐富,暫時還沒有發現什麼大坑,可以算是當下前端工程化的利器了。
吐槽一點,官方文檔雖然已經不少了,還是不太夠用,特別是插件開發這塊,只能靠自己摸索。題主說的 隨著項目增大前端模塊的拆分管理問題 其實不論AMD還是ES6形式 都要經歷模塊分析 前端構建 瀏覽器本地緩存 合併更新模塊請求的過程 美團的移動端項目已經有針對兩種格式的實踐 簡單例子在https://zhuanlan.zhihu.com/p/25012345 利用localStorage CDN combo服務就可以很好解決打包過大的問題 同時項目模塊格式也可以按照需求任選。模塊粒度越精細性能越有提升,同時合理的分塊配合sourcemap也方便調試找bug
剛了解這個東西一個禮拜,真是好東西,配合typescript就跟開發本地應用程序一樣,需要什麼資源就直接用。什麼依賴,各種類型文件的載入等問題全部直接交給webpack解決,只要專心寫好commonjs就可以了。如果非要說缺點就是這東西是個重量級大黑箱,用起來沒有安全感,感覺順利的話非常方便,不過萬一碰到問題就慘了。
推薦閱讀:
※io.js 和 node.js 之間應該如何選擇?
※如何評價node-fibers?
※node相比傳統服務端技術棧差在哪裡?
※Vue.js中ajax請求代碼應該寫在組件的methods中還是vuex的actions中?
※SeaJS 和 Browserify 的模塊化方案有哪些區別?
TAG:前端開發 | JavaScript | Nodejs | 前端工程師 | webpack |