Webpack4.X重修之路 --- 基礎(chǔ)篇

前言

webpack3一路到webpack4,剛開始一直抱著搭起來能用的態(tài)度.直到開始工作,大大小小的項目接觸了四五個,慢慢有了一個適合自己使用的腳手架.在開發(fā)過程中有遇到很多不順手的地方:

  1. 由于項目需要,開發(fā)以及部署時的后臺ip地址經(jīng)常在變化,開發(fā)時會抽出一個單獨的js文件定義所有這些外部的地址,便于管理.但是在打包之后就被webpack打包了,如果要修改地址又要重新打包,過于繁瑣.

  2. 個人喜歡less,但是less不能自定義函數(shù),以及無法定義全局的變量.比如想在variable.less中定義頁面公用的一些變量,方便后期調(diào)整頁面布局.但是需要在每個用到這些變量的.vue文件中單獨引入,太過累贅.

慢慢的解決問題,直到我發(fā)現(xiàn)我的webpack.config.js居然有四五百行代碼,這太亂了.于是決定重新在構(gòu)造一個項目腳手架,進(jìn)行優(yōu)化.

重修之路

創(chuàng)建項目基礎(chǔ)結(jié)構(gòu),一步一步慢慢添加

├── dist                     // 打包后目錄
├── src
│   ├── assets           // 全局的靜態(tài)文件,無法打包時
│   │   └── img
│   ├── config          // 數(shù)據(jù)后臺IP地址配置文件
│   │   └── ip.config.js
│   └── index.js       // 入口文件
├── package.json
└── webpack.config.js   // webpack配置文件

先了解幾個webpack插件

  1. clean-webpack-plugin: 每個打包之前清理dist文件夾
  2. copy-webpack-plugin: 復(fù)制文件或者文件夾到打包目錄
  3. html-webpack-plugin: 生成html模板以及自動引入打包后文件

我們希望assets/下的文件原封不動的復(fù)制到dist/目錄下,比如有一些圖片webpack無法打包時,我們就在assets下新建一個img文件夾,把這些圖片放進(jìn)去,打包時copy-webpack-plugin就會自動就img整個文件夾復(fù)制到dist
對于config/,打包后我希望它一樣是在dist/config下.
然后我們需要在html文件中加入script標(biāo)簽引入dist/config目錄下所有的.js文件

  • 安裝
npm i -D copy-webpack-plugin clean-webpack-plugin html-webpack-plugin
  • 使用
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
...
    plugins: [
        new CleanWebpackPlugin(),
        new CopyWebpackPlugin([
            {from: 'src/config/*.js', to: 'config/', toType: 'dir', flatten: true},
            {from: 'src/assets/', toType: 'dir'}
        ]),
        new HtmlWebpackPlugin({
            inject: false,
            template: require('html-webpack-template'),
            title: '測試輸出',
            appMountId: 'app',
            meta: [
                {
                    name: 'viewport',
                    content: 'width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'
                }
            ],
            bodyHtmlSnippet: "<script src='config/ip.config.js'></script>"
        })
]
...
}
  • 說明

clean-webpack-plugin使用是非常簡單的,默認(rèn)就是刪除dist文件夾,安裝引入之后,直接在plugins實例化即可.

copy-webpack-plugin使用

  • from:定義操作目標(biāo)
  • to: 復(fù)制到dist文件夾下的哪里
  • toType: 類型, 文件或者文件夾`
  • flatten: 是否按照本來的目錄復(fù)制, 默認(rèn)是false

下面再說說最強(qiáng)大的html-webpack-plugin,會自動生成html模板,也可以以自己定義的html文件為模板

  • 必須的參數(shù)
    inject: false,
    template: html文件,如果是自己定義的則是文件所在路徑

  • 可選參數(shù)
    title: 標(biāo)題,
    appMountId: 插入的divid
    meta: meta選項
    headHtmlSnippet: 插入headhtml模板,這里我們需要插入config目錄下所有的js文件, 所以我們需要定義一個函數(shù),如果config目錄下文件多的話我們手動一個一個去加就太浪費時間了,而且效率太低,加一個就要改一次配置

/**
 * 獲取script標(biāo)簽字符串        
 * @param  {String} source    [源目標(biāo)目錄]
 * @param  {[String]} targetDir [生成的文件夾]
 * @return {[String]}           [指定文件夾下的js文件的script標(biāo)簽]
 */
function getConfigScript(source, targetDir) {
    let configFiles = fs.readdirSync(source, {});

    let jsFiles = configFiles.filter( file => {
        return file.indexOf('.js') !== -1;
    }) 

    let scripts = jsFiles.map( file => {
        return `<script src="${targetDir + file}"> </script>`
    })

    return scripts.join('\n');
}

html-webpack-pluginbodyHTMLSnippet

bodyHtmlSnippet: getConfigScript('./src/config', 'config/')
  • 打包一下,看看我們生成的是什么
├── config
│   └── ip.config.js
├── img
│   └── test.png
├── index.html
└── js
    └── app.bundle.js

看一下index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta content="ie=edge" http-equiv="x-ua-compatible">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>測試輸出</title>
    <script src="config/ip.config.js"> </script>
  </head>
  <body>
    <div id="app">
    </div>
    <script src="js/app.bundle.js" type="text/javascript"></script>
  </body>
</html>

到現(xiàn)在我們已經(jīng)成功實現(xiàn)了初始的基礎(chǔ)需求了.
更多html-webpack-plugin配置

但是我們使用webpack往往不止會用來打包js還有css,img等等,如果我們都寫在一個文件里的話代碼就會越來越多,到最后可讀性會越來越差,而且不利于閱讀以及再次復(fù)用,并且開發(fā)環(huán)境以及生產(chǎn)環(huán)境有一些配置是不用的,所以我們將不同的配置代碼拆開為dev以及prod,公用的定義為common.我們可以使用webpack-merge合并不同環(huán)境下的配置

  1. 新建一個script文件夾用來存放配置腳本, 將現(xiàn)在的webpack.config.js改為webpack.common.js, 新建webpack.dev.jswebpack.prod.js
  2. 修改npm啟動腳本
  "scripts": {
    "start": "webpack-dev-server --open --config script/webpack.dev.js",
    "build": "webpack --config script/webpack.prod.js"
  }

開發(fā)模式

  • 開啟devtoolsource-map便于調(diào)試
  • 使用webpack-dev-server
// webpack.dev.js
const merge = require('webpack-merge');
const common = require('./webpack.common.js');
const webpack = require('webpack');

module.exports = merge(common, {
    mode: 'development',
    output: {
        publicPath: '/'
    },
    devtool: 'source-map',
    devServer: {
        contentBase: './dist',
        host: '0.0.0.0',
        port: 8001,
        index: 'index.html',
        open: true,
        hot: true
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin()
    ]
})

生產(chǎn)模式

const merge = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = merge(common, {
    mode: 'production'
})

webpack生產(chǎn)模式下會自動對js文件進(jìn)行壓縮混淆,但是我們還希望對圖片以及css文件進(jìn)行處理.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捞烟,一起剝皮案震驚了整個濱河市避归,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)爆办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來课梳,“玉大人距辆,你說我怎么就攤上這事∧喝校” “怎么了跨算?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長椭懊。 經(jīng)常有香客問我诸蚕,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任背犯,我火速辦了婚禮坏瘩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漠魏。我一直安慰自己倔矾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布柱锹。 她就那樣靜靜地躺著哪自,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奕纫。 梳的紋絲不亂的頭發(fā)上提陶,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天烫沙,我揣著相機(jī)與錄音匹层,去河邊找鬼。 笑死锌蓄,一個胖子當(dāng)著我的面吹牛升筏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘸爽,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼您访,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剪决?” 一聲冷哼從身側(cè)響起灵汪,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柑潦,沒想到半個月后享言,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡渗鬼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年览露,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬胎。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡差牛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堰乔,到底是詐尸還是另有隱情偏化,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布镐侯,位于F島的核電站侦讨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搭伤,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一只怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怜俐,春花似錦身堡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至季稳,卻和暖如春擅这,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背景鼠。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工仲翎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铛漓。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓溯香,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浓恶。 傳聞我的和親對象是個殘疾皇子玫坛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345