【W(wǎng)ebpack2+Django】使用extract-text-webpack-plugin分離樣式文件

優(yōu)化前

webpack配置了兩個入口,一個是app.js盹愚,一個是vendors(包括 react 等第三方插件)皆怕。打包生成的JS文件對應(yīng)有兩個:app-[hash].jsvendors.js

這種情況下西篓,樣式文件都被打包到了 app-[hash].js里面端逼。而且這時候我們還沒有做按需加載,所以這個文件會比較大污淋,網(wǎng)頁初次加載的時候花的時間很長礁鲁。

優(yōu)化后

使用插件 extract-text-webpack-plugin把樣式從JS文件中分離出來,生成一個單獨的CSS文件(竟然快1Mb了...)赁豆,再引入到 HTML 中仅醇。打開頁面的時候,app-[hash].js魔种,vendors.js和這個CSS文件會被異步加載析二,節(jié)省時間。

優(yōu)化過程

首先安裝插件:
npm install --save-dev extract-text-webpack-plugin
修改 webpack 配置文件节预,先添加plugin

const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
... ...
  plugins: [
      ... ...
      new ExtractTextPlugin({ //樣式文件單獨打包
        filename: "app.css",  //指定生成的文件名稱
        disable: false,  //是否禁用此插件
        allChunks: true
      })
   ],
}

注意叶摄,如果是 Django 項目,樣式名稱需要跟打包生成的其中一個模塊名一樣安拟,這樣才能在 templates中引入蛤吓。比如這里我們命名為app.css
然后修改CSS和LESS文件的loader

module: {
    rules:[
        {
          test: /\.css$/, 
          use: ExtractTextPlugin.extract({
            fallback:'style-loader',
            use:['css-loader', 'postcss-loader'],
          })
        },
        {
          test: /\.less$/i,
          use: ExtractTextPlugin.extract({
            fallback:'style-loader',
            use:['css-loader', 'less-loader'],
          })
        },
        ... ...
    ] // add all common loaders here
},

這是 Webpack 2 的配置了糠赦。Webpack 1 的 loader 格式跟上面的有一點區(qū)別会傲。
配置修改完成了,再打包就會出現(xiàn)一個 app.css的文件拙泽。

接下來只需要在HTML頭部引入(如果不在意引入css的位置可以忽略以下的步驟)淌山。

我們后端使用的Django框架,所以需要在templates中引入顾瞻。
修改前的 template

{% load render_bundle from webpack_loader %}
<!doctype html>
<html lang="en">
<head>
    ......
</head>
<body>
......
{% render_bundle 'vendors' %}
{% render_bundle 'app' %}
</body>
</html>

修改后:

{% load render_bundle from webpack_loader %}
<!doctype html>
<html lang="en">
<head>
    {% render_bundle 'app' 'css' %}
</head>
<body>
<div id="app"></div>
{% render_bundle 'vendors' %}
{% render_bundle 'app' 'js' %}
</body>
</html>

具體修改:先指定在<body>中只引入app bundle 的 js 文件:
{% render_bundle 'app' 'js' %}
然后在head中引入app bundle對應(yīng)的 css 文件:
{% render_bundle 'app' 'css' %}

到這就ok了泼疑。

django-webpack-loader的使用說明中寫到了這個用法:

render_bundle will render the proper <script> and <link> tags needed in your template.
render_bundle also takes a second argument which can be a file extension to match. This is useful when you want to render different types for files in separately.

也就是說, render_bundle會在template中生成與bundle對應(yīng)的 js 和 css 文件的 <script><link> 標(biāo)簽朋其。

而第二個可選參數(shù)用于指定引入的文件類型王浴,如果不指定的話,默認(rèn)兩個都會在指定位置生成梅猿。比如在分離CSS文件之后氓辣,如果不修改templates,生成的HTML部分如下圖:

不指定文件類型參數(shù)時袱蚓,在<body>末尾引入

踩過的坑

  1. 注意CSS文件的名稱

在這種情況下钞啸,只能是app.cssvendors.css。也就是必須跟打包輸出的bundle中的其中一個同名喇潘。否則在打開頁面時會提示找到不到名稱為XXX的bundle之類的錯誤体斩。

  1. 不要在template中直接用<link>標(biāo)簽引入導(dǎo)出的樣式文件

一開始我嘗試直接用<link>標(biāo)簽引入導(dǎo)出的樣式文件,但是這樣沒有成功颖低,因為webpack開發(fā)模式和生產(chǎn)模式請求靜態(tài)文件的路徑不同絮吵。而django-webpack-loader會幫我們根據(jù)配置生成不同的路徑。
比如{% render_bundle 'app' 'css' %}在開發(fā)模式時會生成如下內(nèi)容:

<link type="text/css" href="http://localhost:3000/assets/bundles/app.css" rel="stylesheet"/>

而在生產(chǎn)模式時會生成:

<link type="text/css" href="/static/bundles/prod/app.css" rel="stylesheet"/>

這些路徑對應(yīng)開發(fā)模式的webpack配置:

config.output.publicPath = 'http://' + ip + ':3000' + '/assets/bundles/';

和 Django 配置文件中指定的靜態(tài)文件目錄STATICFILES_DIRS忱屑,和bundle目錄WEBPACK_LOADER

WEBPACK_LOADER = {
    'DEFAULT': {
        'BUNDLE_DIR_NAME': 'bundles/prod/',  # change when production
        'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats-prod.json'),  # change when production
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹬敲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莺戒,更是在濱河造成了極大的恐慌伴嗡,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件从铲,死亡現(xiàn)場離奇詭異瘪校,居然都是意外死亡,警方通過查閱死者的電腦和手機名段,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門阱扬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伸辟,你說我怎么就攤上這事价认。” “怎么了自娩?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵用踩,是天一觀的道長。 經(jīng)常有香客問我忙迁,道長脐彩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任姊扔,我火速辦了婚禮惠奸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恰梢。我一直安慰自己佛南,他們只是感情好梗掰,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗅回,像睡著了一般及穗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绵载,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天埂陆,我揣著相機與錄音,去河邊找鬼娃豹。 笑死焚虱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懂版。 我是一名探鬼主播鹃栽,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躯畴!你這毒婦竟也來了谍咆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤私股,失蹤者是張志新(化名)和其女友劉穎摹察,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倡鲸,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡供嚎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峭状。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片克滴。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖优床,靈堂內(nèi)的尸體忽然破棺而出劝赔,到底是詐尸還是另有隱情,我是刑警寧澤胆敞,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布着帽,位于F島的核電站,受9級特大地震影響移层,放射性物質(zhì)發(fā)生泄漏仍翰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一观话、第九天 我趴在偏房一處隱蔽的房頂上張望予借。 院中可真熱鬧,春花似錦、人聲如沸灵迫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瀑粥。三九已至挣跋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間利凑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工嫌术, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哀澈,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓度气,卻偏偏與公主長得像割按,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子磷籍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺适荣,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,178評論 7 35
  • 學(xué)習(xí)流程 參考文檔:入門Webpack院领,看這篇就夠了Webpack for React 一. 簡單使用webpac...
    Jason_Zeng閱讀 3,142評論 2 16
  • 目錄第1章 webpack簡介 11.1 webpack是什么弛矛? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,739評論 0 1
  • 白鶴不亮翅閱讀 445評論 0 1
  • 大一 大一的生活很輕松,開始去參加各種活動比然,去挑戰(zhàn)各種自我丈氓,那時候還挺開心的,也開始發(fā)現(xiàn)自己的各種缺點强法。還記得去社...
    Grea閱讀 235評論 0 0