webpack

前端模塊加載

兩種極端的方式

(1)每個模塊文件都單獨請求鹿驼,請求次數(shù)過多辕宏,應(yīng)用啟動速度慢。

(2)把所有模塊打包成一個文件然后只請求一次瑞筐,導(dǎo)致流量浪費、初始化過程慢聚假。

合理的方式

分塊傳輸,按需進(jìn)行懶加載魔策,在實際用到某些模塊的時候再增量更新

Webpack

Webpack是一個模塊打包器河胎。它將根據(jù)模塊的依賴關(guān)系進(jìn)行靜態(tài)分析,然后將這些模塊按照指定的規(guī)則生成對應(yīng)的靜態(tài)資源

安裝webpack

npm install webpack -g

或者加到package.json

npm install webpack --save-dev
# 指定版本
npm install webpack@1.12.x --save-dev

webpack server

npm install webpack-dev-server --save-dev
# 運行
webpack-dev-server --progress --colors

默認(rèn)配置文件為webpack.config.js

可以改成自定義配置

webpack --config customconfig.js

常見操作

啟動

webpack

實時編譯

webpack --watch
# 加上進(jìn)度和顏色
webpack --progress --colors --watch
webpack -p 來針對發(fā)布環(huán)境編譯(壓縮代碼)
webpack --display-error-details 查看查找過程
webpack -d 來生成 SourceMaps

Webpack配置

// webpack.config.js
var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: ['./src/index'], //entry 是指入口文件的配置項
  output: {  //output是指輸出文件的配置項
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      compressor: {
        warnings: false,
      },
    }),
    new webpack.optimize.OccurenceOrderPlugin()
  ],
  module: {
    loaders: [{
      test: /\.css$/,
      loaders: ['style', 'css']
    }]
  }
}
  • 代碼拆分政敢,同步和異步兩種加載方式胚迫。每一個異步區(qū)塊作為一個文件打包

  • 對 CommonJS 的 AMD 的語法做了兼容, 方便遷移代碼

  • Loader,將各種類型的資源轉(zhuǎn)換為JavaScript模塊

  • 插件系統(tǒng)访锻,webpack插件

loader

  • 通過管道方式鏈?zhǔn)秸{(diào)用闹获,每個 loader 可以把資源轉(zhuǎn)換成任意格式并傳遞給下一個 loader 河哑,但是最后一個 loader 必須返回 JavaScript

  • 運行在 node.js 環(huán)境中,同步或異步執(zhí)行

  • 接受參數(shù)璃谨,以此來傳遞配置項給 loader

  • 通過文件擴(kuò)展名(或正則表達(dá)式)綁定給不同類型的文件

  • 通過 npm 發(fā)布和安裝

  • 可以訪問配置

按照慣例,而非必須佳吞,loader 一般以 xxx-loader 的方式命名,xxx 代表了這個 loader 要做的轉(zhuǎn)換功能底扳,比如 json-loader

安裝 loader

npm install css-loader style-loader

壓縮 JavaScript

plugins: [
   new webpack.optimize.MinChunkSizePlugin(minSize)
]

js壓縮插件

打包多個包

首先 entry 有多個屬性, 對應(yīng)多個 JavaScript 包,然后 commonsPlugin 可以用于分析模塊的共用代碼, 單獨打一個包出來

// webpack.config.js
var webpack = require('webpack');
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js');

module.exports = {
  entry: {
    Profile: './profile.js',
    Feed: './feed.js'
  },
  output: {
    path: 'build',
    filename: '[name].js' // Template based on keys in entry above
  },
  plugins: [commonsPlugin]
};

optimizing-common-code

multi-page-app

revision

webpack文檔

Option 1: One hash for the bundle

output: {
    path: path.join(__dirname, "assets", "[hash]"),
    publicPath: "assets/[hash]/",
    filename: "output.[hash].bundle.js",
    chunkFilename: "[id].[hash].bundle.js"
}

Option 2: One hash per chunk

output: { chunkFilename: "[chunkhash].bundle.js" }

CDN

設(shè)置 output.publicPath

webpack文檔output.publicPath

功能開關(guān)

在開發(fā)環(huán)境使用(比如 log)羡滑,輸出日志算芯,模擬數(shù)據(jù)等等

if (__DEV__) {
  console.warn('logging');
}
// webpack.config.js

// definePlugin 接收字符串插入到代碼當(dāng)中, 所以你需要的話可以寫上 JS 的字符串
var definePlugin = new webpack.DefinePlugin({
  __DEV__: JSON.stringify(JSON.parse(process.env.BUILD_DEV || 'true'))
});

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'       
  },
  plugins: [definePlugin]
};

執(zhí)行,可添加到package.json

BUILD_DEV=1 webpack
"scripts": {
    "dev": "BUILD_DEV=1 webpack",
    "build": "BUILD_DEV=0 webpack"
},

參考

Webpack docs

Webpack 中文指南

Webpack 入門指迷

手把手教你基于ES6架構(gòu)自己的React Boilerplate項目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末职祷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子有梆,更是在濱河造成了極大的恐慌,老刑警劉巖泥耀,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛔添,死亡現(xiàn)場離奇詭異,居然都是意外死亡迎瞧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門凶硅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人足绅,你說我怎么就攤上這事韩脑√ナ常” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵厕怜,是天一觀的道長。 經(jīng)常有香客問我粥航,道長,這世上最難降的妖魔是什么递雀? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缀程,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杨凑。我一直安慰自己,他們只是感情好撩满,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伺帘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伪嫁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天驹吮,我揣著相機與錄音,去河邊找鬼晶伦。 笑死婚陪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的频祝。 我是一名探鬼主播脆淹,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沽一,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铣缠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝇庭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哮内,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡北发,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年喷屋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逼蒙。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖是牢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驳棱,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布社搅,位于F島的核電站,受9級特大地震影響形葬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笙以,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆祈,春花似錦、人聲如沸放坏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至互亮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豹休,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工威根, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洛搀。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像留美,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谎砾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • GitChat技術(shù)雜談 前言 本文較長,為了節(jié)省你的閱讀時間景图,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,693評論 7 110
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺挚币,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,164評論 7 35
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,184評論 40 247
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,464評論 2 71
  • 上個月騎行公共單車一個月談了一些感想慎玖,到現(xiàn)在已經(jīng)兩個月了笛粘,再談?wù)勑牡酶惺馨稍毒恕τ谌藗兩舷掳啵坛坛鲂泻鄹郑h(huán)保...
    漂泊laoxiao閱讀 384評論 3 5