原文發表於: www.rails365.netjavascript
先來講一下 webpack
是什麼。css
webpack
的官方對它是這樣定義的:html
webpack
is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.前端
中文的大概意思是說:vue
webpack
能夠看作是模塊打包機:它作的事情是,分析你的項目結構,找到JavaScript
模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss
,TypeScript
等),並將其轉換和打包爲合適的格式供瀏覽器使用。java
用大白話能夠這樣說:react
webpack
是一個前端模塊化方案,更側重模塊打包,咱們能夠把開發中的全部資源(圖片、js 文件、css 文件等)都當作模塊,經過loader
(加載器)和plugins
(插件)對資源進行處理,打包成符合生產環境部署的前端資源。webpack
若是這樣還不明白的話,咱們來講下來龍去脈。git
在當今的社會,做爲 web 開發,會愈來愈意識到前端的重要性,隨着 HTML5
、 CSS3
、 ES6
各類技術的發展,前端的開發愈來愈寵大。甚至有些應用就是單頁面應用(SPA),純 JavaScript
開發,JavaScript
文件的管理也是一個問題。JavaScript
模塊化編程,已經成爲一個迫切的需求,這就出現了 JavaScript
的模塊解決方案,之前是用 requirejs
或 seajs
,而如今則是用 webpack
。github
舉個例子,不少人開發了各類優秀的 JavaScript
模塊或組件,咱們不想重複發明輪子,而是想直接利用別人的模塊,就是相似 require
或 include
這樣的機制,把別人的模塊引入進來,可是 JavaScript
又沒有 類
或包
這樣的概念,那應該如何作呢?
如何去引入別人的模塊?引入以後保證各類依賴關係不出錯?這就是 webpack
要解決的問題。
模塊化的概念咱們理解了,那如何理解 打包
這個詞呢?
其實,模塊化的問題解決以後,webpack
就能把各類資源模塊打包合併成一個文件輸出給瀏覽器。在打包的過程當中還能對這些資源進行處理,好比壓縮減小體積,把 sass
編譯成 css
, coffee
編譯成 js
。因此它在某些程度上,跟 grunt/gulp
的功能有些相同。至於與 grunt/gulp
的不一樣之處,咱們下面會講到。
grunt/gulp
的區別grunt/gulp
的定義是 Task Runner
。它有點像 ruby
的 Rake
或 Thor
,若是你不懂 ruby
,那 c/cpp
語言的 make
,這應該總知道吧。它是一種寫任務的工具,只是 grunt/gulp
是用 JavaScript
來寫 task 而已。
grunt/gulp
強調的是前端開發的工做流程,咱們能夠經過配置一系列的 task,定義 task 處理的事務(例如文件壓縮合並、雪碧圖、啓動 server、版本控制等),而後定義執行順序,來讓 grunt/gulp
執行這些 task,從而構建項目的整個前端開發流程。
const gulp = require('gulp');
const babel = require('gulp-babel');
// gulp.src 會指定源文件,而後經過 pipe 函數把內容傳給下個處理方法,最後 gulp.dest 是輸出處理後的文件內容。
gulp.task('default', () =>
gulp.src('src/app.js')
.pipe(babel({
presets: ['es2015']
}))
.pipe(gulp.dest('dist'))
);
複製代碼
打個比方,若是你的工程模塊依賴很簡單,不須要把 js 或各類資源打包,只須要簡單的合併、壓縮,那就不須要 webpack。grunt/gulp 就夠用了。反過來,若是你的工程龐大,頁面中使用了不少庫(SPA很容易出現這種狀況),那就能夠選擇使用 webpack
,由於這樣既能作到模塊化管理,也能作到 grunt/gulp
的一些功能,好比壓縮,轉化 coffeescript
爲 js
等。
gulp
也能和webpack
結合起來用,gulp
裏面有個 webpack-stream 插件。就是讓webpack
專門去作 module dependency 的事情, 生成一個bundle.js
文件,而後再用gulp
去作一些其餘雜七雜八 minify, uglify 的事情。 後來人們發現webpack
有個plugins
的選項, 能夠用來進一步處理通過loader
生成的bundle.js
,因而有人寫了對應的插件, 因此 minify/uglify, 生成 hash 的工做也能夠轉移到webpack
自己了,擠掉了gulp
這部分的市場份額。 再後來你們有發現npm/package.json
裏面的 scripts 原來好好用啊,調用任務的時候就直接寫一個簡單的命令,由於gulp
也不就是各類插件命令的組合呀,大部分狀況下愈來愈不須要gulp/grunt
之類的了。 因此你如今看到的不少新項目都是package.json
裏面 scripts 寫了一堆,外部只須要一個webpack
就夠了。(摘自網絡 https://segmentfault.com/q/1010000008058766)
最後總結一下:
雖然都是前端自動化構建工具,但看他們的定位就知道不是對等的。
grunt/gulp
嚴格上講,模塊化不是他強調的東西,他旨在規範前端開發流程。
webpack
更是明顯強調模塊化開發,而那些文件壓縮合並、預處理等功能,不過是他附帶的功能。
webpack
與其和 grunt/gulp
相比較,還不如跟 Browserify
比較,由於它們二者更相近,不過好像 Browserify
應該被 webpack
代替了吧,我對 Browserify
瞭解也很少,在此就不細說了。
webpack
不只僅能處理 js, 也能處理 css, 也能處理 html,甚至是圖片等各類前端資源。
它開發便捷,僅僅使用一個配置文件,就能替代部分 grunt/gulp
的工做,好比打包、壓縮混淆、圖片轉 base64等。
擴展性強,插件機制完善。
webpack
如今最流行的 react
、vue
、angular
等技術,你要學習和使用它們,不免會碰到 webpack
,由於通常都會用 webpack
來構建前端的開發環境,這樣,咱們還有什麼理由不學習呢?
查看更多文章: www.rails365.net