Webpack ?整理

現(xiàn)狀:前端開發(fā)是基于多語言、多層次的編碼和組織工作,前端產(chǎn)品的交付是基于瀏覽器,這些資源是通過增量加載的方式運行到瀏覽器端。

webpack 的特點

代碼拆分

Webpack 有兩種組織模塊依賴的方式,同步和異步。異步依賴作為分割點,形成一個新的塊。在優(yōu)化了依賴樹后,每一個異步區(qū)塊都作為一個文件被打包。

Loader

Webpack 本身只能處理原生的 JavaScript 模塊,但是 loader 轉(zhuǎn)換器可以將各種類型的資源轉(zhuǎn)換成 JavaScript 模塊。這樣,任何資源都可以成為 Webpack 可以處理的模塊。

智能解析

Webpack 有一個智能解析器,幾乎可以處理任何第三方庫,無論它們的模塊形式是 CommonJS、 AMD 還是普通的 JS 文件。甚至在加載依賴的時候,允許使用動態(tài)表達式 require("./templates/" + name + ".jade")。

插件系統(tǒng)

Webpack 還有一個功能豐富的插件系統(tǒng)。大多數(shù)內(nèi)容功能都是基于這個插件系統(tǒng)運行的,還可以開發(fā)和使用開源的 Webpack 插件,來滿足各式各樣的需求。

快速運行

Webpack 使用異步 I/O 和多級緩存提高運行效率,這使得 Webpack 能夠以令人難以置信的速度快速增量編譯。

Webpack 會分析入口文件,解析包含依賴關(guān)系的各個文件。這些文件(模塊)都打包到 bundle.js 。Webpack 會給每個模塊分配一個唯一的 id 并通過這個 id 索引和訪問模塊。模塊會在運行 require 的時候再執(zhí)行。

Loader

Webpack 本身只能處理 JavaScript 模塊,如果要處理其他類型的文件,就需要使用 loader 進行轉(zhuǎn)換。loader 本身是一個函數(shù),接受源文件作為參數(shù),返回轉(zhuǎn)換的結(jié)果。

Loader 可以在 require() 引用模塊的時候添加,也可以在 webpack 全局配置中進行綁定,還可以通過命令行的方式使用。

引入一個 CSS 文件 style.css,首頁將 style.css 也看成是一個模塊,然后用 css-loader 來讀取它,再用 style-loader 把它插入到頁面中。

在entry.js文件中引入:

require("!style-loader!css-loader!./style.css") // 載入 style.css
// 感嘆號用來連接不同的loader, 而且執(zhí)行順序是從右到左

安裝 loader:

npm install css-loader style-loader

刷新頁面,就ok了。

我們也可以將 entry.js 文件中的 require("!style!css!./style.css") 修改為 require("./style.css") ,然后執(zhí)行:

$ webpack entry.js bundle.js --module-bind 'css=style-loader!css-loader'

配置文件

我們可以通過配置文件的方式代替命令行的執(zhí)行。
創(chuàng)建 package.json 來添加 webpack 需要的依賴:

{
  "name": "webpack-example",
  "version": "1.0.0",
  "description": "A simple webpack example.",
  "main": "bundle.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "webpack"
  ],
  "author": "zhaoda",
  "license": "MIT",
  "devDependencies": {
    "css-loader": "^0.21.0",
    "style-loader": "^0.13.0",
    "webpack": "^1.12.2"
  }
}

運行npm install
創(chuàng)建一個配置文件 webpack.config.js:

var webpack = require('webpack')
module.exports = {
  entry: './entry.js',
  output: {
    path: __dirname,
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      {test: /\.css$/, loader: 'style-loader!css-loader'}
    ]
  }
}

最后運行 webpack 就ok了。

添加插件

插件可以完成更多 loader 不能完成的功能,一般是在 webpack 的配置信息 plugins 選項中指定。

var webpack = require('webpack')
module.exports = {
  entry: './entry.js',
  output: {
    path: __dirname,
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      {test: /\.css$/, loader: 'style-loader!css-loader'}
    ]
  },
  plugins: [
    new webpack.BannerPlugin('This file is created by zhaoda')
  ]
}

開發(fā)環(huán)境

webpack 編譯時,通過參數(shù)讓編譯的輸出內(nèi)容帶有進度和顏色。

$ webpack --progress --colors

啟動監(jiān)聽模式,沒有變化的模塊會在編譯后緩存到內(nèi)存中,而不會每次都被重新編譯,整體速度是很快。

$ webpack --progress --colors --watch

使用
webpack-dev-server 開發(fā)服務是一個更好的選擇。它將在 localhost:8080 啟動一個 express 靜態(tài)資源 web 服務器,并且會以監(jiān)聽模式自動運行 webpack,在瀏覽器打開 http://localhost:8080/http://localhost:8080/webpack-dev-server/可以瀏覽項目中的頁面和編譯后的資源輸出,并且通過一個 socket.io 服務實時監(jiān)聽它們的變化并自動刷新頁面。

// 安裝
$ npm install webpack-dev-server -g
// 運行
$ webpack-dev-server --progress --colors
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,368評論 7 35
  • GitChat技術(shù)雜談 前言 本文較長,為了節(jié)省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,892評論 7 110
  • 在現(xiàn)在的前端開發(fā)中,前后端分離、模塊化開發(fā)、版本控制、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,659評論 1 32
  • 雙眼不見繁華 雙耳不聞落花 我身披袈裟,把破廟敲成了古剎 卻因池塘里跳出的那只青蛙 淚如雨下
    沐風而歌閱讀 209評論 0 3
  • 旅行是一個人一張車票一個目的地,旅途中所有事都是未知,有趣驚奇驚險,這或許就是旅行的意義。但旅游卻是三兩親朋好友,...
    筱曉笑閱讀 760評論 1 9

友情鏈接更多精彩內(nèi)容