webpack是模塊化管理工具,使用webpack能夠對模塊進行壓縮、預處理、按需打包、按需加載等。
webpack也能用於服務端,可是構建後端代碼通常都不會用webpack,坑太多了,因此正常狀況下只用於前端
gulp是基於流的構建工具:all in one的打包模式,輸出一個js文件和一個css文件,優勢是減小http請求,萬金油方案。
webpack是模塊化管理工具,使用webpack能夠對模塊進行壓縮、預處理、打包、按需加載等。
插件化:webpack自己很是靈活,提供了豐富的插件接口。基於這些接口,webpack開發了不少插件做爲內置功能。
速度快:webpack使用異步IO以及多級緩存機制。因此webpack的速度是很快的,尤爲是增量更新。
豐富的Loaders:loaders用來對文件作預處理。這樣webpack就能夠打包任何靜態文件。
高適配性:webpack同時支持AMD/CommonJs/ES6模塊方案。webpack會靜態解析你的代碼,自動幫你管理他們的依賴關係。此外,webpack對第三方庫的兼容性很好。
代碼拆分:webpack能夠將你的代碼分片,從而實現按需打包。這種機制能夠保證頁面只加載須要的JS代碼,減小首次請求的時間。
優化:webpack提供了不少優化機制來減小打包輸出的文件大小,不只如此,它還提供了hash機制,來解決瀏覽器緩存問題。
開發模式友好:webpack爲開發模式也提供了不少輔助功能。好比SourceMap、熱更新等。
使用場景多:webpack不只適用於web應用場景,也適用於Webworkers、Node.js場景。
const path = require('path'); module.exports = { entry: "./app/entry", // string | object | array // Webpack打包的入口 output: { // 定義webpack如何輸出的選項 path: path.resolve(__dirname, "dist"), // string // 全部輸出文件的目標路徑 filename: "[chunkhash].js", // string // 「入口(entry chunk)」文件命名模版 publicPath: "/assets/", // string // 構建文件的輸出目錄 /* 其它高級配置 */ }, module: { // 模塊相關配置 rules: [ // 配置模塊loaders,解析規則 { test: /\.jsx?$/, // RegExp | string include: [ // 和test同樣,必須匹配選項 path.resolve(__dirname, "app") ], exclude: [ // 必不匹配選項(優先級高於test和include) path.resolve(__dirname, "app/demo-files") ], loader: "babel-loader", // 模塊上下文解析 options: { // loader的可選項 presets: ["es2015"] }, }, }, resolve: { // 解析模塊的可選項 modules: [ // 模塊的查找目錄 "node_modules", path.resolve(__dirname, "app") ], extensions: [".js", ".json", ".jsx", ".css"], // 用到的文件的擴展 alias: { // 模塊別名列表 "module": "new-module" }, }, devtool: "source-map", // enum // 爲瀏覽器開發者工具添加元數據加強調試 plugins: [ // 附加插件列表 // ... ], }
以上簡單配置主要有一下幾點:javascript
- Entry:指定webpack開始構建的入口模塊,從該模塊開始構建並計算出直接或間接依賴的模塊或者庫
- Output:告訴webpack如何命名輸出的文件以及輸出的目錄
- Loaders:因爲webpack只能處理javascript,因此咱們須要對一些非js文件處理成webpack可以處理的模塊,好比sass文件
- Plugins:Loaders將各種型的文件處理成webpack可以處理的模塊,plugins有着很強的能力。插件的範圍包括,從打包優化和壓縮,一直到從新定義環境中的變量。但也是最複雜的一個。好比對js文件進行壓縮優化的UglifyJsPlugin插件
- Chunk:coding split的產物,咱們能夠對一些代碼打包成一個單獨的chunk,好比某些公共模塊,去重,更好的利用緩存。或者按需加載某些功能模塊,優化加載時間。在webpack3及之前咱們都利用CommonsChunkPlugin將一些公共代碼分割成一個chunk,實現單獨加載。在webpack4 中CommonsChunkPlugin被廢棄,使用SplitChunksPlugin