上一篇文章 (一)webpack入門——webpack的安裝 中,我們知道了webpack的安裝,接下來我們要學習如何使用webpack。
以下內容來自webpack文檔(不是直譯): http://webpack.github.io/docs/usage.html
簡單的webpack使用
創建一個模塊化的Javascript項目
創建一個文件件,在文件夾里面創建兩個js文件,分別命名為cats.js、app.js,並使用CommonJs語法來創建文件內容。
cats.js文件內容:
var cats = ['dave', 'henry', 'martha']; module.exports = cats;
app.js(entry point)內容:
cats = require('./cats.js'); console.log(cats);
'entry point'即應用程序開始的地方,也是webpack開始跟蹤模塊之間依賴的地方。
開始打包
給webpack一個人口文件(app.js),設置一個特殊的輸出文件(app.bundle.js):
webpack
app.js app.bundle.js
app.bundle.js部分內容:


由此可見,不僅app.js里面的內容被打包進app.bundle.js,app.js所依賴度cats.js也被打包了進來。webpack打包原理是邊讀邊分析入口文件的依賴,分析入口文件依賴的文件的依賴,以此類推,只要有依賴都去分析並打包到輸出文件(app.bundle.js)中,下圖很直觀的展示了webpack打包原理:

打包文件已打包好,現在可以用運行 node app.bundle.js 命令看看輸出內容(cats模塊被輸出出來了):


復雜的webpack使用
通過以上內容,我們大概知道了webpack是怎么打包運行的,現在我們來看看復雜一點的案例。
webpack 是一個非常靈活的模塊打包工具。它提供了很多高級特性,但是不是所有的特性都是通過命令行來使用的。想要使用更多的webpack特性,需要創建配置文件。
項目結構
在真實的webpack項目中,我們會將資源文件和打包文件分開組織在不同的文件夾中。在接下來的例子中我們將資源文件放在 src 文件夾中,打包文件放在 dist 中。
我們最終的項目目錄結構是這樣的:


開始創建項目,創建文件夾及文件。
1.創建項目文件命名為demo
2.在demo文件夾中創建src和dist文件夾
3.在src文件夾中創建app.js、cats.js,內容和對應的上面的app.js、cats.js內容一樣。
4.用以下命令初始化項目,創建package.json配置文件。
npm init
5.安裝webpack插件,並且講webpack插件配置到package.json文件中
npm install webpack --save-dev
創建及配置webpack配置文件
1.創建webpack.config.js文件,內容為:
module.exports = { entry: './src/app.js', output: { path: './dist', filename: 'app.bundle.js' } };
2.有了配置文件后,就可以簡單的用webpack命令進行打包了 .
webpack
dist文件夾下就多了一個app.bundle.js文件.
3. 運行node dist/app.bundle.js命令,又可以得到cats的數組列表。
node
dist/app.bundle.js
['dave', 'henry', 'martha']
使用loaders
webpack只支持本地JavaScript模塊,但是很多人使用ES2015、CoffeeScript、TypeScript等的轉譯器。webpack的‘loaders’即可解決轉譯的問題。Loaders是特殊的模塊,webpack用來加載其他的用別的語言寫的模塊到webpack可以識別的JavaScript中。例如,babel-loader使用Babel來加載ES2015文件。


'json-loader'加載JSON文件


Loaders可以是被鏈接的,的確有些時候你需要講loaders鏈接在一起。例如。‘yaml-loader’只能將YAML轉換成JSON.因此,你需要將它鏈接到‘json-loader’所以才可以使用。


用babel-loader轉譯ES2015
在這個例子中,我們將會告訴webpack通過Babel運行我們的資源文件所以我們可以使用ES2015的特性
1.安裝Babel和presets:
npm install babel-core babel-preset-es2015
2.安裝babel-loader:
npm install babel-loader --save-dev
3.添加一個以.babelrc命名的文件,並使用presets配置Babel
{ "presets": [ "es2015" ] }
4.修改 webpack.config.js使得'babel-loader'來處理所有.js結尾的文件
module.exports = { entry: './src/app.js', output: { path: './dist', filename: 'app.bundle.js', }, module: { loaders: [{ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader', }] } }
其中exclude: /node_modules/配置是將node_modules文件下的內容排除在外,降低編譯時間。
5.安裝你想使用的libraries例如jquery
npm install jquery babel-polyfill --save
現在我們使用--save代替之前使用的--save-dev,這些libraries將在運行時候使用。我們使用了babel-polyfill,因此在老的瀏覽器中ES2015 API是可用的。
6.修改src/app.js文件
import 'babel-polyfill'; import cats from './cats'; import $ from 'jquery'; $('<h1>Cats</h1>').appendTo('body'); const ul = $('<ul></ul>').appendTo('body'); for (const cat of cats) { $('<li></li>').text(cat).appendTo(ul); }
7.用webpack打包模塊
webpack
8. 加載index.html文件這個app才能運行起來
<!DOCTYPE html> <html> <head> <metacharset="utf-8"> </head> <body> <scriptsrc="dist/app.bundle.js"charset="utf-8"></script> </body> </html>
當你打開index.html時,你可以看到cats的內容列表


使用插件
在你的工作流程中,通常你想做一些額外的包的處理。例如壓縮文件便於客戶端更快速的加載。插件可以解決這個問題。我們將會增加uglify插件到配置文件中:
const webpack = require('webpack'); module.exports = { entry: './src/app.js', output: { path: './dist', filename: 'app.bundle.js', }, module: { loaders: [{ test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel', }] }, plugins: [ new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, }, output: { comments: false, }, }), ] }
uglify插件包含在webpack里,所以不需要額外的引用模塊,但是不是所有的都是這樣,webpack不包含的插件,第三方插件或者自己寫的插件是要包含額外的引用模塊的。