webpack多頁應用架構系列(十):如何打造一個自定義的bootstrap

本文首發于Array_Huang的技術博客——實用至上,非經作者同意,請勿轉載。
原文地址:https://segmentfault.com/a/1190000007043716
如果您對本系列文章感興趣,歡迎關注訂閱這里:https://segmentfault.com/blog/array_huang

前言

一般我們用bootstrap吶,都是用的從官網或github下載下來build好了的版本,千人一臉吶多沒意思。當然,官網也給我們提供了自定義的工具,如下圖所示,但每次要改些什么就要重新在官網上打包一份,而且還是個國外的網站,甭提有多煩躁了。

bootstrap官網 - 自定義打包
bootstrap官網 - 自定義打包

那么,有沒有辦法讓我們隨時隨地都能根據業務的需要來自定義bootstrap呢?答案自然是肯定的,webpack有啥干不了的呀(大誤)[手動滑稽]

sass/less的兩套方案

bootstrap主要由兩部分組成:樣式和jQuery插件。這里要說的是樣式,bootstrap有less的方案,也有sass的方案,因此,也存在兩個loader分別對應這兩套方案:less <=> bootstrap-webpack 和 sass <=> bootstrap-loader

我個人慣用的是less,因此本文以bootstrap-webpack為例來介紹如何打造一個自定義的bootstrap。

開工了!

先引入全局的jQuery

眾所周知,bootstrap這貨指明是要全局的jQuery的,甭以為現在用webpack打包的就有什么突破了。引入全局jQuery的方法請看我之前的這篇文章《webpack多頁應用架構系列(四):老式jQuery插件還不能丟,怎么兼容?》(ProvidePlugin + expose-loader),我的腳手架項目Array-Huang/webpack-seed也是使用的這套方案。

如何加載bootstrap配置?

bootstrap-webpack提供一個默認選配下的bootstrap,不過默認的我要你何用(摔

好,言歸正題,我們首先需要新建兩個配置文件bootstrap.config.jsbootstrap.config.less,并將這倆文件放在同一級目錄下(像我就把業務代碼里用到的config全部丟到同一個目錄里了哈哈哈)。

因為每個頁面都需要,也只需要引用一次,因此我們可以找個每個頁面都會加載的公共模塊(用Array-Huang/webpack-seed來舉例就是src/public-resource/logic/common.page.js,我每個頁面都會加載這個js模塊)來加載bootstrap:

require('!!bootstrap-webpack!bootstrapConfig'); // bootstrapConfig是我在webpack配置文件中設好的alias,不設的話這里就填實際的路徑就好了

上文已經說到,bootstrap-webpack其實就是一個webpack的loader,所以這里是用loader的語法。需要注意的是,如果你在webpack配置文件中針對js文件設置了loader(比如說babel),那么在加載bootstrap-webpack的時候請在最前面加個!!,表示這個require語句忽略webpack配置文件中所有loader的配置,還有其它的用法,看自己需要哈:

adding ! to a request will disable configured preLoaders
adding !! to a request will disable all loaders specified in the configuration
adding -! to a request will disable configured preLoaders and loaders but not the postLoaders

如何配置bootstrap?

上文提到有兩個配置文件,bootstrap.config.jsbootstrap.config.less,顯然,它們的作用是不一樣的。

bootstrap.config.js

bootstrap.config.js的作用就是配置需要加載哪些組件的樣式和哪些jQuery插件,可配置的內容跟官網是一致的,官方給出這樣的例子:

module.exports = {
  scripts: {
    // add every bootstrap script you need
    'transition': true
  },
  styles: {
    // add every bootstrap style you need
    "mixins": true,

    "normalize": true,
    "print": true,

    "scaffolding": true,
    "type": true,
  }
};

當時我是一下子懵逼了,就這么幾個?完整的例子/文檔在哪里?后來終于被我找到默認的配置了,直接拿過來在上面改改就能用了:

var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
  styleLoader: ExtractTextPlugin.extract('css?minimize&-autoprefixer!postcss!less'),
  scripts: {
    transition: true,
    alert: true,
    button: true,
    carousel: true,
    collapse: true,
    dropdown: true,
    modal: true,
    tooltip: true,
    popover: true,
    scrollspy: true,
    tab: true,
    affix: true,
  },
  styles: {
    mixins: true,

    normalize: true,
    print: true,

    scaffolding: true,
    type: true,
    code: true,
    grid: true,
    tables: true,
    forms: true,
    buttons: true,

    'component-animations': true,
    glyphicons: false,
    dropdowns: true,
    'button-groups': true,
    'input-groups': true,
    navs: true,
    navbar: true,
    breadcrumbs: true,
    pagination: true,
    pager: true,
    labels: true,
    badges: true,
    jumbotron: true,
    thumbnails: true,
    alerts: true,
    'progress-bars': true,
    media: true,
    'list-group': true,
    panels: true,
    wells: true,
    close: true,

    modals: true,
    tooltip: true,
    popovers: true,
    carousel: true,

    utilities: true,
    'responsive-utilities': true,
  },
};

這里的scripts項就是jQuery插件了,而styles項則是樣式,可以分別對照著bootstrap英文版文檔來查看。

需要解釋的是styleLoader項,這表示用什么loader來加載bootstrap的樣式,相當于webpack配置文件中針對.less文件的loader配置項吧,這里我也是直接從webpack配置文件里抄過來的。

另外,由于我使用了iconfont作為圖標的解決方案,因此就去掉了glyphicons;如果你要使用glyphicons的話,請務必在webpack配置中設置好針對各類字體文件的loader配置,否則可是會報錯的哦。

bootstrap.config.less

bootstrap.config.less配置的是less變量,bootstarp官網上也有相同的配置,這里就不多做解釋了,直接放個官方例子:

@font-size-base: 24px;
@btn-default-color: #444;
@btn-default-bg: #eee;

需要注意的是,我一開始只用了bootstrap.config.js而沒建bootstrap.config.less,結果發現報錯了,還來建了個空的bootstrap.config.less就編譯成功了,因此,無論你有沒有配置less變量的需要,都請新建一個bootstrap.config.less

總結

至此,一個可自定義的bootstrap就出爐了,你想怎么折騰都行了,什么不用的插件不用的樣式,統統給它去掉,把體積減到最小,哈哈哈。

后話

此方案有個缺點:此方案相當于每次編譯項目時都把整個bootstrap編譯一遍,而bootstrap是一個龐大的庫,每次編譯都會耗費不少的時間,如果只是編譯一次也就算了,每次都要耗這時間那可真惡心呢。所以,我打算折騰一下看能不能有所改進,在這里先記錄下原始的方案,后面如果真能改進會繼續寫文的了哈。

示例代碼

諸位看本系列文章,搭配我在Github上的腳手架項目食用更佳哦(笑):Array-Huang/webpack-seedhttps://github.com/Array-Huang/webpack-seed)。

附系列文章目錄(同步更新)

本文首發于Array_Huang的技術博客——實用至上,非經作者同意,請勿轉載。
原文地址:https://segmentfault.com/a/1190000007043716
如果您對本系列文章感興趣,歡迎關注訂閱這里:https://segmentfault.com/blog/array_huang

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容